开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
* J* i7 I4 U9 F7 |6 {
  O8 @6 f$ P  D0 @: G! N% O5 N9 n' X2 Z% ~$ x# g, e( p( L
最近在研究JS 做了一个简单的逻辑来播放声音* d) N3 w- n5 w, D
  1. var pit = 1;//初始化音高(速度)$ O2 [% B' {$ H2 O1 A0 M: K* M4 G
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    8 p9 F1 F+ p* @' ]2 ?: n8 Z5 u
  3. function create(ctx, state, train) {
    " r+ V8 Q; }# C. {5 Y- q
  4.     state.number = new Array();" F; C; M" k1 B! s1 l4 J6 b
  5.     state.soundsspeed = 0;//初始化速度
    & Q$ b* ?9 i$ L# D( K
  6.     state.speedsub = 0;
    + H$ V- k) z% F( [, ?, b
  7.     for(let i = 0; i < 100; i++){0 L' v4 J9 ?! A
  8.         state.number[i]=0;//初始化数组% K$ P7 Q) `2 A
  9.     }
    9 a# z/ R/ I. g8 p
  10. }
    9 I, o; z$ e2 M( n( ~2 |/ c- Z

  11. 0 p5 k; k8 G& h. o2 y  i
  12. function render(ctx, state, train) {  f0 f/ p- v* J. H% U
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动: r) {" f* J# t
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    + Q# U/ @1 d. I1 `0 E8 G
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ( U& P+ Q; V0 Q. O  e& G
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ; U: d& X; @) M1 q- f: F$ \. D/ \
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)4 q2 u+ X) T1 m1 y2 X4 T
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作" P- u5 E9 f4 U3 l
  19.         for (let i = 0; i < train.trainCars(); i++) {, l! d0 F( L" q! n% ^
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启- S# o6 p( G) B" J1 O3 W1 u
  21.             if(state.speedsub<-1){//如果车辆减速
    9 W3 z  }2 |1 {
  22.                 ctx.setDebugInfo("shache",1);//记录刹车/ j0 f7 D+ C. M  b5 z2 z
  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% `" M2 e. _% Q# Q- g, `
  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+ g! e- P0 f& M% E
  25.             }else if(state.speedsub>1){//如果车辆加速
    9 M! V; G( _! u6 O7 `
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    * L  c' l$ g) q+ Z" v% O
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    0 A9 U; ?1 j3 ]+ K/ }0 ]" _$ }
  28.             }. Q$ H8 K5 n+ @* d
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声  k" B' T2 l% U9 l
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    9 L1 F1 Z# [* d
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
      E/ F6 Y2 U, {& o1 Q" y. J
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右1 L3 n; K  u4 c& \+ n4 O) Y
  33.             }* y+ h2 i) ]6 g; I5 C
  34.             if(train.speed()*20*3.6>5){
    + R: ~7 v) \4 ?: Q& q7 X. I
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声8 j3 {0 h; H- F
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声: C8 Y# T0 t! D0 |
  37.             }
    # L: t  J& e/ A9 c$ Z# t* D# }
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){! V" s# x* c- N+ a! {
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声4 w8 b9 G" I- q) g
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声- Z2 ~, `! i0 |( ~) Y5 ^
  41.             }
    9 T  g( w% |. M6 O
  42.         }% p. y6 U) X6 K; c
  43.     }2 y3 B+ d8 r& h+ V$ d9 s/ S
  44.     state.soundsspeed = train.speed();//更新速度
    - w, q2 b4 s5 ~7 v! l- M/ }
  45.     for(let i=0;i<4;i++){
    8 x. e2 l2 X; B  O$ y
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    * Q' b6 |% Y' \7 y# _- V: {
  47.     }
    3 @9 g: n' C. c/ u3 H7 o
  48. }
      |" M7 M: D! t. j1 ]6 D& t
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    8 B- Y! O* |. @7 j& r& g% K: h
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间$ x3 l) g; o( q$ s0 S% ]9 o7 l7 f
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    7 l3 V4 v( d* U
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ! m  r, N' B2 _' k; o! i
  53.     }
    " ^4 T5 D, Q& R1 S6 C# B
  54.     return nu;//返回新的播放时间; u) f4 s# r9 ^( I2 P
  55. }
    $ S& O( t: v. Y& g3 G9 f" |) R
  56. function grnn(min, max) {//随机小数) j; F$ ?. o- d: o( [" ^
  57.     return  Math.random()*(max-min)+min;) R: [6 t+ G  `) k& L
  58. }/ n; n' R; b$ X4 J; ^2 {3 Z- h
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    1 N1 o- I! B9 t  g# M) v  b3 D. j
  60.     // 获取列车从车库开出的距离- B7 p* G7 E+ k/ o1 q
  61.     let railProgress = train.railProgress();8 e7 ^  B2 j' f9 L/ \' u/ L5 I9 r( u
  62.     // 获取当前轨道的索引6 P* f. b9 ^5 h/ j- K, V* w* S4 n
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    5 }& U$ d# M* _( O+ c/ i9 l
  64.     // 检查当前轨道索引是否有效
    ( q( K' J- g3 h; X& B
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {4 _% G( O5 E" ]
  66.         // 获取当前路径数据对象
    . O5 p4 a( A; ]: F/ S+ G
  67.         let currentPathData = train.path().get(currentRailIndex);
    ; c: g1 B3 n- q' o: n
  68.         // 获取当前轨道使用的自定义轨道名称
    0 r% _. ~; P" U- j# R
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    , D6 z. i) }9 a! ~
  70.         return trackModelKey;9 Q: T0 u! ]+ ?9 M7 s- w) u  a0 o
  71.     }4 t% p2 {% z+ L2 A' b
  72.     return null; // 或者是一个默认值5 Z+ D; c2 |, ~* X
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错4 S: E! w8 Q; [4 k5 k# Y; J, X8 j
有事加我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:047 {3 L+ \# C# k
bve声音要方便一些吧,他有可视化可预览的编辑工具
3 Z& E8 i; x& [5 {& N( X9 _
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 / e% u0 e( x" D! a# {+ |. w
* O- n3 u, G, ~4 t" T$ ]
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 - z! J" z6 F9 z3 v8 M- M& o
huliawsl 发表于 2024-5-17 21:12; b5 D* R: F$ `1 D/ X7 ]5 w! M5 X  K
相较于此,我还是认为bve格式会更简单
1 ~: ?+ x1 i) q% d
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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