开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
' o3 ?, i* l% z6 t8 L2 B- ^7 ~, l" Q  ^, a# X# N4 v

5 R+ \' H# m1 Z( d最近在研究JS 做了一个简单的逻辑来播放声音
7 q- ?/ f4 F6 @: G2 q; O& w
  1. var pit = 1;//初始化音高(速度)
    ' C/ Q  \+ f5 x; c' s
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]5 o# y: j4 [9 Q. \8 b
  3. function create(ctx, state, train) {5 {5 q- Y# O" p, Z# c! O- i9 R, c
  4.     state.number = new Array();1 e, s" @. V& Y! V# |0 h$ e
  5.     state.soundsspeed = 0;//初始化速度
    " V+ N2 d0 `* x) J& v, u
  6.     state.speedsub = 0;: ~" `6 g, P* ?
  7.     for(let i = 0; i < 100; i++){/ \" f; {) L5 C
  8.         state.number[i]=0;//初始化数组
    # g. t: N$ V% V: `0 ]
  9.     }
    + o2 `/ O3 e0 \! y5 k
  10. }3 Z7 z/ P, P; l# c$ E: |1 _) y
  11. / ]) W6 O: K9 e% F, ^
  12. function render(ctx, state, train) {6 c: C) c% N: _/ Z0 Y% A# A, {, s( }
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    2 t( C' R. y/ K
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    0 L/ q! N5 E; r% Z) ~0 f0 W
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    / a1 y7 c) V+ o1 @: |+ p7 h  D
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
      G1 K8 g; c3 `5 s, A
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)' }" J9 C1 h% b( l
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作" {9 p0 r' u0 P6 s+ L$ i+ z
  19.         for (let i = 0; i < train.trainCars(); i++) {4 }5 H6 o6 z) U+ Q& C* ~7 u% J7 M" b
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    # |1 J, B* ?# k9 Z6 r' i
  21.             if(state.speedsub<-1){//如果车辆减速. G+ E, R5 k" v' X' p( N
  22.                 ctx.setDebugInfo("shache",1);//记录刹车5 T2 {: |" O% ~) c+ b* S( F; d
  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 Y2 ]2 P% z' X: S5 I5 E# |: I
  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);//更新返回时间 播放刹车声在转向架2) D6 M- A& v. i" e. X' y
  25.             }else if(state.speedsub>1){//如果车辆加速
    ; u& R2 {+ q" t5 [+ Y% H( v
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 h5 b4 x1 N' T- g  w3 D9 t
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声  ^1 B5 ?' {+ [1 J
  28.             }7 H4 e6 p0 K% I0 t9 O7 D
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声3 o; s1 P$ a$ ?- f8 J$ k
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声) O) R! e3 x: u+ ?( ]5 T: g9 ~8 W6 h
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启- @+ ^8 p* o) p0 [( ^% r' Y5 Z
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右. o# ^# [, X- w. G6 \
  33.             }
    ( [( C' \& {- y1 O" T2 b
  34.             if(train.speed()*20*3.6>5){
    ( B2 a, `4 _7 x
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ' {; [* |% f$ W) y5 `6 o+ m
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声( r! T9 w* p$ Z8 j, [
  37.             }  H3 [2 O9 V+ @
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    0 R/ h: _6 F* H2 h
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ( C; ]' m- o& e, r8 P$ H
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ) I; v; c- z- c6 A
  41.             }
    ! c" K, B& _+ s4 p9 Q0 a
  42.         }. B; i9 U9 U' Z2 E1 f+ Z
  43.     }' C; J9 N+ Z* E4 V, q
  44.     state.soundsspeed = train.speed();//更新速度0 w( K0 e/ Y3 H! x! j6 v: _; o5 L5 w
  45.     for(let i=0;i<4;i++){
    ( }$ T' ^* l/ j1 Y0 W
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ) I  _$ t/ J% V8 F, d% T3 o
  47.     }
    % q5 N6 x" e. R2 a+ |- Z: w
  48. }
    1 i- m" V% U4 h# ^, t
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ! ?) Q, Q  u$ {
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
      @; @0 j# M1 u, S4 n. a' n$ ]8 w
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
      _* z1 k2 w: y: }9 n
  52.         nu = Timing.elapsed()+long;   //更新播放时间; n$ ^% G4 D) c0 \" A0 O
  53.     }
    * @1 b' o( o' X. T9 }) g
  54.     return nu;//返回新的播放时间* @: M; ]; g) A
  55. }  L: ?" \/ Z  h7 X! t2 y
  56. function grnn(min, max) {//随机小数6 V  F6 @- F! [. e' p
  57.     return  Math.random()*(max-min)+min;
    : p% ~! e" @! D2 O7 p* d+ N
  58. }3 Q* z; x) A. C6 m' @7 j# f
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
      c+ e( r  W' F* b3 S
  60.     // 获取列车从车库开出的距离% ]7 D+ T& U7 X& w& o  z" b
  61.     let railProgress = train.railProgress();" f) U8 P7 q# A( n7 h* X
  62.     // 获取当前轨道的索引$ |# ~  d/ |! v# J" w3 |/ ^
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);' K* K" `- x) T; f& ~
  64.     // 检查当前轨道索引是否有效- H' f9 {0 V5 O/ u  a, n) ]. q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {& O; k/ O/ V9 B4 [0 R+ {  h$ t
  66.         // 获取当前路径数据对象
    / j6 ]" B) d& D: W. X" T7 w- b& C
  67.         let currentPathData = train.path().get(currentRailIndex);& |& n% f3 e+ [9 W# i/ U( c
  68.         // 获取当前轨道使用的自定义轨道名称) m9 S7 W( ]* l- ^
  69.         let trackModelKey = currentPathData.rail.getModelKey();! J- o$ c/ b1 I0 C# K! b; T$ T
  70.         return trackModelKey;# M! t- @6 |) d) M: s. K- u  [! K
  71.     }
    5 f4 G" N$ ]( O$ E) \& R
  72.     return null; // 或者是一个默认值
    : f; K: g$ ~. Z8 H7 a/ I) L
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错: Y1 j" Q% c9 z+ `9 H
有事加我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:044 I  k9 E6 q! N( A3 D9 k
bve声音要方便一些吧,他有可视化可预览的编辑工具

. A2 N7 n0 {3 E8 g嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 4 Q% b; C) x, z* ~  b
% r4 L, w) C" _' W+ y
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 8 V& l0 N2 G& J; z" N+ Q* Z
huliawsl 发表于 2024-5-17 21:12/ M4 {& y: x% Y' Q% H) |9 E2 h9 n
相较于此,我还是认为bve格式会更简单
( `& N! C% C. t3 N% E) r& h
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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