开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
) n9 p+ t6 [- c- n; p' O; Z& b7 q- M8 P

2 |5 K" L8 z' r" h0 A最近在研究JS 做了一个简单的逻辑来播放声音* n- `& h5 S. O# x9 @
  1. var pit = 1;//初始化音高(速度)
    2 T8 v6 f& Z; n& v3 T: h% l7 N6 }8 J
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ' ]6 C1 P" o: x" U$ j8 m: {
  3. function create(ctx, state, train) {
    6 ^/ h! [7 S* K* e! b
  4.     state.number = new Array();' l& ^, Y% K& o% u# q4 t
  5.     state.soundsspeed = 0;//初始化速度
      V9 {" M2 j3 ~* h, _" o7 v( p
  6.     state.speedsub = 0;9 ]# j$ x) u4 I& p  {$ P- s# k7 D0 G+ o
  7.     for(let i = 0; i < 100; i++){
    2 j& M+ Q) d# Y0 I( `
  8.         state.number[i]=0;//初始化数组
    ; E: `( Z" U& V) }, q
  9.     }
    : Q0 U% I3 H, O; y6 }; i
  10. }  D2 q- ^! K* U& R

  11. $ A  ]. O/ j- g: \
  12. function render(ctx, state, train) {2 {1 h' z* E' k3 n
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    " I( o. w: G, q+ r
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ! j3 R- Q) {4 g$ h/ y* h# S
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ! C  }7 q3 C$ [4 @  _3 F
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差9 l9 v5 v1 }3 \
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    . {+ J! }  l7 I  i! |/ @3 M9 _0 z
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
      f2 j, O6 g( V$ e# t( r
  19.         for (let i = 0; i < train.trainCars(); i++) {
    " b/ h6 `0 G2 n7 o8 M- y! a
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    , t" C$ w$ k# n, e  q; S) @
  21.             if(state.speedsub<-1){//如果车辆减速; b/ I1 K, ~- Q
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    + W  [$ [& `( K) g: Z' j) S6 g
  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
    $ G0 \- v' C# z# I% f9 W
  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
    3 j) a( M+ t; N
  25.             }else if(state.speedsub>1){//如果车辆加速
    ( j9 A( E$ Y: F6 \
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    ( M& p  b5 |$ R. k  ]
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ( r3 G, Q8 t- z3 J% q% W, k
  28.             }: W/ A! c7 |3 I. i1 ^& ~
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声' N2 U  Z' p# G
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    $ a/ J* X& w1 g( v4 y3 B5 E
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启7 b0 e  F! f. N# y& Z2 \
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右; h; x; F6 X) j) i) ~# o4 Z
  33.             }
    ( ~- P2 j5 s& q  ^5 y% S5 `) W
  34.             if(train.speed()*20*3.6>5){# h' v: i3 S3 O. Q
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声/ T1 q, Z' o+ D5 N+ O9 R) s" F
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    3 w! E3 B+ K) x, ]# y
  37.             }
    8 g( ~: E' m1 n  K
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    $ d9 f0 g/ }( m0 D6 r7 ^/ x: w
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 h* U  T5 ]! c/ Y# r) L
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ r' P2 I. v, [: Y# T7 P, z/ v* v
  41.             }0 w& h/ C% `0 m$ J2 f) Q% F. ]
  42.         }! k( _! c$ d7 X0 s/ m+ |
  43.     }
    3 e' n4 \0 _+ ]0 ?+ D9 [
  44.     state.soundsspeed = train.speed();//更新速度
    : x6 n9 O1 |- d# o! x
  45.     for(let i=0;i<4;i++){, m5 a( n2 P5 V
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    7 g1 C) K: x5 X# z
  47.     }
    1 D6 y' b4 H" K5 d. `( f6 f
  48. }  Z/ t6 q: z) G2 Q3 q
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间- ?  m7 r( W) @9 ?3 i, x
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间& O. ]0 I9 g& n# `
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放  f6 P' W5 k6 B" P; Z; }
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    + k: I# |9 M% C! ?9 S% X8 Q# o
  53.     }* Q  Z* M7 j/ T& W$ M& |
  54.     return nu;//返回新的播放时间% V3 ^% {1 V# i9 @. l$ L
  55. }
    ) w" V4 W/ d' Y( E
  56. function grnn(min, max) {//随机小数  W+ a% a1 j% t2 D
  57.     return  Math.random()*(max-min)+min;: Q) u9 S! Y% T& H. }. J
  58. }- d+ D) e9 I# |8 Y1 x0 F( d
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    5 `7 K: s4 j/ i% \
  60.     // 获取列车从车库开出的距离
    / v6 W, a- j( a) Z+ W8 f5 t
  61.     let railProgress = train.railProgress();' u: |7 t- C) {  A( p+ A3 k
  62.     // 获取当前轨道的索引* c4 a) d; G' \* E0 m
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);3 B( [7 M& M0 K9 q- J3 h
  64.     // 检查当前轨道索引是否有效
    ; m+ Q+ K/ R7 T1 ]
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {. U; j* T5 \' ~# j2 h" Z; j
  66.         // 获取当前路径数据对象9 L) B$ m5 G% o% z$ h( C. m
  67.         let currentPathData = train.path().get(currentRailIndex);2 L" L% h7 F% f+ F
  68.         // 获取当前轨道使用的自定义轨道名称
      r3 I& Q6 z3 Q% @+ w' k
  69.         let trackModelKey = currentPathData.rail.getModelKey();1 [3 \/ Y% B0 ^
  70.         return trackModelKey;! ], L% _/ c7 h* d0 A! e+ M3 e8 z2 k1 R
  71.     }
    ! I! E# G( ?+ R* a. J, j
  72.     return null; // 或者是一个默认值
    9 g0 x" G8 \7 s6 E6 ]5 |7 t
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
+ d" [! A6 E1 Z- D
有事加我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
1 o5 Y0 V' p- Y7 }bve声音要方便一些吧,他有可视化可预览的编辑工具

; v: P' b4 Q" Q" O- W嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
% D. m5 Z4 q2 b  I2 r/ \* X0 q+ L$ ]" k+ B4 k
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
4 R  A0 Z3 D" L2 K) c
huliawsl 发表于 2024-5-17 21:12
0 }2 ~( z9 ?5 }+ q相较于此,我还是认为bve格式会更简单
  M" r$ u/ b6 l5 u5 A  J
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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