开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 " J0 E1 x1 w; o9 N

  u$ j/ V8 D6 M6 [! h2 _' P# |3 ?* r. W( x) Z
最近在研究JS 做了一个简单的逻辑来播放声音
* x3 {; L$ ?% B. k9 ~! g3 \# q
  1. var pit = 1;//初始化音高(速度)4 e" o4 ]4 e, p1 l; k2 ^
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ) J/ N7 z' U% V6 D, ^  k8 p, @2 G
  3. function create(ctx, state, train) {8 w1 J! u2 R+ s- d! m' y' D$ I/ V
  4.     state.number = new Array();
    : ]6 d+ c  Z3 l. r
  5.     state.soundsspeed = 0;//初始化速度
    3 c; D( C6 J: m0 U
  6.     state.speedsub = 0;+ S- Y, J" \$ r
  7.     for(let i = 0; i < 100; i++){9 V$ g# m7 k" n! c% Y
  8.         state.number[i]=0;//初始化数组4 s! Q0 J4 }9 t% |6 O; Z
  9.     }, n3 W- ^- A1 W4 h
  10. }
    1 U" X4 E" M: r) V/ K

  11. 4 O9 g. `; p1 g
  12. function render(ctx, state, train) {
    6 K! Y$ H1 @& ~" D% o1 x' G/ X
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动' D8 X+ C1 o) v4 z$ |2 M2 D. }7 k3 X' P
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ' ^1 A3 A" @) ~7 u! t1 J4 \5 I
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    1 ]( [7 J- l8 \- {
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差( R6 `6 e/ G$ H
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)9 e, I+ ~1 \9 x5 [/ x8 W) O8 Q: {
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作( L( S2 F8 i" @" w
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ) G! m9 A; s' o/ R  Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启1 _, k* K/ [+ C$ ?: `& U. J' N
  21.             if(state.speedsub<-1){//如果车辆减速
    $ @! G: z. b: n2 ^0 c" K
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    6 w% U2 `' \! i, q$ P
  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
    , E/ B. a$ W3 [) q: k+ z
  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
    + `& B8 c* J4 k/ d5 `: p( i
  25.             }else if(state.speedsub>1){//如果车辆加速
      [/ K' A) y2 ^  w
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    7 z% `3 \2 l8 V! G2 ?: P
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声. k$ `  G% c1 [: A9 M! `
  28.             }
    ' m) u' H2 d" B
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声. i8 a# M0 a" X& x+ k
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    - \0 e3 R! W6 ]& T) p3 J' v5 {  s
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启6 |( y, ~, D- |( Y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右* P6 r$ [; @4 P$ H! |
  33.             }( e7 Z; B/ @" e& p. _
  34.             if(train.speed()*20*3.6>5){# ^4 G: f, l' u3 F( g8 W- K( w4 ?
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声* }( k6 g4 I' Z! N
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    1 v; L3 C- {  `( ~, L
  37.             }$ ^) h3 ^& _; ~; W* U9 Z) r
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){+ a: B, ^2 Z8 R& z7 f$ H2 G
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声  G( ?- P$ _9 M( W3 Z; S7 ^
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声+ r' X  V' k5 _+ Q' Y% V$ ~
  41.             }
    3 \; O% @; `& @! i8 c
  42.         }$ I, F- o' o. k5 H. B1 S
  43.     }
    ' k; v3 G! r1 F7 y
  44.     state.soundsspeed = train.speed();//更新速度
    % d0 J" ?: N+ C5 Z3 H$ d) F" n
  45.     for(let i=0;i<4;i++){
    8 v1 v  j" P2 D2 @" G
  46.         ctx.setDebugInfo(i+"=",state.number[i]);$ v* ~  A+ Z. a6 s
  47.     }. V% z. @: K" b; m5 O! A
  48. }
    " s/ [+ f7 l$ |5 o' [$ K
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    1 @. n/ q% P! T
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间* o# m5 M, M( v2 I/ X0 {1 b
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! B1 U* k  D. ~% {5 f
  52.         nu = Timing.elapsed()+long;   //更新播放时间5 U9 \2 Y8 s# x7 D7 y: \$ n
  53.     }) R8 N- r! l- {+ E1 W
  54.     return nu;//返回新的播放时间7 c: x5 U, H6 ~3 E/ r) z1 q
  55. }( ]1 B  Q' ]7 q, c: b# ^
  56. function grnn(min, max) {//随机小数
    ( d& ?/ N. |, |' [
  57.     return  Math.random()*(max-min)+min;3 z- K+ B& v4 c1 W
  58. }: r$ ~6 E% b; B# Z1 u' D8 V
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的! @! X9 [( k: z: G% O! a
  60.     // 获取列车从车库开出的距离4 w2 E3 ?9 i+ T8 F: o
  61.     let railProgress = train.railProgress();
    " k0 P; v& h+ h2 D8 d* v7 D1 ?
  62.     // 获取当前轨道的索引
    3 d, m% {7 G* [. s
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);6 u0 X4 t& O4 H/ ]: @1 ~
  64.     // 检查当前轨道索引是否有效7 J/ x1 e; o7 @% X9 I) [2 z! p
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    # w  j6 s+ Y" l7 H0 d0 P6 O
  66.         // 获取当前路径数据对象
    " e% B+ x( O/ \8 x: u
  67.         let currentPathData = train.path().get(currentRailIndex);( |3 t7 \$ t  c
  68.         // 获取当前轨道使用的自定义轨道名称' w- N! F; Y/ M" j" m- s
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    : r( ?* y; J- n6 G8 L* I  m
  70.         return trackModelKey;6 Z  W; T8 [- p/ L$ p
  71.     }
    + K6 G1 ?0 b' T& R4 U
  72.     return null; // 或者是一个默认值
    3 _! J4 t: E! v: U
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错! n, N4 x7 I; Q8 W" Z& Y) x" j& h3 I
有事加我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:049 A/ v; e5 O- }
bve声音要方便一些吧,他有可视化可预览的编辑工具
$ k3 q# ]1 W9 `$ e
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 3 y) T* M1 V; H6 N0 V( ~7 A

: h: ]/ k4 u# M相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
4 t, v" I2 n8 S+ Z
huliawsl 发表于 2024-5-17 21:12$ X3 x2 L4 U3 A4 J$ Y/ ?: [6 Y
相较于此,我还是认为bve格式会更简单
$ D' C1 e/ m0 x) w, _9 H( g
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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