开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
; a# Y, b+ A$ b5 t8 W9 e1 z9 C2 e
# u5 n+ j# G) P' T* F
" U) y+ g; @1 J3 \  E最近在研究JS 做了一个简单的逻辑来播放声音
" @9 x+ {" h  `: l0 a. Z
  1. var pit = 1;//初始化音高(速度)8 s' t1 Q. c- k4 D
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    " h. {; |1 J) l
  3. function create(ctx, state, train) {
    ' d2 k& N( X: C# Q6 q6 G
  4.     state.number = new Array();
    1 T) s/ [) W% G- p
  5.     state.soundsspeed = 0;//初始化速度
    8 [% g9 m! a5 a1 K* S; m# s
  6.     state.speedsub = 0;3 c/ k, a3 ]  A3 `6 s* U3 v6 s
  7.     for(let i = 0; i < 100; i++){$ s8 R7 n* E) t/ v: h9 p& ^' U2 Z
  8.         state.number[i]=0;//初始化数组7 e( _/ J* p& n* }( ]
  9.     }" k2 o% H' r' |( @
  10. }9 j3 G7 e. z  i5 s% x3 N) p% D

  11. 0 ~3 p% @3 n5 V5 H3 A
  12. function render(ctx, state, train) {) _) c5 h( i  d: W2 q0 S" F" r- V
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ( {$ R, N5 m( _- @6 o' L
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    - s1 f- ]  V" o$ O+ U. W) b
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    2 ^. a" p2 t6 H* a/ O5 U
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差! ~. ?. u2 i) f
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)' N4 ^3 _0 T) F2 ]
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    * u# _* L( p8 C" l; o/ k
  19.         for (let i = 0; i < train.trainCars(); i++) {% s6 x/ G$ f4 k6 f! Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启" V) R  N+ E. t  M
  21.             if(state.speedsub<-1){//如果车辆减速# g2 s# g* ]: q1 \
  22.                 ctx.setDebugInfo("shache",1);//记录刹车) X+ D2 p/ B, w5 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
    2 u. P* n7 U, M( U# Q. c, W1 @
  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
    1 k1 D. V! W/ c" v
  25.             }else if(state.speedsub>1){//如果车辆加速: X2 A1 ?# O9 v+ R. s
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    8 W! L$ W- e; c! J' _9 i0 S
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    % H  `! U  S1 ]4 d' d! I! K
  28.             }2 L3 l2 \5 i, d
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声" o. l) g8 r1 a
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声! Y! Q% n1 `* c# l% X
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    . r1 _# o) w* D3 _2 j
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    6 \% m1 G! M/ ]! z5 L1 f
  33.             }
    # |, N: c4 Z! b/ _; {
  34.             if(train.speed()*20*3.6>5){
    ; e% r- C. j8 y1 w; R( H0 d' z: a& Y- D
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声, r+ p0 i( _: H* `: i; Q  ]
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ' F2 K. L: J1 U, E" w2 S3 a
  37.             }
    - u3 Q) A. N" W' `8 Y* i( K
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    % A  K; B* ]0 A
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 I2 M4 i- b" @
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声2 ?0 W2 g5 p1 Y# J: K- D( L2 k
  41.             }6 W+ r& F7 @! t" I8 y' b$ N
  42.         }
    " i1 A4 e% @; r+ [
  43.     }9 e$ s6 g' R- R" Y% Y, _
  44.     state.soundsspeed = train.speed();//更新速度
    / S: w( s1 J; @4 a; }8 t
  45.     for(let i=0;i<4;i++){4 g8 R* ?! D  O0 X+ M  k' d; D
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
      F: L, }' X/ f$ E
  47.     }
    * n+ f, [1 Z$ ^9 J) a9 b$ S
  48. }
    $ Z  X! d% C6 s" V9 ^
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间% Y9 N9 i9 k& U( u4 M) G' R' \  ?
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间' u% A# _  w0 r, c
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放, E! l; s8 [% Z- D2 F* k. E$ {' a
  52.         nu = Timing.elapsed()+long;   //更新播放时间# g$ H  y+ U5 D
  53.     }8 l, J* m' Z1 I' i) _4 L. c
  54.     return nu;//返回新的播放时间  D, `; m$ A" C
  55. }
    9 N7 @! Z4 v' y& Q( X2 T! i
  56. function grnn(min, max) {//随机小数+ S0 W% p) \. K# G
  57.     return  Math.random()*(max-min)+min;
    4 U4 n8 d4 h$ n% o% \
  58. }1 R+ r  ^( w% C  _9 i- t
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的9 N5 S4 D' T! ^. _1 t' S6 e/ C
  60.     // 获取列车从车库开出的距离4 _0 H( x8 }( G/ }$ H" n
  61.     let railProgress = train.railProgress();
    8 G( f% Q* Y/ h4 ~4 i& H+ ]4 @
  62.     // 获取当前轨道的索引
    5 }4 \) H- O& Y5 r
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);* [* {4 }9 w0 d* m& y
  64.     // 检查当前轨道索引是否有效, i/ C$ n2 q) i# A: |6 W/ O! Y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    7 r6 X; l3 y/ S- I# S3 Z& r& l
  66.         // 获取当前路径数据对象' c4 @  @$ U6 U6 o& W: I
  67.         let currentPathData = train.path().get(currentRailIndex);6 w% U* ~6 k* P/ M
  68.         // 获取当前轨道使用的自定义轨道名称
    8 K' m6 _* w1 c+ t3 ]: J
  69.         let trackModelKey = currentPathData.rail.getModelKey();- g- j0 r3 K$ r
  70.         return trackModelKey;
    3 H2 G! b! E) f0 Z& b1 T
  71.     }. j( [1 Q- d  j, M
  72.     return null; // 或者是一个默认值7 K. U4 \0 ?; I# |- A% A* |
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
# I- G4 _5 R& V/ Q/ F; H0 t! ^
有事加我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:048 ?. i% s$ A; r: `0 l
bve声音要方便一些吧,他有可视化可预览的编辑工具
% u; r# m% Q& i$ k
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
) V6 F' J+ R" b( L1 H
0 q9 Q: z  Y" a! [" ]- H; f4 [- L# i相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 2 U/ Y' }# i9 G, t5 r2 q* W7 G
huliawsl 发表于 2024-5-17 21:12
' Q/ ]& J& E( d. v7 G1 I相较于此,我还是认为bve格式会更简单

0 }& L$ d7 j9 `, W4 a: I🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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