开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 l, b. U7 a" D% Q, X- }0 @; v. v% B0 ]/ D1 o8 W

& I3 H# n( ^9 U  R3 P) P# V最近在研究JS 做了一个简单的逻辑来播放声音
6 z, e7 Y* A& Y# h
  1. var pit = 1;//初始化音高(速度)+ ^0 w7 L$ g5 N6 l% Q& Z4 w
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]& n4 o/ Y+ C* U# d
  3. function create(ctx, state, train) {- I/ j  M' B- L  r; f
  4.     state.number = new Array();; ?" O0 s5 x- `* u: e
  5.     state.soundsspeed = 0;//初始化速度" M. V4 H  W& R  }3 c) N$ Y
  6.     state.speedsub = 0;
    : j0 w* S& m0 W+ z9 R& [
  7.     for(let i = 0; i < 100; i++){
    . {' Q/ G- {) w8 o: _1 I1 y3 u
  8.         state.number[i]=0;//初始化数组& J. K3 w6 {, K8 w( X
  9.     }/ }' X/ I/ J' k7 Y; ~! C
  10. }
      k8 d( o( S( D! h8 |+ d, r
  11. ) C' C4 @: s; ]
  12. function render(ctx, state, train) {
    ! S4 l$ Z; A+ q. c7 L% [
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动1 w1 C2 @3 V1 x/ m
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)3 P( C) B( t/ h* G7 j
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ! ~9 Y4 g, W0 }9 e  [2 E6 c7 U
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差( u4 ]8 O; |2 u, n/ O+ q
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    $ h6 m+ B6 q$ F" ^# p! _
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    $ Z& S; R. @) O; e; {# U1 ]; ^
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ( r1 P: `) }$ b2 r8 N+ H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ' J9 x0 B' s# @. a  n
  21.             if(state.speedsub<-1){//如果车辆减速. W, i- I' w; t0 p& X' F5 B
  22.                 ctx.setDebugInfo("shache",1);//记录刹车5 n* L# N/ o! v# {! }4 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
    * t3 i1 \3 e2 z& |6 _* A% 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
    # r& w( O( R* }% O1 o9 J" r1 M
  25.             }else if(state.speedsub>1){//如果车辆加速
    / L) z& G2 v+ H8 O5 a% [# f% n
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    % Q4 I% I" ]; V( A" i5 Q
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声9 l5 S; n* c* z( w
  28.             }
    5 U( R. ?+ f5 S( ^
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    $ W3 t4 R; s4 ~, M5 g, H8 I% V) b
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声1 p- w4 J8 o. n& }( q. o
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启; U3 v0 x, I" @
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ J9 R) F+ Q; r0 ?
  33.             }
    8 F2 o" a' n4 c% d
  34.             if(train.speed()*20*3.6>5){
    $ E. c1 b) F3 l: r
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声1 f/ B+ p  w8 N& G6 I% u( `  S
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    + F" C) ^" r- m8 q* D6 u8 G
  37.             }
    , r& d  [% B1 n+ G* W+ }. Y% ]8 n
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){( }) \' ?) T  Q- V/ T
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声! M" p" d$ r* j% d8 D' `
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    + P$ P- g" Y+ l5 }- H: j1 k) j
  41.             }
    1 h. Z: b8 Y4 [$ H, e
  42.         }( L3 P  `3 p) ~2 P
  43.     }
    ' t/ ?- J! `( d" p  n1 `
  44.     state.soundsspeed = train.speed();//更新速度
    $ ]7 J0 w, O& q- z5 `: L8 F0 j" i
  45.     for(let i=0;i<4;i++){
    * @0 A/ T$ v3 G0 X; K
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    * S9 m/ T6 _- ~
  47.     }9 Y" b- B: u& j$ F
  48. }0 [! A- D, }% A, `
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    + @8 K1 ^3 _3 d9 E/ \# Y; U
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间2 R( n* x$ W; [9 B, Y
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放" a+ P. S: B4 l9 V# O
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    8 C6 l7 m! g7 h* u7 r
  53.     }
    4 `  t% L3 u; k7 C* A) W
  54.     return nu;//返回新的播放时间
    / b% Y. E/ S8 g+ }. H7 [: N+ c# t
  55. }
    + q- j! O) B# T6 n
  56. function grnn(min, max) {//随机小数
    8 e: f1 c% ~- z" q5 v$ u$ Z4 \" R& @
  57.     return  Math.random()*(max-min)+min;
    " `0 o" Q7 c8 {
  58. }% r5 ^" w# p+ W: M( e( L" A6 r- [
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的- g: T& ]9 ^2 c; T2 ]+ }
  60.     // 获取列车从车库开出的距离
    - x2 \6 {3 q/ I( [2 o2 I2 E+ f7 `
  61.     let railProgress = train.railProgress();
    / W  d3 C. B) z  A0 Y
  62.     // 获取当前轨道的索引
    7 w4 t$ R# p  o4 ^: L6 W( n" z6 S) L
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
      L' o! [7 p2 j9 d. B
  64.     // 检查当前轨道索引是否有效
    4 m+ R5 q3 p: n: p
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {- q; J; D; o6 x) u
  66.         // 获取当前路径数据对象
    / d1 z, k$ L: }& |- h/ N; o
  67.         let currentPathData = train.path().get(currentRailIndex);$ h5 X. d, s9 S. T2 n
  68.         // 获取当前轨道使用的自定义轨道名称
    * E9 B7 u' A' S! t# O
  69.         let trackModelKey = currentPathData.rail.getModelKey();0 e, T( B& [  g- R( m' U
  70.         return trackModelKey;6 Z& c4 t$ L* [. \# a6 H, i
  71.     }
      |# H: ^8 z3 G  i  `1 L) n3 J; W
  72.     return null; // 或者是一个默认值
    # g1 e# i4 j; [$ L2 w
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错4 c( s1 v7 l2 h; P% k6 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:042 Z* n, F( A2 z6 ?5 |
bve声音要方便一些吧,他有可视化可预览的编辑工具

0 Y5 i' l# Q1 d& h5 D嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
, {- s) W6 r* U( U' ^5 [4 k. f
- F- D* b; K$ N8 d  {相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ; T4 B( w+ H  D' t# a$ P0 j  p
huliawsl 发表于 2024-5-17 21:126 F# O% G: c3 m
相较于此,我还是认为bve格式会更简单
0 H( j+ z7 c" W& @+ _
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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