开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
3 U; b6 x1 _: D7 a
4 ~4 r# V/ L$ B5 z. o- m  ~4 w+ F! H. }1 u0 x$ E: d. }
最近在研究JS 做了一个简单的逻辑来播放声音
% m/ h' E8 D. Z2 |: G' H9 k
  1. var pit = 1;//初始化音高(速度), _3 x, I6 b7 Q
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]7 F) n9 E$ u2 R/ C7 e! ^
  3. function create(ctx, state, train) {% g  s' E/ S; b
  4.     state.number = new Array();# p1 p' |; _( }8 D  F
  5.     state.soundsspeed = 0;//初始化速度
    0 G! O5 w' d/ i9 L2 }: p
  6.     state.speedsub = 0;
    ! F% v0 b$ k. s3 x( b- r
  7.     for(let i = 0; i < 100; i++){. K$ p$ F: P. \& k$ O
  8.         state.number[i]=0;//初始化数组
    9 C! _! D' R& @  h! i
  9.     }; L6 C$ C' ?6 s
  10. }
    ! i; G. a' V" @8 ?/ E  d% q

  11. : j. I; I4 y: Y$ o" F) y
  12. function render(ctx, state, train) {
      j3 M+ X0 F* K1 T& p' `7 E4 g$ _
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动* b* L5 s, J2 T' K5 u: _4 r
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    " T2 f" `2 b  Z) O
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    : O% }) ?! @! j6 p8 M6 ]$ z4 U
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差8 @: [% m' `% y% b, d5 x+ v
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)7 ]/ S! v0 s/ X0 y; Q, _, s3 }
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ! j( {* k3 J  n$ b, G
  19.         for (let i = 0; i < train.trainCars(); i++) {- J+ b0 G* x  F1 H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    - Q% J5 J5 m/ \+ L2 o5 Z) ~- [
  21.             if(state.speedsub<-1){//如果车辆减速
      R. E( Y7 P# v8 p9 g, w
  22.                 ctx.setDebugInfo("shache",1);//记录刹车2 s$ e. O; ~; N" Y
  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
    - q6 p7 N2 C$ U% B
  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  R+ J3 j, C; G' J, N9 S
  25.             }else if(state.speedsub>1){//如果车辆加速
    ( C# d( t2 |- P! x; y  \9 t2 U
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    + B4 t/ a/ \( I* N' ^! E
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声* e5 |: s; l" f
  28.             }
    & h& o8 _0 Z, e9 G/ F. k
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声- `( S+ C7 K( Z0 y- A
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声5 x3 U1 ^% r& k* }' A- w
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ( A4 {) O3 ?6 p, X5 D7 E2 ]9 Y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    , q3 ~8 \3 [' b' q* g) g; U8 }
  33.             }
    % g0 G- P$ ?" k  b, v: T- c$ T
  34.             if(train.speed()*20*3.6>5){/ s* B; c, r/ \; B4 W
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    6 |/ q% e' d# Q3 m! ^
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声; R) f; p2 d  z$ @
  37.             }$ _3 @$ N( Q% S9 i- g. Q' A+ {8 o
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ) A$ r0 B% u: U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声  L$ Y5 p$ a3 L! Q# S. ?
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声" @, n6 d% h2 J6 ~8 _
  41.             }
    ' l) p6 v/ r$ C5 `6 E, e
  42.         }: R' j+ s. s  q+ X
  43.     }$ Q/ g& N) u2 @; n8 g# T% s
  44.     state.soundsspeed = train.speed();//更新速度9 I% ~  \( Y8 j
  45.     for(let i=0;i<4;i++){
    4 ^/ r3 r) B/ q  P
  46.         ctx.setDebugInfo(i+"=",state.number[i]);% Y' N! j4 P1 H$ g
  47.     }
      [7 Y, ]. i* d; J  Z! ?& L
  48. }+ a: b- n" [' ~0 ~8 {# f" X4 b( B# l8 F
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间9 X  ?& v' k% v1 _
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间/ B: J4 T' O- N! }
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    # i) g# ^4 B' D
  52.         nu = Timing.elapsed()+long;   //更新播放时间. O/ m8 \% r5 q- q
  53.     }
    1 _: f) B, L; A0 A2 c* H
  54.     return nu;//返回新的播放时间
    9 N/ ^* ?. m) H% i/ C" o0 t
  55. }
    $ S! s- _% n# z. {
  56. function grnn(min, max) {//随机小数
    3 s1 f2 F' O7 |- c
  57.     return  Math.random()*(max-min)+min;
    ) f; D( ^& R. v4 Y, X4 c5 n
  58. }5 C1 w- d" b2 Y; L0 R! b. D
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的" y0 ]+ b+ U7 ?- J0 w, y' D8 z
  60.     // 获取列车从车库开出的距离3 M. F7 R+ C1 X) u$ Q1 i) O
  61.     let railProgress = train.railProgress();
    * d4 g/ \) g5 [6 ~
  62.     // 获取当前轨道的索引. k- N; {4 D$ b& a
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);  l$ X8 S  A7 M6 Y6 G8 o) n
  64.     // 检查当前轨道索引是否有效
    4 [0 w  k4 |+ }7 s* D# Z$ Y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
      `' V. X& Y+ k4 x3 W
  66.         // 获取当前路径数据对象) x* x2 ~) ^+ ?1 m- r* y; J
  67.         let currentPathData = train.path().get(currentRailIndex);. {5 F' I' j0 U
  68.         // 获取当前轨道使用的自定义轨道名称# ^$ O; x) y/ D8 s
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    # M4 c/ K, X/ T! s- Y
  70.         return trackModelKey;$ Y6 n5 d% J2 u/ U0 |0 c* O
  71.     }( B5 `; d: U7 C! g7 t" t+ k
  72.     return null; // 或者是一个默认值6 X, I9 B: C  \( C( ^
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
7 f2 a, }, T9 P
有事加我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:044 j3 T6 N' a; ~5 S+ t, t* q
bve声音要方便一些吧,他有可视化可预览的编辑工具

/ _, R/ M) r" [; k# O嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
4 ~. b6 c( O4 S& \6 j, Z, O) m6 j9 S( a0 x" m. v
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 6 Y( O( Q, V: s- |0 i8 J* v! O
huliawsl 发表于 2024-5-17 21:12
$ f9 ]1 [( q/ C& r相较于此,我还是认为bve格式会更简单
0 u4 p/ r0 u  X) o+ q( o- W
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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