开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 & X3 T  H7 }: n" `# D) b$ d6 W
8 W& ]- z1 _5 @9 ~
2 R3 T$ I/ Z2 K7 J/ n% a
最近在研究JS 做了一个简单的逻辑来播放声音2 E" [2 L; D6 P
  1. var pit = 1;//初始化音高(速度)- t, j, j! J6 x4 Q4 y, D
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    + z) [1 Q/ d2 v9 i- _' h/ v6 }
  3. function create(ctx, state, train) {, V8 }, [$ @4 d
  4.     state.number = new Array();/ |) ^+ }# p  s" o6 k
  5.     state.soundsspeed = 0;//初始化速度
    4 _8 w0 H$ o6 ]6 [8 n
  6.     state.speedsub = 0;
    2 T* p  ^4 y8 `* E7 H) O
  7.     for(let i = 0; i < 100; i++){
    + ~7 z$ c; z$ Z4 S
  8.         state.number[i]=0;//初始化数组0 S# V. b3 E) C7 W* H
  9.     }
    8 r) O% x( v! _
  10. }
    ( W0 c. W% C9 A- }9 [) I7 S% E$ U
  11. % ~# ~  X1 v' j  N, Z  P6 J1 Q
  12. function render(ctx, state, train) {& g3 D0 R7 Y% H1 s
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    + E0 Z" S6 q$ \* x( m
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ( E4 Q) y& }1 U! r5 W- V
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    4 |& G, [( d5 I
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    + l+ ]% O( d% V5 Q3 z: Z( f
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    3 |: r1 m2 U2 n% U! _3 c+ l1 k
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    8 j6 P9 S; E* y5 F
  19.         for (let i = 0; i < train.trainCars(); i++) {
    0 r8 l9 B+ G6 O& @# E3 [. [
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    " b. ^4 {: V$ V. o2 `
  21.             if(state.speedsub<-1){//如果车辆减速% ?8 z" t) s6 l- r- d: o
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    9 ^3 m# z  `& a7 `( P: ^5 A
  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# m3 G8 O0 q+ T% 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);//更新返回时间 播放刹车声在转向架26 D9 P* r8 P3 e, M$ Y4 H6 U% U  _3 z7 l
  25.             }else if(state.speedsub>1){//如果车辆加速
    ! a1 p7 a1 ?; t% ]# x
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速* P5 o# w; l  o+ P8 e8 Z- S
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声& X; r1 N. B& o
  28.             }
    9 x' n0 ^4 T' d7 A- z
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    0 g, k+ Z7 h  d2 Z! A
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    & N1 [, Q; K) w0 ]3 E) {! k& r
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ( o# A3 u1 g+ Q& k
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    : a" k; Q9 A' B3 p
  33.             }
    6 J2 V! U& q- R/ p& ]; r
  34.             if(train.speed()*20*3.6>5){7 s+ a- v6 x0 b' L" s0 a
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声* c" d# ?% f# e- `% f
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声1 ]6 R3 g+ K9 E7 }+ X' _
  37.             }! u& C' ^; H+ p* Y! g  G. J
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){' F8 X0 p! f; [* C; u6 P; j
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声: {# j6 X7 t' r4 ]
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    8 t# u+ w  J$ }- H( K
  41.             }
    1 ?: Z, ?2 v) u) ]! U
  42.         }
    3 e$ E" Y1 f' J/ T. j
  43.     }
    , S$ n9 \: D% {0 l9 Z4 x; }
  44.     state.soundsspeed = train.speed();//更新速度
    0 d- S" _8 p- H* r. U! V
  45.     for(let i=0;i<4;i++){9 i- q* B( P  V9 C9 ?
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ( t& ^7 Z- ~8 E9 ?4 j4 G
  47.     }3 T2 {8 i" A# p! a8 I2 k
  48. }
    , V2 F. |7 R, o5 |  Y
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间1 P% n$ c" A& D  [$ z
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    9 X( o* \2 w# U# p# Z9 u! h
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放" l/ Y, [* D2 k" A( V7 Y0 B7 x# U
  52.         nu = Timing.elapsed()+long;   //更新播放时间0 {) L' F. j$ \$ a: u5 ?
  53.     }
    ( F) N6 M1 k3 E0 G: O
  54.     return nu;//返回新的播放时间
    7 b5 P& W5 r9 i0 M2 g/ Q# n9 `
  55. }
    : P& S1 U. j' ~4 D
  56. function grnn(min, max) {//随机小数: s) r  z6 Z2 h5 L( r
  57.     return  Math.random()*(max-min)+min;1 N, |' |# j6 M+ W6 O: D# Y
  58. }
    8 c' n2 R1 |4 F. ^5 ?  y( e
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的3 m, f+ X$ s/ n7 \  E
  60.     // 获取列车从车库开出的距离! V2 \. W! l% r
  61.     let railProgress = train.railProgress();+ ~5 c, V8 a# g2 a
  62.     // 获取当前轨道的索引- _* e: [9 T5 k4 \% B. h
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 i( A% J  O$ P% b1 @
  64.     // 检查当前轨道索引是否有效
    ' c, m" [* R7 k( j/ a* e) ]0 |
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ) Y6 ~& u/ t) a, X& v( i
  66.         // 获取当前路径数据对象0 ~4 `! L% V3 P7 g  M
  67.         let currentPathData = train.path().get(currentRailIndex);
    3 r& F' @/ G2 S- c( Y: n% B
  68.         // 获取当前轨道使用的自定义轨道名称' D& U2 n8 G; U, I" j
  69.         let trackModelKey = currentPathData.rail.getModelKey();/ X- q) U$ J! \9 j8 F/ I( J
  70.         return trackModelKey;6 o7 Z- k3 [! @: F2 u6 u1 ^
  71.     }
    2 c: C4 Z9 P) {! A
  72.     return null; // 或者是一个默认值
    , Z1 ?9 P+ M5 g: j2 F
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
( |) |9 U0 i5 B1 v5 \% f. W  |' x
有事加我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
/ @* ^; I9 D5 k1 K# rbve声音要方便一些吧,他有可视化可预览的编辑工具
1 h4 p' i7 [# D1 x/ D
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 6 k# ?/ Q# K  C

  G5 |' s0 K% e5 D相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
% O) C4 M$ ^5 h: z- p
huliawsl 发表于 2024-5-17 21:126 |  q  Y. ]; G; f8 R& C" H
相较于此,我还是认为bve格式会更简单
* P. \1 _: y  m& Y
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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