开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 # [! [8 t4 [9 \; j6 d: s. q6 c% z

: W3 @: `, _4 p+ v; F! c+ N% y, d5 e: w
最近在研究JS 做了一个简单的逻辑来播放声音# G5 D3 R  F+ T+ c- r
  1. var pit = 1;//初始化音高(速度)
      e3 p9 j) G4 f
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    - t# B* G% ?" s& Q! Q8 [* C' y- u
  3. function create(ctx, state, train) {( W& ]+ c+ y1 n8 Q/ F% @$ @
  4.     state.number = new Array();
    3 N2 W! p- B+ z
  5.     state.soundsspeed = 0;//初始化速度
    : H$ m. R3 i% P$ O1 d! D4 [
  6.     state.speedsub = 0;
      I: B& p. s3 U8 v% o3 _
  7.     for(let i = 0; i < 100; i++){
    , B$ }' Q- L6 t4 E$ ~1 Q/ p
  8.         state.number[i]=0;//初始化数组( o9 X$ R- y* M) D3 T' v
  9.     }
    2 s+ U  b- \$ ^) I2 ]8 e" B( \
  10. }- Q- }$ b& t$ R+ O

  11. $ e9 i. O* P8 A5 e
  12. function render(ctx, state, train) {
    . X6 i' {3 N2 N0 [' b" p
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动4 o' K8 p$ w& m" f% i
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    / p; n7 ?7 X+ v; t# u, [& _7 C1 _
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ) ?+ o5 n$ i; b/ d
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    . r8 m$ \" T4 n9 c+ C7 I+ R
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    $ S8 b2 l1 d) Z. _2 s; s  P* h
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作  }6 V: [5 J$ h) f
  19.         for (let i = 0; i < train.trainCars(); i++) {7 w/ [* \. Z9 o& D9 ^7 S
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启, B/ g4 Z8 k1 l# j" e! W9 s7 p
  21.             if(state.speedsub<-1){//如果车辆减速
    0 q) {1 A9 D- q- Q/ F
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    8 L$ l! G% q& y# C3 I
  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" \  r' |6 o( T7 E2 n( v  Z- e( W
  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);//更新返回时间 播放刹车声在转向架20 y# Z: D9 i7 z) t6 o
  25.             }else if(state.speedsub>1){//如果车辆加速
    ! [" g$ |3 J+ I$ U
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    + O. O6 K+ p; z0 c& A( s; A
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声1 g6 _) |# }  A! T. R
  28.             }+ B8 [; v( @  T2 t
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    / P+ K; |* o# l0 |$ Q. R; Z1 b
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声/ v9 R- Z$ X. D& u+ F7 }
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启+ K( A! |5 v3 @- h% D
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    2 [6 c6 q1 T' ^" k, D8 y1 c9 Z6 l
  33.             }
    7 @! e/ J- o$ \3 g: u5 y5 |6 y
  34.             if(train.speed()*20*3.6>5){3 B" F0 b9 f; X
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声) v& d2 N- I& G% B3 J
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    & s* i! @6 \2 P
  37.             }
    5 \/ R: v, q9 X+ f% i4 ]
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){- ^3 V: m6 y) M0 E! N4 W" a9 ?
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    + y& H$ \+ t7 `) ~0 [8 v9 {% }
  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+ P6 f, c/ V$ X% }. w; x
  41.             }8 |: c) c" R& z+ C5 ?4 Q
  42.         }/ X7 z5 ~9 b; s4 B  r$ K7 q) H
  43.     }
    $ P5 V- M, s+ P# m- D* e9 G
  44.     state.soundsspeed = train.speed();//更新速度
    ! ]# Q- v: W3 d, Z
  45.     for(let i=0;i<4;i++){
    . K& V0 Q6 B0 v! t+ l
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    / h8 B6 I+ Q: A! a
  47.     }$ e6 b4 [0 P2 \3 j+ o( X9 |8 E5 j
  48. }
    5 h3 D' G( C  q8 t! Q# j$ g+ u4 e
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间  [3 i$ `7 `! p! l) W
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间  ~  ]* R- T0 Y0 J3 Z
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放' U. @8 m  r/ }$ z  k4 Z7 d
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    " I/ _  e0 Q% z9 O% n5 z( M# c. u
  53.     }
    * P( R( k: }7 V* e4 g3 t* e
  54.     return nu;//返回新的播放时间$ v5 E( |& B  i8 v/ j& U
  55. }
    . q. P8 ^( A( D. s! [
  56. function grnn(min, max) {//随机小数
    3 |$ h7 ^8 K$ _0 _
  57.     return  Math.random()*(max-min)+min;+ u5 M' i9 C" F1 c
  58. }
    , ^7 d- @' B! [1 M0 v1 U
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    8 V& ~6 c6 b4 y9 T' B& C
  60.     // 获取列车从车库开出的距离% M6 Y1 E  e# f& S
  61.     let railProgress = train.railProgress();
    ( i4 R9 T0 U; k5 f
  62.     // 获取当前轨道的索引
    5 R6 U! K9 b: t1 J
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    3 m! O# T6 q$ g$ e
  64.     // 检查当前轨道索引是否有效; \  t1 f0 _" m
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    6 |- a/ k% @: L3 W6 E
  66.         // 获取当前路径数据对象* N! I* P4 S- s5 q8 D( T/ n
  67.         let currentPathData = train.path().get(currentRailIndex);$ i7 r% e! h# m- ?3 _: b8 h6 g
  68.         // 获取当前轨道使用的自定义轨道名称
    4 V  Z7 d8 L# z( ]  M( s  _: x
  69.         let trackModelKey = currentPathData.rail.getModelKey();: x7 a9 }$ f% F  i) g6 C% |
  70.         return trackModelKey;5 y. y! X9 ?; \" C4 b( V0 V2 @
  71.     }
    9 Q9 x# h1 f* a5 _
  72.     return null; // 或者是一个默认值
    & W; L- g, k+ y9 w7 {
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错. r$ [9 U  h% H1 D, ~/ Q
有事加我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
3 y( {/ M% C; S% ?: Ubve声音要方便一些吧,他有可视化可预览的编辑工具
! S+ ~+ G, e6 h9 u% I) r/ S- z
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
) E1 v. o/ n9 X& m2 W5 y) g4 s# F5 y5 M3 J$ H, w; d0 M
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
6 H4 ]/ U; P+ L6 i& ], z
huliawsl 发表于 2024-5-17 21:12, \" D. R4 }8 n; {
相较于此,我还是认为bve格式会更简单

* c* {9 c2 T! L: D% }8 Z🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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