开启左侧

给点播放声音的新思路

[复制链接]
Harlotte 作者认证 2024-5-17 06:00:22

还没有账号?赶快去注册吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 1 B" d$ D# E' b; j% k# ^' F
& J% P' A/ @- V

7 e6 Y$ r" W/ \最近在研究JS 做了一个简单的逻辑来播放声音4 [; J4 x8 v2 f
  1. var pit = 1;//初始化音高(速度)  P1 y: [  d6 d+ N  S4 O  Z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ) \" z+ W3 Y4 |* {  y
  3. function create(ctx, state, train) {
      K9 q% x# n' |7 u
  4.     state.number = new Array();
    ( ~+ P0 d( e  C1 H" ~
  5.     state.soundsspeed = 0;//初始化速度$ i. a' B# r7 m5 u5 B8 ]( y
  6.     state.speedsub = 0;. K3 |7 ?1 Z5 c! b( Z( ^. c
  7.     for(let i = 0; i < 100; i++){( X( ]! L. f; K& F1 }9 M
  8.         state.number[i]=0;//初始化数组& O# L6 s- K- V5 ]# K9 I0 j& d2 W7 R. \5 v
  9.     }+ x( F% e6 s/ e( j# ^+ x. H* T. ~1 x- d
  10. }/ a# ]4 Z# d" |$ {% I6 o

  11.   ^' Z/ P( J# n' w% B6 W
  12. function render(ctx, state, train) {
    " N8 N+ G5 i+ a9 ~1 Q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ; W- @" Q; k$ m3 _+ U; c* M# T
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)" ~# `) H2 t9 l- v
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    " |! x. ]0 u5 k! L4 y9 M# K( e" ]
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    6 T0 x. E2 f5 {
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ) M: s* K/ r; J6 _, \/ F  |+ ?
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ' F- {: B5 ]/ i; [+ ]3 u: ?2 j: J
  19.         for (let i = 0; i < train.trainCars(); i++) {8 J, |4 A* U7 Y0 u& A1 X: u
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启# _1 m* C0 ]7 \( b& M
  21.             if(state.speedsub<-1){//如果车辆减速
    1 t* U3 {" n* U, v/ F
  22.                 ctx.setDebugInfo("shache",1);//记录刹车& H+ r( q* ~. _2 r) T6 u3 S' ]
  23.                 state.number[0]=sound(ctx,"mtr:df5g_shache",i,soundspos.braking1,pit,state.number[0],16,0.03+train.speed()*20*3.6/800);//更新返回时间 播放刹车声在转向架15 A  j9 v" e; k' C" B- F
  24.                 state.number[0]=sound(ctx,"mtr:df5g_shache",i,soundspos.braking2,pit,state.number[0],16,0.03+train.speed()*20*3.6/800);//更新返回时间 播放刹车声在转向架29 w- c9 y; ^% d7 x
  25.             }else if(state.speedsub>1){//如果车辆加速( w6 q8 Z: z) i; C
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速# L" z, D- E* w' |
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声1 @" y+ B& Z+ V: U. K/ S
  28.             }
    ) b2 }5 M, ~2 G4 Q4 a  D! y
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    * q  R3 f5 f" A  X- F
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声! O0 C* T1 R2 m( s# y4 j$ Q/ a
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    2 S1 _/ G& w( a& ~" @5 s: e
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右+ ]! G/ W$ s9 N0 J
  33.             }! m! h1 B1 S4 r# j
  34.             if(train.speed()*20*3.6>5){
    ' t, R7 I5 E1 r6 x
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    " w  Q) \7 ]  ]
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    0 }9 {5 L5 v# G! V, w
  37.             }3 u3 v* _% N  M/ y. [/ G- T; ?
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    % V) e* F% [" ?: |! d4 |$ b: P* l$ ]  _
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    8 _# B& ]0 T" o: K
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
      Y* C- `! C- G
  41.             }8 |1 \0 m" ?. U6 p* i
  42.         }/ M* N5 B: y7 L0 r- `' A
  43.     }
    1 i/ Y; O/ ?) g
  44.     state.soundsspeed = train.speed();//更新速度
    . A4 s2 Q6 e! D1 p: [
  45.     for(let i=0;i<4;i++){
    ( r7 a1 G) ?  |: y" d' X
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    , u& j- Q. w  M$ q; X  |6 `, b
  47.     }
    . b& |  X+ @- c6 V8 o6 g. B3 n$ r
  48. }
    4 `7 v6 ^! o" ^7 b
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间" R# ^. @0 q3 p- w
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间7 r0 i3 j3 Z2 ]& o/ h  h5 [3 Q
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放% z/ T, E5 [$ |, _) X
  52.         nu = Timing.elapsed()+long;   //更新播放时间$ u  ]% q5 ^1 P. F/ Z/ s0 u& @
  53.     }
    : r! ~, H' }& h8 L+ \
  54.     return nu;//返回新的播放时间
    " ?) n. e. Z4 u6 s4 l0 |3 O4 v& [
  55. }7 I$ \2 ]/ ^4 t! i& Z% S
  56. function grnn(min, max) {//随机小数
    ( K" L& _3 E2 M' v( X8 V( r
  57.     return  Math.random()*(max-min)+min;
    % L" e$ ], O0 W. U2 E
  58. }1 ]) p& P/ _9 f
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的7 o3 i1 a! |# {0 K0 {. P" d, Y# Y
  60.     // 获取列车从车库开出的距离
    7 X$ Z8 i( ?! o9 M% W& M
  61.     let railProgress = train.railProgress();
    & X( G4 |- J3 e) s5 t6 x/ V
  62.     // 获取当前轨道的索引
    0 @$ k' t6 O3 y+ k
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);" A8 i+ z) c0 `7 y$ G. {2 A  F7 r) h* A
  64.     // 检查当前轨道索引是否有效/ Y' X! d4 x/ o0 O8 j, L# Q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {9 p7 z. a. t6 |: U) n7 Z
  66.         // 获取当前路径数据对象
    0 P: D9 U* j: A9 z7 E
  67.         let currentPathData = train.path().get(currentRailIndex);
    * B) u& ?% {4 D$ |6 B8 ~; W
  68.         // 获取当前轨道使用的自定义轨道名称& n  K2 ^, n2 g
  69.         let trackModelKey = currentPathData.rail.getModelKey();2 ~) V4 \- f( s+ o( H
  70.         return trackModelKey;0 ?; m  g8 O9 ~
  71.     }
    7 K. v6 h9 x/ @2 `- Y1 j
  72.     return null; // 或者是一个默认值
    * d0 X; y8 V% Y* B
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
4 Y2 L8 E3 N' d& s; p2 u
有事加我QQ: 3435494979
要什么名字 作者认证 2024-5-17 17:04:29
bve声音要方便一些吧,他有可视化可预览的编辑工具
LG STUDIO(原CLARSC)成员,制作MTR追加hmmsim/openbve列车及线路,如果有事请通过QQ联络
楼主 Harlotte 作者认证 2024-5-17 19:17:25
要什么名字 发表于 2024-5-17 17:04
  T2 O* K7 |+ }. g- d' m1 [" A% cbve声音要方便一些吧,他有可视化可预览的编辑工具
1 ^5 M- R; d" g/ Q: U! y
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 2 X. k2 Y8 U# k  {: `; n2 |% z4 K
" w$ ^" Z1 U" ?
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
9 n) `8 o+ ]! v; d
huliawsl 发表于 2024-5-17 21:125 f! {1 ~8 k# `! J$ I: I
相较于此,我还是认为bve格式会更简单

  ^$ u$ x) i, q5 N6 l( Y🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表