开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
  }$ Q6 P$ O, s/ O5 Y* n1 }, L: L; |' @8 _: W! `+ I2 ]8 I+ z+ Y

& J' }: T6 N. Z2 d2 |- _0 y5 F  {最近在研究JS 做了一个简单的逻辑来播放声音" T0 ?2 F  G/ ]4 [8 Y; ~
  1. var pit = 1;//初始化音高(速度)2 j, v+ u0 |; ~9 q+ h( X
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]4 k% X" D; m# \9 @8 g0 V/ c5 I
  3. function create(ctx, state, train) {
    " T+ W$ c8 ]# l9 |
  4.     state.number = new Array();
    6 b, |, F. I8 H" R% ?
  5.     state.soundsspeed = 0;//初始化速度1 r" D3 V" P# Z. R3 c1 v
  6.     state.speedsub = 0;
    $ Y' B- P/ o& Y9 e/ p6 X
  7.     for(let i = 0; i < 100; i++){
    1 A% G  G2 [; a
  8.         state.number[i]=0;//初始化数组* y. `' |0 X/ h! M6 b
  9.     }
    ( p# \8 \. G6 u# x$ K" K2 u
  10. }" c; x0 `# Y7 n: D' P
  11. 1 Z; N3 S5 c; ]3 u* F- F
  12. function render(ctx, state, train) {+ i" Q# e  l7 e) ]  T
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动& E# }& d" E- q: w  M2 m2 {. ~
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)# }& G# T) R* \! G2 G& Q
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    . t/ V8 ^4 ^8 k: h* _
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差8 D" y" M+ k: O- J# \0 w( _  }; T
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    % y+ m5 ]5 \, q+ `
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    $ ^- T" F+ G% V3 |; u, W* e
  19.         for (let i = 0; i < train.trainCars(); i++) {
    . w- L. Z( F' R
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启1 D9 {, w6 @; a, f0 X, a) O
  21.             if(state.speedsub<-1){//如果车辆减速
    & o5 s% P) h, y
  22.                 ctx.setDebugInfo("shache",1);//记录刹车# E1 [5 U" @, B8 z4 S; {) o
  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);//更新返回时间 播放刹车声在转向架17 g8 W$ h2 R- j; B/ |" \5 C* {
  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
    2 o& [) ~# ?& }7 }0 j
  25.             }else if(state.speedsub>1){//如果车辆加速
      U+ B' m- L* E/ ~0 J
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速2 ~- O, D8 [% \5 {
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声. j- K7 \! x$ J' \8 P
  28.             }
    , y; J& Q) U0 V2 e7 m. H
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声' {9 o- \6 b" v1 {6 A  ]
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    7 l! s* {7 j2 |$ S
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启( F" q5 z2 y* z1 ^  p0 l
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右; ]8 |0 i4 m) ?9 c. T; }- Z
  33.             }9 z2 H. s5 l! J: s4 ?
  34.             if(train.speed()*20*3.6>5){( m- O2 t' B0 t7 i/ l% C
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声  c0 Q# h7 c& ]. [9 P$ r  ?
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    & I6 W$ n  ~% Q; v3 T& I
  37.             }  T$ h+ v- v2 }+ p- p
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ( E3 H- V8 F' h2 |
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    3 W5 g' \, ]9 e
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    7 q8 d# d0 y' w: L. ?6 H% U
  41.             }( ^, ^+ M* z3 w. D; i4 W
  42.         }
    $ J+ E2 `( W/ i# P! Y3 b
  43.     }
    ' a! _' u; P6 ^; I! \9 h8 _$ S
  44.     state.soundsspeed = train.speed();//更新速度
    8 \' ^9 ]* J1 k  e5 m" q( @5 z* D' E
  45.     for(let i=0;i<4;i++){5 T9 a, h2 S2 A4 i' O8 U
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    2 p- L9 J) `. N  u% H/ ^% ^, s$ T- Q
  47.     }
    $ G# ]& A- s. [# W7 ], Y
  48. }$ E* K. T. l  |6 Q
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间* @; g2 ~" t4 y. T4 s/ i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; `( Q& a+ d* Z% K/ [9 V6 c' Z  X! W
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放" [; H7 l8 c. f" z& r
  52.         nu = Timing.elapsed()+long;   //更新播放时间: M! M6 d' ~: C* _
  53.     }0 o! G: u0 o% @
  54.     return nu;//返回新的播放时间2 W; m, Q& x2 Z( V) O3 m
  55. }3 _6 N' o4 q! U9 G/ K3 B' W, A! k) J
  56. function grnn(min, max) {//随机小数
    9 w! \; ]: B+ i, k: `$ G! u9 U
  57.     return  Math.random()*(max-min)+min;
    ( |5 H1 K3 W2 A- Q. y  u
  58. }6 C7 n/ \3 N9 }
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    4 s, F" b/ l$ _- [" }
  60.     // 获取列车从车库开出的距离
      m8 q. C4 Q* `9 W
  61.     let railProgress = train.railProgress();9 U4 j9 z; {% b- b5 E9 T6 R0 M
  62.     // 获取当前轨道的索引- Y9 _1 q* _0 I) e5 r9 o
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);8 k' q% R) U! {  D" D( k# T7 i% ~  d
  64.     // 检查当前轨道索引是否有效
    ( \! J% L/ A* _) k* J$ N
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {0 u' }) i9 F" `; [
  66.         // 获取当前路径数据对象
    ( s* ^8 m' |. s+ A# `) c. G
  67.         let currentPathData = train.path().get(currentRailIndex);/ |: j$ H$ d- m( Z! B
  68.         // 获取当前轨道使用的自定义轨道名称4 T4 u3 T, T$ A9 o: e
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    8 K* d& i0 W  e. T4 P* G
  70.         return trackModelKey;
    ( w1 h: F: |2 v# z/ M2 Y, k
  71.     }- A; D$ X$ d1 ?+ P3 }' _% G8 m
  72.     return null; // 或者是一个默认值( \) M2 `, Z& u( ^, d8 y) I4 w3 a) Q
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错6 @* N7 t: u2 B- 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. a% Z, m( _' _0 A( G; M
bve声音要方便一些吧,他有可视化可预览的编辑工具

. l* y6 Y8 \, B# T$ h嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
: H# a$ G4 d1 s; r6 y2 \
" e3 z& s, s$ d4 y7 S相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
6 }+ X# e! m5 ]$ q- O
huliawsl 发表于 2024-5-17 21:12
" b7 k# g1 f1 k+ M6 S) b" [相较于此,我还是认为bve格式会更简单

! b" B, d7 t- P4 f🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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