开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 & V7 X4 N) }; q, T
+ _9 u) J' I" q( h' K6 s& w
6 x1 A/ U& F9 M4 L- c+ Q  B- W! `
最近在研究JS 做了一个简单的逻辑来播放声音
0 R/ d$ ~. Y( t- T$ {; p
  1. var pit = 1;//初始化音高(速度)
    # c9 ?5 o* X7 z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ! e. D6 Z8 c! B& p+ m- Q( A, {
  3. function create(ctx, state, train) {! a( Z' o( @( f7 Z6 G
  4.     state.number = new Array();
    / c7 n) f: ]1 G8 f: p0 o8 D
  5.     state.soundsspeed = 0;//初始化速度9 G: h8 a# O2 p
  6.     state.speedsub = 0;
    ! Q* w7 E2 R3 p& P; l; ^
  7.     for(let i = 0; i < 100; i++){
    + [1 n) C; Y8 n$ J
  8.         state.number[i]=0;//初始化数组
      _* x7 t! Y) [7 P) p+ N* h; ?& h
  9.     }3 p" U1 P, X  V: k4 ^, C) k
  10. }4 B! ?+ [6 H7 ?

  11. 8 l) ?, \8 U' {) K$ W
  12. function render(ctx, state, train) {% i. k0 O" Q* D. g4 T3 [- I
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动: h& }: t- y( i, R+ ]1 c
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)/ T$ y) o6 y5 @
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    2 R' p  l" v2 F2 v7 v
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    " ?1 A6 {# B3 T4 Q- Z
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)( O7 L2 r9 \9 p, N7 h
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作/ D( r! u* B6 y5 l- d3 ~/ A
  19.         for (let i = 0; i < train.trainCars(); i++) {
    0 A5 m- m7 S( e( |
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    6 l" I) r8 }" w4 H
  21.             if(state.speedsub<-1){//如果车辆减速5 M7 \, p0 M8 |) |0 E! w: P6 n
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    & a+ v8 r0 ~$ ]9 e* T9 }$ n6 O  j: M
  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
    " Y( @0 x, q2 v9 i6 J
  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* V4 ?# ~; F' b
  25.             }else if(state.speedsub>1){//如果车辆加速
    % r4 ~7 K% P5 Z6 p
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速& c1 ?$ T$ |8 S- l3 @
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声$ _- j2 ~6 Y* X0 f+ L* X( y7 M
  28.             }. A2 j6 A* J4 d6 s# o
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    $ n# |+ \9 i) @
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    8 L0 U8 j9 }8 q/ A
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
      s# }0 Z* G- w# R
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ T# w! d# s2 F2 h9 V
  33.             }0 d- l9 k/ R, H
  34.             if(train.speed()*20*3.6>5){
    ! E% s: x9 S" @1 r+ s5 S& b. L
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声0 I* ~5 R' S5 a6 \: r
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    " U: v/ x8 _8 H, m
  37.             }
    3 Y+ [7 G; R+ q, s8 l
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    $ p& C6 w, G+ L0 c9 P/ O5 l
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    . d+ u" e+ h' X! s( A
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    / a, s  r' Z1 ]- q0 ~! O2 O# z
  41.             }% d- Q1 n9 }' @
  42.         }
    ; J) u7 g% _6 x! Q* L
  43.     }
    - O4 \' j$ S3 d, a# B
  44.     state.soundsspeed = train.speed();//更新速度6 r: E6 O1 _. z  N% c) W5 ]# z
  45.     for(let i=0;i<4;i++){2 b" d. @$ o9 Z, z3 h
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    , c' K" q6 Z. f$ `
  47.     }
    7 p; j) s$ P$ N* ^; r
  48. }" q/ F# U) b( \# w; @
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    6 r# q2 c; G0 W! _, x  F' c
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    2 c! G; a# Y" b/ A+ @
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
      a; @' M* Y+ H1 f8 E
  52.         nu = Timing.elapsed()+long;   //更新播放时间  _: y% a) X- S
  53.     }
      c* B, g( h3 O/ e
  54.     return nu;//返回新的播放时间, l! ]$ H- l5 c7 b
  55. }- [9 N+ S4 x* `% u
  56. function grnn(min, max) {//随机小数; z9 i3 Z( N8 _' e
  57.     return  Math.random()*(max-min)+min;2 E0 t7 b; K; h: k8 e: O
  58. }
    2 x# R$ [3 v/ s# U
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
      ?9 Q3 |7 \# `7 B: U
  60.     // 获取列车从车库开出的距离" d  o6 Q& n/ t% V
  61.     let railProgress = train.railProgress();
    # \" L  |+ D8 d' Q. m- e5 W
  62.     // 获取当前轨道的索引5 E0 g1 C$ j2 m3 `
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    # g- p. Q* ]3 t. J: t- a; h( D
  64.     // 检查当前轨道索引是否有效" T$ [; }0 t: Q2 Z6 h5 m: _
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
      O- X: M+ g" n% n: D- |3 \$ N
  66.         // 获取当前路径数据对象% [. B& ^/ F9 P. o$ h+ n* u& V
  67.         let currentPathData = train.path().get(currentRailIndex);7 @. w6 u# q8 j1 [+ ~3 J8 o0 s7 s
  68.         // 获取当前轨道使用的自定义轨道名称- V8 f) {% f* M7 n9 V$ S
  69.         let trackModelKey = currentPathData.rail.getModelKey();, R3 O# Q+ M: z% [5 B; j
  70.         return trackModelKey;
      {3 H. E4 s. B2 |  k2 w+ q1 f8 Z$ U
  71.     }5 o) F& A; U1 A
  72.     return null; // 或者是一个默认值
    ) ~+ u2 p1 i/ n8 b+ y
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
7 {, F2 T0 [+ f% 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:041 O# l3 r: o% ^7 ^0 Q5 S
bve声音要方便一些吧,他有可视化可预览的编辑工具

9 t. _1 s0 G, P# p& `- s嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
( L3 u5 `  r6 Y2 \6 x8 c2 n
8 A' p& ]* ^$ K+ s& ~/ p2 @相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 $ [: F( T) V, Y0 C7 P! S' m2 D" T
huliawsl 发表于 2024-5-17 21:12" B' A8 l$ k! x4 M! t
相较于此,我还是认为bve格式会更简单
( f: d+ ^" @+ r+ q9 q+ {* A
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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