开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 . G3 L$ r9 w9 S/ _6 ?# K

  O2 x+ Z' L! ]5 g+ G& v! I( t  o4 v2 l1 G, f, e
最近在研究JS 做了一个简单的逻辑来播放声音) ?. Q' T( t- B& I( q/ L" y" U0 V
  1. var pit = 1;//初始化音高(速度)6 t1 G! L$ L! f5 X% |8 R' ]
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    : x/ J& }6 T1 u* t3 v
  3. function create(ctx, state, train) {9 U6 q- Q( C' L! n# I
  4.     state.number = new Array();
    8 h6 ]0 Y# E( C: H4 I  }. [* _
  5.     state.soundsspeed = 0;//初始化速度
    % R% A9 B7 d( w6 J' s! @3 g- T5 W
  6.     state.speedsub = 0;
    0 R, s" j7 M8 d2 |
  7.     for(let i = 0; i < 100; i++){
    3 o6 D" ^/ r* ^8 ^
  8.         state.number[i]=0;//初始化数组
    2 f- K# B$ Y7 U+ ]6 K
  9.     }3 x9 D; n8 P" k% D
  10. }6 w- r2 s1 t4 n2 Q  \; }& E9 G. h* x
  11. + a- F* D9 s6 o& u, o  v' s
  12. function render(ctx, state, train) {
      p; t# Q% @- G. m
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动" j( G! l+ z: ~, y
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ; d/ R, n  J! q* k7 |# J
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    8 i6 s# T. Y$ N. L( R) ~* F
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差! J: o, E6 T0 b% f: Q! J6 a
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
      g8 e! o# }8 f
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作4 y7 ^/ G- U9 u4 M+ D
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ' T" O+ }& N* v7 q' ~
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! a; j8 Q* N; p! B# Y
  21.             if(state.speedsub<-1){//如果车辆减速: D, {0 ~* Q7 D; Z% E$ I- B; g4 g
  22.                 ctx.setDebugInfo("shache",1);//记录刹车5 H& T- }. y2 i+ p' p" x, N
  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);//更新返回时间 播放刹车声在转向架11 h) i5 C$ v( F7 v" ^9 C9 X" \
  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
    6 w. e5 Z2 u9 N  j' [- |4 ^
  25.             }else if(state.speedsub>1){//如果车辆加速
    / @4 Y8 ?) |% G
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    % {+ C5 ~7 i2 Y0 N5 x& M5 W
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
      y4 o( a" x+ P8 [7 ^  |
  28.             }8 ~; d  M& [+ M$ K3 ~
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ! {" }5 ~6 s% `  I, P4 m! m
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声( `2 \* l) d( N3 F" x$ H
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启. {0 m2 T; ~; x$ I
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    3 M, B9 Z  u. i. {4 k3 j8 X
  33.             }+ K; ~  d! C& w/ {; Q. V# d/ t& q( D5 b
  34.             if(train.speed()*20*3.6>5){7 v, N( P4 }  [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声! n2 o& ?' O& p+ i2 D$ |
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    % w/ X0 z( i# q5 _0 `: j3 E4 t
  37.             }
    0 |5 ~4 `+ i6 v& E8 C' L
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    4 r* Y  j$ b- r4 s
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 [* q4 _6 x; c+ X
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    + d: K+ N1 c; y* i( y0 Z3 Y: D
  41.             }! T' ~# F2 M* j) h, T  \
  42.         }# z. i( I8 Z+ |3 @
  43.     }1 Q" u- l$ N6 ?3 j
  44.     state.soundsspeed = train.speed();//更新速度0 q" ]! @4 _$ N3 x. ~; I
  45.     for(let i=0;i<4;i++){7 y* @  k0 A* v, Q& r; o0 F
  46.         ctx.setDebugInfo(i+"=",state.number[i]);0 M7 N* C' n" t7 F
  47.     }/ i1 Z% [# P3 ?& r& N5 Z
  48. }% ^* e; u  [1 h0 {' Y
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间' r, P* }2 w9 {
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    & M3 C* Q, z/ B5 x: ]- g3 g+ f! n: a, {$ E
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    * [# c4 E+ g! n* M
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ! }5 k- [3 h6 A% V) q
  53.     }
    , U6 _% P; c" u( x
  54.     return nu;//返回新的播放时间
    9 r  P$ g7 p, m1 W
  55. }. R+ N9 v# ~3 T9 {4 ?) l4 O' |
  56. function grnn(min, max) {//随机小数% g: F9 J8 \  y) Z8 o, u
  57.     return  Math.random()*(max-min)+min;
    % I" s% ]- y7 t' d
  58. }
      Y  Z9 }" l  v* o* G
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    * c+ R- a$ J* v; ^1 H( W/ u
  60.     // 获取列车从车库开出的距离6 k& v& _. q' {
  61.     let railProgress = train.railProgress();
    ) ^1 ~# g- L  e+ @
  62.     // 获取当前轨道的索引4 G! S" i9 r" H; \; {4 c
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);/ r: y3 R& D) r; t0 L
  64.     // 检查当前轨道索引是否有效
    . m4 S* d" P5 M/ G* X5 e. `
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    $ q9 c; ]$ J* Q! `8 T( M6 Q
  66.         // 获取当前路径数据对象
    # n5 d1 N& G3 [  X2 `; C
  67.         let currentPathData = train.path().get(currentRailIndex);
    2 B" K8 k9 b- T3 ]! \0 x3 b' f
  68.         // 获取当前轨道使用的自定义轨道名称5 i! V& g, A  W1 g/ O
  69.         let trackModelKey = currentPathData.rail.getModelKey();! L( K* h$ Z5 q6 d1 I1 d& h0 s7 ~3 z
  70.         return trackModelKey;
    , m8 w7 A& P% Q) N
  71.     }
    # i  l) v2 }7 p% ^
  72.     return null; // 或者是一个默认值& T) m4 g2 o0 [/ r; a2 _& i$ H6 Q
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
) b: B- n* g* P. \1 V3 r# O6 T
有事加我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: n9 \, q1 f3 f6 ~/ }
bve声音要方便一些吧,他有可视化可预览的编辑工具
' w* k6 M# d- Z
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
3 [1 s1 N( y5 ?/ j1 T6 c
. i2 {8 E5 I8 N相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
* [: W8 ]% f( y8 `/ k" Z
huliawsl 发表于 2024-5-17 21:12; a( u& J; e2 C* f8 o, b
相较于此,我还是认为bve格式会更简单

6 A+ [" C6 H6 \: O7 \' o5 Y🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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