开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 w) F# T5 i2 V: q
3 o( i. J4 e' S1 k; C$ h, R/ J  J+ v0 N& u
最近在研究JS 做了一个简单的逻辑来播放声音
; G4 P2 ?. P0 `3 ?! L$ A
  1. var pit = 1;//初始化音高(速度)% p; k# a" D3 n7 c2 }5 b) Y
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    & U' U2 P, o9 f  @6 H9 m9 l+ _
  3. function create(ctx, state, train) {
    / _5 B7 Q! m# R+ \4 w9 D, z
  4.     state.number = new Array();
    : [/ i9 }* S& m; b1 l3 W6 _
  5.     state.soundsspeed = 0;//初始化速度! M4 [5 ]" c/ G  |. ^
  6.     state.speedsub = 0;
    3 {+ b* ^) b# X5 @
  7.     for(let i = 0; i < 100; i++){
    8 }  R. E5 p3 Y  k2 `  y3 c
  8.         state.number[i]=0;//初始化数组
    0 w, U1 M5 u8 _
  9.     }
    - ~' Z/ O2 ]4 R0 B7 w8 f
  10. }$ m6 I* N; _3 l/ ], t, \& L/ N
  11. , s0 }. f4 K9 e
  12. function render(ctx, state, train) {) e' _: C" d* y
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动( w4 t- u1 Q* G5 n, X' [3 ~
  14.     pit = 1 + train.speed() / 40;//更新音高(速度), `$ g: E5 |: ^2 u; {
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称      s) [9 X) N6 q0 ?
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    " n5 O: D2 R+ `  Z6 c: z) g
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)- r) q# Q7 {' m, _5 H
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作# K' g7 T* Z3 J8 y/ j, z
  19.         for (let i = 0; i < train.trainCars(); i++) {* E; r. b0 m: H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    & b: C2 w( a, }9 Y( `+ s  l
  21.             if(state.speedsub<-1){//如果车辆减速" l3 L* B, ^0 c0 h, w' s
  22.                 ctx.setDebugInfo("shache",1);//记录刹车, U/ H# _" y( 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
    ! y$ @- y! U7 ]$ |
  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
    + g5 A) G3 S1 D
  25.             }else if(state.speedsub>1){//如果车辆加速
    1 p- \2 C: W. _6 @
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速, r! m/ m1 X0 J3 ~; @' \# d/ x& [
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声# w) K# ?2 S  I/ S# c3 ~+ \
  28.             }
    - G% O1 L) ?! G* P% B, A
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声2 ]' M6 H  o5 M
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    : ^- t) R2 ^; F0 c. d& q
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
      W# e8 V. a* c; j& N# ~
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    6 d' x( o- f8 h# T% n
  33.             }/ x  N' U- z- ?+ \7 {# \# U: k
  34.             if(train.speed()*20*3.6>5){
    % P. C  N- l* X% C0 ^: U
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声; P$ g" x1 _5 W9 i4 p3 `' S5 ~0 X% X
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    . X: O" }" V" `/ z$ Z" I1 s
  37.             }
    ; k! G2 N# K0 W
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){3 z- d6 N# l2 H" V
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声# Z, K! c' U) |* a
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声5 V! B% b9 Q6 s" u) {
  41.             }. \! v: Q1 E7 H7 O, t/ {! |
  42.         }: A; H5 U$ L2 j: z7 ]( ]4 @; B; @
  43.     }
    - I4 O& W1 U; U' T5 _8 }
  44.     state.soundsspeed = train.speed();//更新速度7 f  A7 w0 e* {6 i6 @
  45.     for(let i=0;i<4;i++){, K+ ^3 M) _+ ]# M
  46.         ctx.setDebugInfo(i+"=",state.number[i]);( b) ~9 X% t8 Q* ?" o+ y9 ]
  47.     }
    $ r1 ?; f# M9 o. W0 _3 S* Y
  48. }% C; W( p  p/ e$ V' F4 y6 H
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    - F1 G' J' V* y
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间, a( L( V/ k* W- x5 ~0 [) P4 d
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    " h5 X. y7 J* ^& F
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    . P! l8 p; E3 g6 S0 t/ R1 S
  53.     }8 z) f, M5 x0 m) p
  54.     return nu;//返回新的播放时间3 {5 B) e+ M! t9 _& L0 m' s
  55. }5 \8 P  N# X) e' J
  56. function grnn(min, max) {//随机小数
    % w" ?" `+ _$ d/ @6 _3 x7 d7 K
  57.     return  Math.random()*(max-min)+min;) r% F9 Y$ r9 D' U) O0 t/ ?+ T
  58. }
    ; A( b1 R! P9 o- D, F6 M5 ?' ^, g
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的1 c  ]3 c4 t$ z: B& k
  60.     // 获取列车从车库开出的距离: i5 D, q' i. L7 w1 }
  61.     let railProgress = train.railProgress();3 Y1 O5 p' h# s0 A! s4 {
  62.     // 获取当前轨道的索引
    3 K: q) e1 c, \) A
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);/ o! D* S% i7 L# p5 p$ r) {
  64.     // 检查当前轨道索引是否有效
    * v' V% S9 n# J" B. x
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {" i  u) v: U1 Q
  66.         // 获取当前路径数据对象& v8 o# ]. \  q' o/ E- s( O
  67.         let currentPathData = train.path().get(currentRailIndex);
    6 L/ @/ U7 C1 q, s3 e6 M9 t
  68.         // 获取当前轨道使用的自定义轨道名称- I9 F- s  Z/ d/ F8 b+ j2 P
  69.         let trackModelKey = currentPathData.rail.getModelKey();& Y! u% x1 M$ R3 E) N! H, x
  70.         return trackModelKey;$ Y. e% M2 i( w$ q* V. |
  71.     }$ G$ }0 v7 b3 b
  72.     return null; // 或者是一个默认值
    $ O. w, I5 m. @: }
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错  F. W) d6 O8 Z2 Z( A9 s6 v
有事加我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/ n( y6 |# R# ^+ ?. w& q8 \
bve声音要方便一些吧,他有可视化可预览的编辑工具

2 p/ k. X1 ^! o& y" M嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 : F. h1 |$ o' Z* |, c

( u) y1 p, a" T' ^相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 & o) _" h( s: |7 |0 y% A4 ]" _* x4 @
huliawsl 发表于 2024-5-17 21:129 X7 Y4 e4 [9 h; h* W6 K+ `8 x
相较于此,我还是认为bve格式会更简单
# C' _$ B5 Q& R
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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