开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 4 U: y6 h- H3 c; q

1 r  B7 B( B) J+ ]6 {; B1 w* |
. D& c9 i( `( I# o, t最近在研究JS 做了一个简单的逻辑来播放声音6 o5 M; K$ C) \" h) b
  1. var pit = 1;//初始化音高(速度)
    # Y% E6 z3 G1 j4 [9 ~
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    8 V# H" F- o1 }2 _" J* J0 W. L- w1 U
  3. function create(ctx, state, train) {
    3 ^& I3 }" j7 b6 v7 k8 S
  4.     state.number = new Array();, L7 f# q3 Z+ ?+ E) w
  5.     state.soundsspeed = 0;//初始化速度0 h! B. h  i3 L  l  Q
  6.     state.speedsub = 0;
    1 D7 X. W+ B8 X- z
  7.     for(let i = 0; i < 100; i++){7 E5 d, R4 p, Q2 `
  8.         state.number[i]=0;//初始化数组
    $ ^; w! A3 @( r) n' [. `
  9.     }6 J5 q7 D. D" x4 e, A/ ~1 E
  10. }
    ) S, y3 y9 y/ ?. r

  11. + I0 Z: Q' o7 a9 t; M
  12. function render(ctx, state, train) {* X( ?1 v4 u: A9 Y. W- z" Q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ! r1 l4 E$ x; D; t' |6 s
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    5 ^+ N6 ], x* I5 B8 L3 W2 v+ P# |
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    6 H" e7 y& B0 Q4 D& u
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    8 j  H' H) h  N0 S0 W2 z: X4 L
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    1 ~# ?+ P  e- S$ A4 Z/ ~
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    + g: ?4 g. v; @/ ^' q
  19.         for (let i = 0; i < train.trainCars(); i++) {
    7 ]2 N  l3 D, @, c  O6 m4 C
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启8 m: k9 x( V2 s3 a$ T
  21.             if(state.speedsub<-1){//如果车辆减速
    2 w/ g2 W3 e- d9 F0 O9 v7 h& B
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    ! p) I) @7 H8 J' B6 ^
  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
    6 ?, n' ]; Z, `2 P' b1 s/ b
  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- z$ M- `1 Y8 f/ @! }) m" v8 X) B
  25.             }else if(state.speedsub>1){//如果车辆加速0 X$ F/ M7 H$ l1 K" u
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速) j& c: o, r2 M3 R3 r8 z
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声, @) Z1 w8 ^* W* K& y0 B
  28.             }
    + B; o+ V+ G) \! H( H. o
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    7 D+ T, i  D0 w% c. h1 w) V# F9 @
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声4 K) l* z0 J, F5 [; {) r
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启2 s8 A# W( z0 j1 l/ ^% _
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ G  ]4 |, D, R: A* _3 j. j0 J
  33.             }
    / ]2 j. g0 {( K
  34.             if(train.speed()*20*3.6>5){
    ; g" ^( p, O+ ?( b$ D
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声$ V: d  o  r1 O4 l
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声( p* v. S  {0 k
  37.             }4 |3 i0 v# S7 I5 U+ _/ B
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){) O$ f1 y/ F6 z  q  }
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ( m; d4 a! @( `1 [6 O+ z( @; \
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    " a3 q" L1 F3 T! T0 E  T
  41.             }% p4 p* |) j5 m  _2 o8 _: ^' b
  42.         }
    ; j/ h2 g% q; [1 ?+ g( G& ?1 U
  43.     }
    7 I- Q7 C1 D& `) L7 W+ \
  44.     state.soundsspeed = train.speed();//更新速度6 f+ O& E' O" l5 K: y, \
  45.     for(let i=0;i<4;i++){
      F  ~) w9 ^0 I2 ^# X
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    $ E9 U7 \4 e+ V
  47.     }8 H4 z+ f+ k! t5 Z7 I( b
  48. }
    4 h1 r- Z5 `7 q
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    $ D( P* `# V% m7 H9 @0 S
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间1 f! Y3 B; o, f) N2 x7 d
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    $ }; L6 E8 {9 \: {+ c
  52.         nu = Timing.elapsed()+long;   //更新播放时间' d, q0 c6 M' f, ~# s: V
  53.     }
    3 S/ s" F. u3 t" p
  54.     return nu;//返回新的播放时间
    0 ?( d* Y" ^& r1 `* [
  55. }
    7 {1 P3 E" d& H' {: a4 W2 I
  56. function grnn(min, max) {//随机小数: C/ P4 f& y7 A3 T2 ]5 Q! ?! l" e
  57.     return  Math.random()*(max-min)+min;
    , Z$ N7 K5 \5 ~
  58. }) ]0 H. D2 j. x% X
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    2 ]7 x' @. |* t5 i
  60.     // 获取列车从车库开出的距离
    5 r3 S8 p9 o$ {; {
  61.     let railProgress = train.railProgress();
    * l, \+ i( B1 P' x2 e( _
  62.     // 获取当前轨道的索引
    , S- ?- N, O, b. U. P8 Y  w
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);, Q4 ^5 G: ^& v' V
  64.     // 检查当前轨道索引是否有效
    ( h* L1 l7 b7 T1 Q5 M9 D
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ! _6 n9 S$ m: ^6 Z! @% |
  66.         // 获取当前路径数据对象
    , h" {9 Y3 \- y  G  f
  67.         let currentPathData = train.path().get(currentRailIndex);
      @6 [0 k$ h% G! o
  68.         // 获取当前轨道使用的自定义轨道名称7 [: m8 @/ `  l3 a2 N+ X  A5 }
  69.         let trackModelKey = currentPathData.rail.getModelKey();1 p1 z& K: k+ d: D' }1 K* s6 }
  70.         return trackModelKey;; j9 }2 \4 v* ?2 s
  71.     }
    0 S+ f7 ?7 c( G2 }
  72.     return null; // 或者是一个默认值, s+ r  S& F& B1 c% v" I, ^
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
0 U1 s( {# s  O4 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
- B5 A5 P% t- Bbve声音要方便一些吧,他有可视化可预览的编辑工具
# Q5 w- @* F9 f( g# Y# r
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
; n) [) Q* P% {
# v% z7 p' R) Y- u! a6 s相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 1 z! ^* Z5 g# q
huliawsl 发表于 2024-5-17 21:121 r4 r6 Q9 `) u- Q! ]9 J
相较于此,我还是认为bve格式会更简单

9 A9 c* u. l8 ~🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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