开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
* h( [) D/ y9 y$ E' @% U+ O' k, z* t5 {. N- J' p; A

9 `: D+ n. m4 O0 u; ~4 G6 Z最近在研究JS 做了一个简单的逻辑来播放声音$ e; D  ~- g. D$ \+ B$ J3 m6 X
  1. var pit = 1;//初始化音高(速度)
    2 i2 T2 v# n; Y' Y
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    * f$ U. H8 y" [* v4 e  v
  3. function create(ctx, state, train) {/ C8 H2 |1 k% L3 p5 V4 K0 Y, X& Z
  4.     state.number = new Array();
    & b% B6 f* x  S0 u
  5.     state.soundsspeed = 0;//初始化速度
    3 J* `/ ^* h1 W  d: C
  6.     state.speedsub = 0;
    * r9 X$ T  `3 Z" H( {# X* g
  7.     for(let i = 0; i < 100; i++){* F. ?) p  J  \$ N6 I/ P$ w* I/ ~0 Q
  8.         state.number[i]=0;//初始化数组
    9 R6 c  X1 s5 V) ~0 C) o0 Q# B
  9.     }
    # L7 R4 o3 q2 t: U
  10. }7 [/ n* S( D* w
  11. : E9 n# w* D0 J" L+ Y1 L
  12. function render(ctx, state, train) {  ~% J' |$ b; Y; P
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    5 Y& |" V( A4 t7 V% h1 k/ \
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)( U9 }! r& `& E/ P
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    % K7 L! R3 P* C: K
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差# m0 L, g* v; ]5 w: u
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    " X- U6 r9 s4 N) V
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作" `- a* n6 K1 |/ Y) K2 a$ e: U4 r3 @
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ( ^! X+ }7 |# ~: G* U) h/ Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! c  _* `) g* y0 e! ~1 _8 i
  21.             if(state.speedsub<-1){//如果车辆减速  P: }( b0 v# y( N" E
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    8 F; @- e" R+ @7 U( ?5 l4 }" l
  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);//更新返回时间 播放刹车声在转向架1
    4 L/ a3 P8 `( m! A7 g, q4 L
  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 N0 ^9 T7 ]) l* a0 f
  25.             }else if(state.speedsub>1){//如果车辆加速+ X) }9 l+ q5 n' Q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    * l6 G+ g- `2 T7 q; J9 M% y3 s1 I
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声% g- y0 j$ c: J  O1 M
  28.             }3 ^) [. W4 l- `5 Z( [* O2 {4 T, T$ e3 @
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声5 I8 j8 F% @! u% M2 r
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声0 A- D5 m7 k+ X5 Y% Q
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    , `- F- u* d$ D
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右. q8 v8 e8 Y+ A( X5 b4 y5 i: D7 U/ Q
  33.             }
    & V8 P% C: G; b- |
  34.             if(train.speed()*20*3.6>5){
    9 h& C' K; v( y( q, U
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ; y0 J7 C& Z, B3 ]$ E5 {9 ?
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声' y$ y$ m4 ^9 h0 _' v2 A# J
  37.             }0 _9 S7 K# g2 g* V; l$ o+ o
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ! i% r- ]8 F1 X; I
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声: H" i: L0 B& g  J9 X9 {4 E( q7 E
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    / D/ A% P' f% O1 B. L$ f
  41.             }
    , j$ k1 j" F1 k4 L- q" l; _2 N, P: D
  42.         }5 Y( ?0 D! p7 S0 N  x
  43.     }
    " ?$ C4 X. ]1 s0 Z% h! g
  44.     state.soundsspeed = train.speed();//更新速度: {  N; W5 N3 s
  45.     for(let i=0;i<4;i++){" M3 \) j4 V  ]# ^
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    # G# I  D+ s5 u
  47.     }
    ! v: W+ A9 j/ F% u! r
  48. }. Z' {& N$ j* G8 b1 x
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间% D% Q" `8 r2 y9 r
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ( \  ^5 D+ e1 @8 d
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放( y9 g; ], Y0 c, G. a1 A
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    # [7 u* ?/ L2 B; N- G
  53.     }
    3 g( S5 f! ?5 b/ W. N$ a
  54.     return nu;//返回新的播放时间
    1 _- X$ h+ n% E4 \8 m& E5 {: T. \
  55. }8 P! l  }5 g" y- d, v8 F3 @: u
  56. function grnn(min, max) {//随机小数
    ! P; D8 ]) W: U, _( A9 ~8 @
  57.     return  Math.random()*(max-min)+min;. q$ k. L6 r; E' @8 K9 B" M1 z) A
  58. }
    3 _7 p7 z5 u% \4 W7 F) x9 p
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的$ E, K4 X5 d9 p
  60.     // 获取列车从车库开出的距离
    6 p, g% ~$ b, }
  61.     let railProgress = train.railProgress();: k8 X; p) ]6 k% O& G3 t
  62.     // 获取当前轨道的索引1 r: L  E0 n' ?7 W: o0 {
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);- ]1 k# I' V+ B/ N
  64.     // 检查当前轨道索引是否有效% P) G. o" f/ q6 N) y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {4 N- Q( J9 K: u( U# U
  66.         // 获取当前路径数据对象
    $ M/ S+ m- h! V
  67.         let currentPathData = train.path().get(currentRailIndex);
    5 A. [" Z6 I3 o9 S  c2 T. B
  68.         // 获取当前轨道使用的自定义轨道名称. w2 u  J" H; }
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    0 z; w! t/ t" M4 j/ ]
  70.         return trackModelKey;
    ; k. _  ?- Z5 b
  71.     }! E# L* i+ ]+ o
  72.     return null; // 或者是一个默认值
    5 _% a- v6 ~1 O4 v: y
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
$ B9 Z. T% G% I; T' z8 R) N$ D
有事加我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: J5 d( a$ I# o
bve声音要方便一些吧,他有可视化可预览的编辑工具
* a( {" ]* ~) ^+ e
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 4 ~1 v- v2 j3 D, z) Z
) Y. z1 D1 J4 b* b9 u
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 6 A) f5 q$ \- Z1 {) o
huliawsl 发表于 2024-5-17 21:12
' d! Q0 I! o% W8 Q" c: S5 A& A相较于此,我还是认为bve格式会更简单
& ?" w+ N  N8 e2 F: e$ P3 u8 W7 p8 w
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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