开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
/ n# \! r* E8 `5 I) B/ T% G
" O/ n+ Q1 h7 g; H* x% ]6 m5 o6 m
最近在研究JS 做了一个简单的逻辑来播放声音
/ c8 v' A" V3 d; L
  1. var pit = 1;//初始化音高(速度)6 H$ c3 y# W$ l# g. L
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"], V/ \) T5 A0 s( |! ^% @
  3. function create(ctx, state, train) {
    & i5 m/ X* a$ O/ W, W
  4.     state.number = new Array();
    / K6 j; S# s3 z! e
  5.     state.soundsspeed = 0;//初始化速度- ]! f6 N! h( n+ o* K
  6.     state.speedsub = 0;
    ( n7 h5 x$ }2 @
  7.     for(let i = 0; i < 100; i++){( b8 @4 D1 ]; R4 h2 M
  8.         state.number[i]=0;//初始化数组$ n/ G; Z+ q* `/ [
  9.     }
      ~7 V% G* A* }& I
  10. }8 K& {$ T0 X8 _4 u( @6 l/ z: X
  11. " C( p4 O4 ]. q3 l) x7 {* M
  12. function render(ctx, state, train) {
    . ]% i, M9 W$ {
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ! R+ k$ W2 O5 r  W: k
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)( n- |* B7 F& m9 ^
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    5 [+ \* L3 k4 b4 O- D
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    8 J8 W9 @2 L! D! O9 Z0 Q& v# G9 `
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)9 V, \/ R3 G/ R1 k1 G+ A
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作7 |- r- H: u* J
  19.         for (let i = 0; i < train.trainCars(); i++) {4 Y' L  I/ V- G6 j9 o7 a) g
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启7 T* ~" t( l+ d. Z1 d3 Q/ J. ^
  21.             if(state.speedsub<-1){//如果车辆减速
    ; D1 c5 R& B/ _( P, T$ Z
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    - x1 a, \9 x0 {4 l7 c( E
  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
    & U5 |0 ^! R7 ], e/ C) W  z1 R
  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( H) S3 a7 Y2 O: m4 q( P
  25.             }else if(state.speedsub>1){//如果车辆加速' \& v  Y' e+ p1 X2 K9 K5 ]* P% X( N
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 X) g9 U! {: P' w1 d
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    0 B, K$ P. U$ C; U% k% p4 i
  28.             }
    4 r6 [& a! i0 [) y: P+ @+ m
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    7 v% v: c( I' S: {( D
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    $ F! Q' X9 [* @8 B1 x! t
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启3 s7 i1 U8 i4 m0 a* A
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右9 i$ R2 r& T0 p5 x, J- C" R# m( R- T
  33.             }+ L1 B% ^. v1 r: Z5 ^
  34.             if(train.speed()*20*3.6>5){
    2 N* Q$ a9 W$ T) h) n3 i! z0 M6 O
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    . |( u! p7 |& w/ f8 \
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ( i' l4 v, A) l" I# v, y9 N2 k5 k! O
  37.             }- U" m( g( I6 F, a# |2 @
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){! Y# X/ ^1 q/ y  H8 E- _
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    , X& ^8 f( v/ g1 n* ]: g+ q
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    2 L  [5 a% a2 K
  41.             }( O) S4 D# p, W$ c
  42.         }0 S% ~" ^4 @( D+ a
  43.     }- h% o! ^  ]0 _; L% Z9 |" Y& |5 b
  44.     state.soundsspeed = train.speed();//更新速度; J) Z! y) e' g
  45.     for(let i=0;i<4;i++){- ]1 `9 ]: B8 A. k( m/ P2 `
  46.         ctx.setDebugInfo(i+"=",state.number[i]);( [0 H; d& Y) a  t- G/ t
  47.     }
    9 t7 \$ H9 o" K5 p
  48. }# h" {4 H/ }5 K, V. O) ^
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ; X+ P1 g7 ~* `  m, J  T
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间0 X8 M  Q: l; j+ v& m
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放8 T1 v3 g7 P% K
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    9 z. v- B9 Q+ e/ _0 r0 B2 Q
  53.     }# s% S5 K! q7 }* z/ I& i3 |' x8 g
  54.     return nu;//返回新的播放时间
    ' H0 w2 h3 N, d+ A$ i
  55. }* W7 M, U; v" t! n: z$ s
  56. function grnn(min, max) {//随机小数
      ~/ c) Q" f7 v2 q  s5 d
  57.     return  Math.random()*(max-min)+min;
    2 |4 R5 K/ u/ Q5 n0 V* h
  58. }
    4 G. H. _% o- O# k9 i  h
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的; d) C$ m' X$ F0 v9 u
  60.     // 获取列车从车库开出的距离
    # a* ~6 T, r3 i( \' Z
  61.     let railProgress = train.railProgress();4 Z  H/ J, N, V' }: u6 ?+ o" @
  62.     // 获取当前轨道的索引
    2 N% E7 o1 I0 H+ @/ ~4 |2 p
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    4 g/ r# u3 O( D8 d7 A- G
  64.     // 检查当前轨道索引是否有效% l# k9 D+ D4 C4 n" |3 S
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {1 g9 T4 h0 M! X0 ]: T; Z6 y
  66.         // 获取当前路径数据对象
    % j0 L/ u& y( j
  67.         let currentPathData = train.path().get(currentRailIndex);
    / t# n$ W- n& [6 G  u) p
  68.         // 获取当前轨道使用的自定义轨道名称3 C8 w' s$ D! H. }4 s
  69.         let trackModelKey = currentPathData.rail.getModelKey();- q! Z7 i3 Z, P0 H9 @
  70.         return trackModelKey;
    8 Y$ y& M1 t! s6 I. n: w
  71.     }
    / }* G/ o! J- F0 i
  72.     return null; // 或者是一个默认值1 q- X3 V& M* k4 p& U, g
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
0 V( o8 c" ?$ Z; I# C" [! 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:04
" d+ n  Q" W0 e( U7 @1 Lbve声音要方便一些吧,他有可视化可预览的编辑工具
1 @% x' j" K1 }; \: s* X# o! P
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 9 ?* S8 d. v7 h
  c2 |7 P0 J% I) {7 a0 a8 _. m
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 + E7 [% E4 U. p: `
huliawsl 发表于 2024-5-17 21:12) n8 }4 B$ g( r/ D/ N! k7 ^! b. j
相较于此,我还是认为bve格式会更简单

0 D) g9 a+ K8 t/ h6 P; |" p🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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