开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 & x) R9 @3 D- n( z# |
4 M# K' a4 E& L: i' o

/ \% h( \( z' I5 ?  o5 l4 v最近在研究JS 做了一个简单的逻辑来播放声音
: [. y8 T2 q8 R& B# J" d
  1. var pit = 1;//初始化音高(速度)+ e! ]- u- Z. P4 L" ?
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ! Y; W/ u0 e' T, T2 f( `$ b
  3. function create(ctx, state, train) {8 Q' x, n5 z! ]$ N# n
  4.     state.number = new Array();  N, q8 g& F) D
  5.     state.soundsspeed = 0;//初始化速度
      i1 v+ ]! n/ h. w* e+ h' ^4 |
  6.     state.speedsub = 0;  `3 O& `: X% h% [7 j* Q/ n
  7.     for(let i = 0; i < 100; i++){& H' m% ~3 I7 _- |, H1 e
  8.         state.number[i]=0;//初始化数组
    8 s* i/ S1 ^) i6 w& A& I; {
  9.     }
    9 X6 |. C: l/ z/ s( l
  10. }
    . v0 V. y! ~7 A' ]8 x  M
  11. 8 N7 U/ ?3 ?% G/ H, J& w3 n
  12. function render(ctx, state, train) {# M5 T+ U7 B8 z5 t" y/ K0 i4 t
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动* [6 w" q2 H/ O. h! ?: q* R" v
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)% m! o6 _5 ?+ u1 M" g& x
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    3 Y7 u1 J0 `7 C
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差: L& B& s6 I! P+ f
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    0 v6 D- b4 v0 Y  O8 s) D3 M& [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作2 \& `$ V; W& J
  19.         for (let i = 0; i < train.trainCars(); i++) {
    % N, c3 q. Y9 y) g
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    % M8 p. D" `. L. ?
  21.             if(state.speedsub<-1){//如果车辆减速% A. \$ T9 c& n; J) _0 }
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    7 `# v* r) E) T0 R" 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
    ( N' O) j6 G: v- K" \( B: 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
    9 z: x7 N4 H. V. e
  25.             }else if(state.speedsub>1){//如果车辆加速6 H$ M( @  `/ y9 f# y+ B
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速* X( R% u1 [+ D3 v: z# n
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声* F5 ]  O4 A0 x# ]+ x/ ?
  28.             }
    - Q9 Z+ J, |, r. z( u
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声" l) V+ d1 z& j8 Y$ ^& ^
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声; f; L$ G* p! _
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    8 ~" U, Z/ |$ L$ H$ ~  V
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    0 P9 s( a; N/ g( v1 f. T
  33.             }" V$ w0 [. |1 W
  34.             if(train.speed()*20*3.6>5){; {% F* K; s) u* E* u$ e1 x' `! w
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    . {; x, p/ \- G; X
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ! a& {5 E# Q* R0 O. x# g7 I! X# L( W
  37.             }/ u1 z3 ^( C4 a
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){. e3 Y# m2 d* w; ~
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ! u/ C" g% x" C9 u) v, b
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声8 }# U) C/ P. a
  41.             }
    . c9 _- @* {) {- U
  42.         }3 N( H' T$ O' Y. f9 I3 r
  43.     }
    % _- u+ ?1 f; j* X8 g/ C5 X& ~
  44.     state.soundsspeed = train.speed();//更新速度: l- K, M3 q, y% Y) ?
  45.     for(let i=0;i<4;i++){
    : W/ U, v& S  q6 N. N+ n  L2 N
  46.         ctx.setDebugInfo(i+"=",state.number[i]);" {8 M% c" p# V0 g4 O. W
  47.     }2 P$ ]0 ?, K7 F9 d" T# k+ P
  48. }: M6 m1 Z0 V' `* B# K3 b
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ; J+ c, f# }$ G, P3 n; R* i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    / Q" j# ^5 _7 F) t" i
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    : ^/ S; O8 v7 q
  52.         nu = Timing.elapsed()+long;   //更新播放时间  |7 v3 W2 u" @( P  r# p) |
  53.     }
    3 e( x! m8 ^+ |4 t2 f/ S
  54.     return nu;//返回新的播放时间  V  @7 k, ~! z# B' P
  55. }" L* J$ P6 T+ z  ~
  56. function grnn(min, max) {//随机小数0 `4 I0 T2 r2 J7 |, `6 o" v+ C  v
  57.     return  Math.random()*(max-min)+min;
    $ I8 e' B0 j+ |. Z% a
  58. }, V' m5 Y" v. _, `& l
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的6 R# o3 @; S2 D
  60.     // 获取列车从车库开出的距离
    1 Z% o5 q* D6 t
  61.     let railProgress = train.railProgress();
    : Y6 {" [; D; z6 b4 T# N/ J
  62.     // 获取当前轨道的索引- D, K4 i6 W  v& V, ~. |) D5 |' S
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);0 b7 I2 e+ O( G3 H5 F1 W6 h' H. D
  64.     // 检查当前轨道索引是否有效- H# v! }- `" v4 X) j8 g2 b
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    4 b6 Z/ v  |7 O4 {9 \( v- C" d3 Z
  66.         // 获取当前路径数据对象
    1 ?# i, J* M) M6 ?# e& V. G) w4 F& ]
  67.         let currentPathData = train.path().get(currentRailIndex);
    0 S. n% g4 n# D; t
  68.         // 获取当前轨道使用的自定义轨道名称
    $ B) v1 Q) g6 u  J1 a
  69.         let trackModelKey = currentPathData.rail.getModelKey();, a" }' {" d) x% n  ^$ k+ L5 G
  70.         return trackModelKey;! L- X( }) S% i" n- m1 c
  71.     }$ ^4 N7 N7 \# d5 {; X& s8 T
  72.     return null; // 或者是一个默认值8 Y: w5 n5 T2 s1 G
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错- U( V! n  {3 s1 C  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& l/ z' I2 S' m2 C* f' Fbve声音要方便一些吧,他有可视化可预览的编辑工具

: n% c9 p+ Y" {, g" w0 n; u0 S嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 : P6 c; N+ L; X9 J1 _% n) y% G$ C! c

- n2 e8 v0 n. V5 N( r0 L* \相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 + r# o0 U# z9 y: J, \
huliawsl 发表于 2024-5-17 21:12! d& [' s7 t9 ]
相较于此,我还是认为bve格式会更简单
3 m) X* c. D) X
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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