开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
6 M: ?9 x" ^% K! w+ {( F* h# v" C9 L* z/ d2 a
  N1 U5 x, M6 R+ j6 s
最近在研究JS 做了一个简单的逻辑来播放声音
7 `' Q6 y* l" I' A7 g
  1. var pit = 1;//初始化音高(速度)8 Y/ d- L5 {% ?3 A, v( z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]" M8 ^" B$ S/ n; M  A9 T: k* T
  3. function create(ctx, state, train) {" {0 [9 _7 v, ?' c/ N
  4.     state.number = new Array();  j5 F5 R) z, M. g! N1 `7 f
  5.     state.soundsspeed = 0;//初始化速度0 v2 v4 k9 l& z) s0 \' Y6 _. a
  6.     state.speedsub = 0;
    3 J* L" G  h4 |5 ?7 Z; R
  7.     for(let i = 0; i < 100; i++){
    3 ]7 R3 n# r/ S) ]. |5 n
  8.         state.number[i]=0;//初始化数组3 e+ ?: O' z; W7 g3 ~1 ^# f
  9.     }
    3 J" Q  {4 @; Z5 f
  10. }; ^; O- \# _/ ]2 N
  11. 1 s( E9 V! P) z
  12. function render(ctx, state, train) {" ~. O) _. X5 |; b; d0 n5 [
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    4 f8 n& f+ [! `4 ~4 l
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    # e6 ]4 |; f4 h4 A$ ?3 Q- q
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    * }9 S! _4 B+ K: u
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差6 \) M3 j" q: b# `  l
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)* v5 q4 d0 z& w; M# H' c
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作8 a4 E# X$ V+ {& B6 X4 f5 ]7 i
  19.         for (let i = 0; i < train.trainCars(); i++) {( y4 F5 V  \' Z  G$ B3 G
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启4 y, i5 B) w8 T& T6 g& j6 y) O( s
  21.             if(state.speedsub<-1){//如果车辆减速/ q6 T9 U0 \8 Q8 d! i- g% t0 J
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : A8 I8 @, f: x5 _9 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);//更新返回时间 播放刹车声在转向架1
    ) c& z3 n& ^% U
  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
    : D2 ?* b# o! [
  25.             }else if(state.speedsub>1){//如果车辆加速
    4 |, D9 p9 b# _3 t
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    ; ^; h) |  n$ k- n' U
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声4 I& r% j7 P/ u& }# v
  28.             }
    8 |) V0 o: n: d0 e6 e
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声- G" G+ O; q" d3 j
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声1 Q; c8 g$ a! \- ]( U& V- v
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
      F) {( ]9 D2 S/ q& V4 _
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    2 V0 G% C9 o7 B* h! S
  33.             }
    ) w  f/ ]+ r2 y
  34.             if(train.speed()*20*3.6>5){
      A# h3 `1 D! ^/ r, X
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声5 L; l; b9 a/ P* i$ A- S
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    1 U/ c, S/ a) ^' H
  37.             }
    # p8 ^9 m2 r( o1 L8 A/ C! Q
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ; P+ d6 f& \; D  T! B5 `
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ; }2 c, p6 K% j; p
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ [: K$ r, R! j' e5 ~
  41.             }( E7 H/ T6 U. g7 C9 u  A* z; x3 |
  42.         }& g5 i* C1 L6 g! `- k
  43.     }
    2 X9 x% s/ N8 Z9 ^: R5 r7 ]1 n
  44.     state.soundsspeed = train.speed();//更新速度5 F; m' v* a) b& g, S6 l# g
  45.     for(let i=0;i<4;i++){
    " W/ R& ^$ q" ]' p" l
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ! E* ^' J. X8 Z( a( u7 g4 m; T& P
  47.     }
    $ O8 k$ c$ u  h8 l( w3 s+ U) ~
  48. }, M& B6 k% a+ y0 @! {* `% E
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    / S: m4 h. Y  _0 t& r
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间& g, k' w# g9 L+ {( w
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    2 |( e2 Y. [* R7 b5 q
  52.         nu = Timing.elapsed()+long;   //更新播放时间( L: [4 J) `4 _# z8 }
  53.     }# Y! M9 ]8 \9 W2 [5 d
  54.     return nu;//返回新的播放时间9 c( [7 q2 H) t( |* c4 e4 j
  55. }( e9 ^" y1 X# W: A) O4 @" e) J
  56. function grnn(min, max) {//随机小数
    3 K# i1 s: y7 j: |( a. U- D
  57.     return  Math.random()*(max-min)+min;" v% D* l7 F: r, x$ F, H* Q3 a9 Q
  58. }  r# Q' o6 o; x. p0 p/ G
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    0 J# P( b# q6 I9 y0 i$ b
  60.     // 获取列车从车库开出的距离+ S9 u: k( _7 Y3 U' a
  61.     let railProgress = train.railProgress();6 P7 H; O5 {+ [& w% n
  62.     // 获取当前轨道的索引
    " t& }7 h8 b# k0 K8 u0 S5 ?. y
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    7 D6 O: |4 F2 t2 [" T
  64.     // 检查当前轨道索引是否有效
    2 ~, R2 r$ O3 m2 s1 E) B  d
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {9 Q: W' d  N) X$ u
  66.         // 获取当前路径数据对象
    & Q* U/ g/ X" ?. G0 W! O
  67.         let currentPathData = train.path().get(currentRailIndex);
    8 ^2 p0 a" H. M+ Q2 M, K
  68.         // 获取当前轨道使用的自定义轨道名称
    ' O8 k( D/ b) t6 y0 @' R9 L
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    1 j: l/ w& l: I- c3 P( V5 s- c
  70.         return trackModelKey;' M/ T5 N+ Z) j! [( F# H
  71.     }
    % Q6 m6 F; K: P. `7 [
  72.     return null; // 或者是一个默认值" i: s, i4 L" u2 t
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错: _! h8 m! c3 O: p; i' b5 P
有事加我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
  ^3 O% G, f+ A: ?bve声音要方便一些吧,他有可视化可预览的编辑工具
/ M3 ~& E! k2 ]
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 # V3 O, g7 w5 T2 K
0 e/ [$ J, ?( X7 W) x
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 , _% I: U8 v, z: p! I4 i$ u
huliawsl 发表于 2024-5-17 21:124 b2 }! _. B/ I) w* E
相较于此,我还是认为bve格式会更简单

$ b3 Q2 l, B2 T$ {: ^/ g0 K🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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