开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
" m, \# m; y' g/ M( V
( K, m$ w4 f! K8 t$ i# Q# G/ d- T' L
最近在研究JS 做了一个简单的逻辑来播放声音
0 X4 R3 o% f# H& n* B. z
  1. var pit = 1;//初始化音高(速度)- d( f. y1 j* s3 a4 d- U
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ; d: J# b6 t+ f+ z0 `+ y* P( U  r
  3. function create(ctx, state, train) {
    / ?' W/ b8 O9 Z/ _+ w2 H
  4.     state.number = new Array();3 ^( B( h6 P+ C! j/ u' s
  5.     state.soundsspeed = 0;//初始化速度
    8 R3 M, t! M: o5 P- ^) j
  6.     state.speedsub = 0;5 I; D8 D3 a6 B2 h$ b' M8 ]% Q
  7.     for(let i = 0; i < 100; i++){
    2 s5 a# H* _2 p! r! @, `' F( D
  8.         state.number[i]=0;//初始化数组  V1 [# _3 v2 @  J8 w+ L' {, J
  9.     }
    ( n% n! y+ J* T+ S4 r$ l
  10. }
    ( c) e: U* b- ]6 s

  11. $ A& J5 `4 I2 Y0 U. A7 J# j
  12. function render(ctx, state, train) {
    2 `, e. I& i$ ?' x* X8 z, p
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动& u  o1 n( q) u% p0 p
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)" \. b  u: f- Q0 K" ?6 `
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    0 o; w" b. ~6 T. _5 e
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    8 K, M+ h+ u) w  a5 y
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ' G3 y8 S) t  d: q2 y. k* C
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    # M; Q5 q9 o' z/ o, L- F& f% j
  19.         for (let i = 0; i < train.trainCars(); i++) {/ G( [" W2 J( L
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启/ V7 {6 n6 p5 ?* v
  21.             if(state.speedsub<-1){//如果车辆减速  l% d/ J6 u; P9 C- \& Z
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    8 z% r/ t4 }3 E2 l9 W
  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
    * n7 M) i  L9 ]' N$ M5 z7 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, M  {( V0 n1 P1 `; v+ a2 R$ R
  25.             }else if(state.speedsub>1){//如果车辆加速
    8 B: w0 U# [) N+ ~) @  g& n4 |
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    5 I% z- T* F' M, G: }: `7 ~) B
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声  f5 d  {6 T- |+ q
  28.             }. a! ~1 ^/ n: N8 g9 n1 I
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    5 L8 \, g. c9 _# N/ d
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    # K4 Y0 M' S8 L( ^7 N
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ) M( K. U$ B# E% k+ b
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    + r$ Z$ y3 {; U' G. i
  33.             }) `) z  k/ p9 e( a8 H( C
  34.             if(train.speed()*20*3.6>5){, Z$ _4 ~, {6 C) N- D. ~/ U# c) m
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    0 A$ S" b: `0 C5 b' w
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ( f/ l% f  n% a2 G6 r1 B2 E5 o- P, I' c
  37.             }
    6 Q% P# D: q: H" p
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ) Q3 X) S8 O: L
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    1 _9 x8 N  w% ?+ @
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声3 O! X0 D- b4 E
  41.             }
    2 |' E6 _1 e- D8 Z1 q/ I$ E' v& l
  42.         }
    / j8 {* D9 {% d
  43.     }
    7 b. l* I0 v1 k& ]$ O6 l
  44.     state.soundsspeed = train.speed();//更新速度: d6 d: ^$ j2 d9 K& G8 W
  45.     for(let i=0;i<4;i++){* l: }$ l7 l! {( _# x: ?
  46.         ctx.setDebugInfo(i+"=",state.number[i]);( M+ U% J" [- h" X) K' e; G
  47.     }
    5 w8 O" @: r2 r  g# x: B
  48. }1 N2 y; |( g( x+ K& E  L! }, N3 r% X
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间" i( d! T+ i5 j7 y4 w8 _+ Y2 N+ i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    & }4 G. t* b) h% v, K) ^+ L5 r
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
      E# T( q" @) X& J) u. N" `
  52.         nu = Timing.elapsed()+long;   //更新播放时间& h  [5 m5 c3 W1 k, @/ ^
  53.     }
    ( r4 [2 {- \5 G; `# G6 B9 l
  54.     return nu;//返回新的播放时间5 b' p! Z: z9 T- ^8 j
  55. }+ a& P6 L2 ~4 ^* _" j
  56. function grnn(min, max) {//随机小数& t3 G7 d0 f' u- B5 e! M( b
  57.     return  Math.random()*(max-min)+min;
    9 p- B. N# ^+ i. j" w& {5 L$ G
  58. }
    ; U. ]5 T' Y% r
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的5 @  Q" x' {* o0 f& `, {" B) K/ _
  60.     // 获取列车从车库开出的距离% @. `2 j1 c3 X5 N0 [8 {
  61.     let railProgress = train.railProgress();
    / [' T" r7 |/ m7 h: A$ H  K
  62.     // 获取当前轨道的索引
    $ Q7 S& V4 O; S2 A% x  F
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);2 e; h+ D1 m1 F8 T' m& x( C
  64.     // 检查当前轨道索引是否有效# Y7 j% H$ W! l; v4 u' U' {* \
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {' [5 b' R, M3 a& N) R9 ^
  66.         // 获取当前路径数据对象
    ! \4 i8 W7 n: t2 R# }7 Y
  67.         let currentPathData = train.path().get(currentRailIndex);
    , e1 u$ Z3 w% o% N6 `9 S7 x4 _! U8 L
  68.         // 获取当前轨道使用的自定义轨道名称
    ; P' Z0 H2 i  U2 H& Q$ t
  69.         let trackModelKey = currentPathData.rail.getModelKey();0 A+ c7 |7 M" i+ w) q
  70.         return trackModelKey;
    ' A- D& t: o9 o9 W8 @4 G
  71.     }
    # n+ O; h$ N& T7 N* t( H9 i1 R* n
  72.     return null; // 或者是一个默认值1 e, Q" {0 \, Y2 v' p+ V" l
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错/ y( Z' E! I$ I+ T5 F
有事加我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
+ V. ]: U. J  m0 L& i. \: d. wbve声音要方便一些吧,他有可视化可预览的编辑工具
) i" E) ?8 j9 P
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 & H' a. U" |7 U; w; @* z" y+ R
5 [( N, }2 u. h$ y7 j; Z
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ! a0 O; \7 t: `2 G! C- p5 W0 T8 F0 c
huliawsl 发表于 2024-5-17 21:124 e' f" r' u+ T9 Y& z. S
相较于此,我还是认为bve格式会更简单

: Z  x" Z2 K1 p3 D) h. Y) _🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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