开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
' F# S+ ~$ s, J( u$ A, z3 r8 S# ^
6 F2 _4 Y1 \  L% e4 B* w3 w8 h
0 N* b9 {* v0 i7 J1 n最近在研究JS 做了一个简单的逻辑来播放声音# y6 v  ?( V! m$ J
  1. var pit = 1;//初始化音高(速度)1 i% f  n: {$ C8 y7 U9 q9 V1 B
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"], e9 l1 Q& \: i( B* v
  3. function create(ctx, state, train) {
    / x% e1 n2 }; t* u* M
  4.     state.number = new Array();+ f- {: j' \' y- u" q8 n
  5.     state.soundsspeed = 0;//初始化速度
    . p& l- P4 e3 U- @1 u0 h6 w
  6.     state.speedsub = 0;5 m9 O. j- T2 O/ r! f7 ^
  7.     for(let i = 0; i < 100; i++){  D# G4 f/ v! j  x  V) S
  8.         state.number[i]=0;//初始化数组
      z) s6 z$ d3 ^9 A& l7 {
  9.     }+ D3 ]5 }' {% `
  10. }8 B& T! b" ^& i) y

  11. , U& \+ o# d* I: G$ P$ U1 a# Z6 a2 a
  12. function render(ctx, state, train) {
    9 T" ]6 Z+ [! M9 J8 t: F3 Z/ j
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    - v7 f0 W0 b+ E
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    / [* q; c9 S4 X& r
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    0 D+ u! E: e% |3 S) y, S
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差' o8 X  p5 t2 h1 l9 e
  17.     ctx.setDebugInfo("speedsub=",state.speedsub). Q" h5 B. o/ T4 j# v- g" l
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作5 q9 g" M  `- W) ^* u
  19.         for (let i = 0; i < train.trainCars(); i++) {: ^$ x/ G2 g1 S; s% G/ o
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ' k# W: c& d% p& `7 I
  21.             if(state.speedsub<-1){//如果车辆减速
    ' E  L8 Q# y" |. \8 Y" Y- X
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    * r# @# a0 u' a/ v, j
  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
    9 M  ^+ q" C1 D) b& E  M# {. A
  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);//更新返回时间 播放刹车声在转向架23 j2 m8 x, b* ~) J5 G1 N( G4 p- X
  25.             }else if(state.speedsub>1){//如果车辆加速. g& l" Y- |: Q* z4 \5 E
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    4 F" g5 X% Z. o  Z
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    8 D$ ^+ G2 H( q; v4 J0 O
  28.             }
    0 u. u7 s' `! c6 c4 {
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声5 _9 c* {! B( y2 a' L8 _
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ! c* G; i, A3 R! u, ~, k3 O
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启2 |, B; E" m$ D) U! \
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右, o1 d- S5 C( ~2 }% u
  33.             }
    7 c& m$ U1 O  \: `; V
  34.             if(train.speed()*20*3.6>5){* Y" l/ A- w4 Q" E+ [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    9 d7 |; V& g* J  j. B' z
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声+ N3 [+ f9 N) [2 G6 C% P5 a
  37.             }
    7 M' j8 p. ^, |( S7 T( O, R
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    $ J* _7 q! j  m5 B( z, r2 E
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声% f" h8 G! Y4 Q- K# M: ~
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声6 h- p' p9 U, \, G
  41.             }+ B: d; J6 a5 E4 x( X. _' [, K5 j5 f
  42.         }7 f; S1 G1 I7 ]% K4 g
  43.     }, O9 V$ K1 T  O  s( h( l4 K
  44.     state.soundsspeed = train.speed();//更新速度) f8 s, H6 g; D' W& p- ^) R1 e
  45.     for(let i=0;i<4;i++){3 Q- m# I  y5 A* [% `+ M& e* k
  46.         ctx.setDebugInfo(i+"=",state.number[i]);% X5 L4 @! ?+ y" Q: [! {
  47.     }% }/ |& L; }# g/ y
  48. }
    9 t3 a) a, r' a3 N4 |3 W
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    1 q6 ]" M& Z* f7 u$ l3 C
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间! ^, R7 {; J+ _  A
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放0 v2 r9 i7 M9 b  j, p7 N+ r
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    9 c. z+ J6 e6 `
  53.     }
    : S* m, E$ Y2 h( }$ U
  54.     return nu;//返回新的播放时间8 p. l* n5 D" D7 z
  55. }5 f$ M) }1 r  h1 q& C; s
  56. function grnn(min, max) {//随机小数# v# ^/ I: G& z' i/ X1 E; t
  57.     return  Math.random()*(max-min)+min;4 b( V- T/ n) _; j( l
  58. }* ~! o9 f) j8 m: H9 H! \
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    & ?3 e) q5 E: |' h6 |. M
  60.     // 获取列车从车库开出的距离
    $ R) H$ v- t  l; W8 Q4 v. _! m* Q
  61.     let railProgress = train.railProgress();
    + S* s9 @7 p, Q5 G& r
  62.     // 获取当前轨道的索引
    4 v& h" N2 ?2 U$ o
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    ; \, E" L& J6 e' h7 S+ [+ K/ J! Y
  64.     // 检查当前轨道索引是否有效
    ' s3 z3 w5 D1 Q9 P6 V7 h/ S
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    4 ]3 E/ }7 T0 d$ q, O: V
  66.         // 获取当前路径数据对象
    $ @$ t" q) y. K
  67.         let currentPathData = train.path().get(currentRailIndex);& D/ b  J$ k2 ~( L3 N# I
  68.         // 获取当前轨道使用的自定义轨道名称
    1 O* a3 a; D9 R7 S8 w
  69.         let trackModelKey = currentPathData.rail.getModelKey();. k0 ^: a! _" |4 Z& C1 ?1 d
  70.         return trackModelKey;
    ; f1 G. P) b/ L: F  Z4 K! A1 s* A
  71.     }
    & \2 W6 Z3 k3 V9 Z
  72.     return null; // 或者是一个默认值* P& M% D  {' v: _8 {" k4 ?. W. c
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错) U8 E3 c' y+ i* P2 C) B6 P) f! 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# D' S' N% p! A- j
bve声音要方便一些吧,他有可视化可预览的编辑工具
5 D2 v* @& {, C! }! ^
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 0 l0 z' Q' z" b- f6 w

  z( v0 h1 r4 y相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
1 @, J: w& e# T1 X+ M
huliawsl 发表于 2024-5-17 21:129 A/ d- h& ~- N5 _7 N/ q
相较于此,我还是认为bve格式会更简单

8 ~5 g/ g, X, d3 y& o🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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