开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 & x2 }* {" G2 N( [! L! q$ O# o+ c2 J
4 f- `$ T$ Q, }: `" i
  m3 }% M: W2 C* m7 m; }( D! a
最近在研究JS 做了一个简单的逻辑来播放声音; R; S( p2 r$ T1 w0 o) ?4 h
  1. var pit = 1;//初始化音高(速度)( o% c% X3 A; s: K) m) [' L9 g% \
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]: h/ N! g. {3 x$ W. a) h5 c( m: h
  3. function create(ctx, state, train) {# L/ b* o5 q6 P( D8 c. o
  4.     state.number = new Array();. T; l/ c- E( T2 X6 ?+ b
  5.     state.soundsspeed = 0;//初始化速度- u: y  s6 n! G; o) d  x
  6.     state.speedsub = 0;
    " Z, ?+ m# K6 r1 s$ B* q
  7.     for(let i = 0; i < 100; i++){
    ! E8 G" W9 U$ ~1 P* `& T
  8.         state.number[i]=0;//初始化数组/ ?' w' Q* w7 U5 h
  9.     }5 T7 j* O5 `' p  I$ K) e
  10. }
      `$ n4 C* Z4 z9 x! x4 q

  11. " t* V. @1 b: a( c0 n
  12. function render(ctx, state, train) {0 d$ d" c0 g" m9 j8 ~6 q, Q8 q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    # C8 I" a5 ^: H4 Z6 {/ Z7 q7 o  a
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)% h5 P* i, ], q0 c. ^5 ?( v
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    & R) }; i% y8 d% J: d/ ^
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    : Q0 A* A' i- m( f8 ]" J/ M3 }
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)# E9 r( f5 h; Q- _$ X: E( M$ ]  D- `
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ! M* f  \( o: }' p. U6 ~/ u
  19.         for (let i = 0; i < train.trainCars(); i++) {% i8 N5 Y+ v; ?9 D" u
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ' \7 k. D% G. |4 H( I1 E3 i
  21.             if(state.speedsub<-1){//如果车辆减速9 `/ F# e; ~# t0 R' G, D3 a" I- P; i
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    1 u- T7 j7 ]. c: C# D9 b
  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, \0 Z! C5 {/ x2 v' m, a
  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
    # F5 t6 u5 O- b- }- Z# D9 Z
  25.             }else if(state.speedsub>1){//如果车辆加速; W1 \! G. Y5 [" x+ ?
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速. Q% C$ d& ~. C& f
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    $ ]* l% {+ ?7 u2 j+ d. h6 e
  28.             }
    ; B0 L* [: j) W& j  ]; x8 @
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    + _8 {/ a6 B# G3 r: F
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声, O/ s: Y( d* I
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    $ o3 T, K, |# m5 J4 r1 W/ I
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右! S  M( [9 U5 A" p$ q% z6 @
  33.             }1 l; d. S$ m6 `- ^: S
  34.             if(train.speed()*20*3.6>5){) l& R5 ?/ j. g+ Z* M; c; e
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    % O8 \8 i3 \% W9 b1 D0 E
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 D7 ^- K5 y5 a+ R0 F7 i
  37.             }
    # ]( O' [# h  r
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ) k$ O- g) a" t7 Z# D4 H0 l; A/ O6 x
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    - i8 E5 Y4 R' B9 k5 ?& J& Y
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    : e/ K0 l9 N; s1 e+ H, M
  41.             }
    2 |% z+ E7 T5 o$ U' Z/ x
  42.         }6 H* ?# x) O' L2 e8 a
  43.     }
    & ^2 a8 ?# J5 Y0 h* \9 [% m, D
  44.     state.soundsspeed = train.speed();//更新速度
    ) D& @/ x5 `2 p$ v4 H6 n
  45.     for(let i=0;i<4;i++){
    & j, V" t  x& z3 D
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ) f/ P0 [& x3 k! d
  47.     }
    4 D  B% Q  y; o3 {/ t5 W$ T
  48. }" A, W$ L8 J& p; W$ k/ \
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    + V" a1 Z' a+ C- Q: E3 U- T3 {9 Y4 g
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间  y+ R3 ~7 s- i+ X7 s2 y
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放1 d# ?! k# f# W5 E& t1 u6 Q2 y
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ; d  |2 S5 B! F, G, L. q( K4 u; K  d
  53.     }
    ) d6 O" j; g  j2 n. G! h' @
  54.     return nu;//返回新的播放时间
    ! _1 g5 W  N& R2 i, Z* b$ h1 ^) [; [/ F
  55. }
    6 \' b$ Q+ P7 D0 N
  56. function grnn(min, max) {//随机小数% f% L" J4 y- c
  57.     return  Math.random()*(max-min)+min;* w" I: r5 D5 P# n2 d& r$ a
  58. }
    7 q- w) R+ m' c  q% }0 I; O6 w
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ( |8 ~# e$ B) d! H* H$ V! F
  60.     // 获取列车从车库开出的距离
    " V3 f0 r. i8 n
  61.     let railProgress = train.railProgress();; Z% L, n% }( L
  62.     // 获取当前轨道的索引
      b: T' H- M/ d$ h- s( b" {
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);: `7 t- Q+ H5 v/ R! H2 }
  64.     // 检查当前轨道索引是否有效: `0 ~$ B3 |, t2 I  F; s8 }
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    * v( m/ b: i5 c- ?1 H
  66.         // 获取当前路径数据对象5 T0 C" Z2 j0 s3 ]0 x6 ~' H
  67.         let currentPathData = train.path().get(currentRailIndex);
    " N. y$ e) b) b+ c9 @/ ]" @2 c. K
  68.         // 获取当前轨道使用的自定义轨道名称) m* O( d$ q' B- q* m' Q, L) M
  69.         let trackModelKey = currentPathData.rail.getModelKey();0 I1 @9 {4 A9 ^/ V! ~+ h4 f+ u
  70.         return trackModelKey;
    ! d2 ]8 `; L- S6 S; H% j/ B7 P
  71.     }
    ) w6 I3 G$ f4 I3 o0 g1 a
  72.     return null; // 或者是一个默认值" r5 v' b4 ?8 M4 M+ B
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错; `# W$ Z7 D8 B& B& j
有事加我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
. V3 S( C8 O1 z% w* @3 \) Qbve声音要方便一些吧,他有可视化可预览的编辑工具
# K2 w; U) v' j( p
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 - P, b1 M: K0 m  @1 g/ w) ?
- {  H: Q2 N. z& ~  v
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
! L  b- P$ _* ~# w
huliawsl 发表于 2024-5-17 21:12; d; c4 K4 ~% n
相较于此,我还是认为bve格式会更简单
2 q, C) H4 A$ E$ ?. l# K/ o% L
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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