开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
, w+ F# @# _0 m- n& `, W; J7 s: i' R

5 X% M1 i/ j( d, @6 E最近在研究JS 做了一个简单的逻辑来播放声音. r9 l' u) W3 D8 s( |
  1. var pit = 1;//初始化音高(速度)
    * c* k! S0 Q8 u6 x1 b
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]* ?5 D  u7 m. B2 F# }5 d; x% K2 I
  3. function create(ctx, state, train) {+ [# O$ S, J5 n( S7 a! Z' p
  4.     state.number = new Array();
    ) U) J! ~3 t6 y' h+ q  `
  5.     state.soundsspeed = 0;//初始化速度
    + f. M" m# `% h& M' l
  6.     state.speedsub = 0;0 k; X. E$ w( O9 O/ k
  7.     for(let i = 0; i < 100; i++){
    ' D( c5 ?4 y% j+ o& ]
  8.         state.number[i]=0;//初始化数组& L) ^9 X9 O  x9 t
  9.     }
    * R5 j2 J. C# q! Y& X& m
  10. }
    # A1 i: }2 q" u. T" c

  11. % P2 ?! k% k, N  b3 V0 m. \
  12. function render(ctx, state, train) {  M8 @9 S3 Y6 p" ^
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    . m* n% I4 A1 M% g: \1 E
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    # O- g1 o3 l9 c9 v' y
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ! r* ^8 p! r8 h+ n4 i' n
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    . t* R; [7 r/ P( _. k5 n) U
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    . w! t$ A; Y/ D' h- q. B
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    9 w2 ^. y  o+ e: _+ K4 X- c
  19.         for (let i = 0; i < train.trainCars(); i++) {, f, ~& y+ D0 f: D5 L6 S5 t: Q5 b- P0 g3 k
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启0 Q! v7 h2 {! t  q- p
  21.             if(state.speedsub<-1){//如果车辆减速
    3 T. c5 a( M" `) x8 q/ \/ `
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    # K( d9 v( h+ D& o/ Z# ]0 N
  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
    * i1 Z5 ^' s; M
  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& q' X, U4 l6 F7 B# t& J0 s5 q+ T
  25.             }else if(state.speedsub>1){//如果车辆加速
    6 }) D# M  i% ^( D1 L3 N+ \
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    / s: B  ~3 H0 e5 ^
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声! Q" m: u& W3 F% I
  28.             }) s4 \+ ~0 Q, e
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    : Z# ]* `, S/ ^# ]
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ) B4 u+ R# R# e& U' S8 a
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    3 k# ^, n, V( }- N& T
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    2 z$ U  a# m6 w: C0 Z0 ~
  33.             }
    & `% Q. J) x1 Z8 l
  34.             if(train.speed()*20*3.6>5){2 a$ k! `. j4 r0 t$ V4 T
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声) b) T: X/ {! P9 O6 |% S
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    , l, s# |0 ~9 {7 M/ }: z9 l
  37.             }- N' {6 a8 }- p6 L
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ! \7 l6 k) \1 n: o; }
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声9 s2 H  _6 q9 ?' C
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ h7 M) @! c9 U. q' v& T
  41.             }
    8 r& h, s: z* _, N8 j! Q/ g' h
  42.         }
    - B4 j) l2 a0 S* B5 g
  43.     }$ T% Q2 M9 J' S( Y* ?; H
  44.     state.soundsspeed = train.speed();//更新速度' @7 ?) K, F0 Z6 @1 F. C2 Y
  45.     for(let i=0;i<4;i++){
    2 l( O1 q& C: l! D, _2 d3 p+ U- h; k
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    # R2 o+ e2 M8 Q) H# b8 O' G' ?1 n
  47.     }
    + `  M( v1 Q$ W9 ]& ]
  48. }
    * y: f3 I0 Z/ n% k
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间$ ~3 ?3 O- U- M' D0 ^+ F6 Z8 @( r3 x
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    3 R* Y! {) l% o( s
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放$ U& u7 C( H; L) p  `3 P- U
  52.         nu = Timing.elapsed()+long;   //更新播放时间% _* s/ L/ J) n3 ?
  53.     }+ Y2 B8 l0 V( B  z
  54.     return nu;//返回新的播放时间2 g) u3 f* w+ r/ \' B
  55. }" t$ ]8 F6 }& O! `7 t
  56. function grnn(min, max) {//随机小数
    % |) q: S3 G2 U# m2 \1 ~1 p9 l
  57.     return  Math.random()*(max-min)+min;7 e, I  Y8 d% a
  58. }
    0 T' T/ ^9 o' h
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的0 k+ y3 w% x  x9 D. d
  60.     // 获取列车从车库开出的距离
    # U; P" Z6 h: D/ ~
  61.     let railProgress = train.railProgress();5 N5 r0 x6 z4 M' V" o) Z
  62.     // 获取当前轨道的索引
    ! e& V2 \5 I+ A9 X+ S/ A+ k
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);: Y2 Z0 _; {/ G, w5 P  L5 }: J
  64.     // 检查当前轨道索引是否有效- Y, c$ C6 l7 d- I* R
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {0 X5 J' ^% w8 [) O
  66.         // 获取当前路径数据对象5 b2 M- R; ^3 O2 Z. {+ {
  67.         let currentPathData = train.path().get(currentRailIndex);( h. Z: ], i* I" u
  68.         // 获取当前轨道使用的自定义轨道名称- V, Q. E' r" z1 u8 L& i$ Z, v8 ^
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    * E& i1 O& e* u. u
  70.         return trackModelKey;  `; j% Z+ y6 h8 G/ N$ H% J$ O1 H
  71.     }
    - C8 x. I0 }1 j: ?4 Q1 e$ e
  72.     return null; // 或者是一个默认值6 ~/ C$ _- l6 w
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错7 X1 H5 @: p3 Q; c& e1 a
有事加我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. [2 A* S( R1 E4 e
bve声音要方便一些吧,他有可视化可预览的编辑工具

# F0 i9 v- U% @嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
8 ~" ]) M/ N+ |- l) Y% |9 T0 G. o& ?8 V6 ~* l" L9 U
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
3 P* T* ?3 r& `4 ]5 [: Y
huliawsl 发表于 2024-5-17 21:128 F" q2 @6 |+ q; y4 g  m$ S  H
相较于此,我还是认为bve格式会更简单
8 T9 V: s0 X/ C
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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