开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 ! p1 ]6 F( [3 ~% r
6 i0 Z/ H" j/ \: v$ A& }
3 b* g6 W& {1 }% w: T$ [1 h
最近在研究JS 做了一个简单的逻辑来播放声音
* M5 u, ^5 z9 X- l0 W
  1. var pit = 1;//初始化音高(速度); U  ?, [6 f9 H' x( Y
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]+ [6 s2 E  u6 n: |
  3. function create(ctx, state, train) {8 S9 A7 ~, N4 R5 {- R
  4.     state.number = new Array();' w3 F: w& `; n2 f
  5.     state.soundsspeed = 0;//初始化速度) R+ d5 ^! P5 q+ @
  6.     state.speedsub = 0;( y1 `/ F. Q! H% U- g
  7.     for(let i = 0; i < 100; i++){
    # N# |1 d+ \! W5 P+ h9 f  }5 K+ Y
  8.         state.number[i]=0;//初始化数组
    9 O# v1 |8 h+ ^, r9 X9 E3 v
  9.     }
    5 A, E# U, x, _- X
  10. }
    4 ]7 M+ i+ N# M

  11. : P0 d+ l4 I5 d& P
  12. function render(ctx, state, train) {8 F: K9 M& u+ p" G4 R9 d8 G
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    . x' {& A0 [* T. H0 r) M. L$ C4 W
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    8 r; p' ?5 I1 I4 i
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ) O6 f: e$ P- U) z
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    . p, D- }3 n( g3 A* \8 z( M/ L& d  p9 q
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    6 b: k9 n9 \( y6 O
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    0 s: x  U: d3 v# e1 y
  19.         for (let i = 0; i < train.trainCars(); i++) {
    / \. W. z' {  k7 Z( |7 d# o9 l
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启  B/ G/ H5 L& O0 s& U+ r' ~
  21.             if(state.speedsub<-1){//如果车辆减速
    3 s! ~3 b, d- ~0 s- w- ]! S$ n
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    - k0 D+ g  v1 f) Z) H9 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
    # ?' h2 X; J  E$ \- b# K6 E0 ^' l$ }
  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" X5 A! D4 Y8 q& D3 w* B
  25.             }else if(state.speedsub>1){//如果车辆加速
    * h6 r) j5 l& O" Y8 `
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    " j6 N7 y* t# b, j2 j' m2 G8 i
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声. Y7 E; V. @+ n' z& _
  28.             }8 B: V* q+ D2 H4 n
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    , i+ e  P2 A3 x
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    & G5 }, j3 F7 D, p6 h8 _
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    " J$ h+ _9 p: U1 L. f- u
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ q$ _0 A: i1 Y0 x1 _
  33.             }
    % b8 `* x. V8 l# |: d' `) X! h
  34.             if(train.speed()*20*3.6>5){0 q" P8 d/ s5 p; E* T- v( C, k  q; h
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声/ Z" x2 u1 a+ G; l1 [/ l
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声0 {# ^* C& U/ b, B0 c
  37.             }. f' n( \, Q9 f( Y
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){0 Q- [& ~. q! U; d% w, ^
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    3 t+ ^! g9 X7 g. n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声& z3 J# l. t4 d! Z) r; ?: G
  41.             }+ x9 o( W: w  t; n: Q
  42.         }
      ?  N. f& Z/ j) o) X# Y
  43.     }$ V  t5 O  [# M- T
  44.     state.soundsspeed = train.speed();//更新速度
    # @$ ^5 c2 c! B; |7 U
  45.     for(let i=0;i<4;i++){
    " @9 t# s; f4 G* A/ p
  46.         ctx.setDebugInfo(i+"=",state.number[i]);6 \8 d, ~0 c; h. z9 I
  47.     }: z* M5 _6 f6 Z" W
  48. }/ B8 ?( x7 x4 w; c, \$ t
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    & b, h! G0 d; P) ^4 ?
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间/ D) I9 A, F' g' A$ J0 O
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放; r$ Y% `4 o5 j6 @) h. ^9 J0 f
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    2 v* v# B$ \2 q: ]1 e' L
  53.     }
    1 b* h4 k$ \5 P4 W& m- `$ q) l' o# e
  54.     return nu;//返回新的播放时间. u+ W  {5 n$ i3 W" j
  55. }
    # t* K% w, C- K/ A' O- v. @
  56. function grnn(min, max) {//随机小数
    ! }9 s) ~# C3 G# k$ q
  57.     return  Math.random()*(max-min)+min;
    & L, `; \. C# B( T* y
  58. }& s2 Y' V% Y& _* C- j; L5 r( L1 H
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的$ P5 L, r9 I  g7 w7 \* [- h
  60.     // 获取列车从车库开出的距离
    ( g) N$ X4 \4 F8 [0 U  K
  61.     let railProgress = train.railProgress();
    2 j8 D' ~! @, f
  62.     // 获取当前轨道的索引  p: c, Z- C, R
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    / {$ `2 W! @: H4 Z, q6 {
  64.     // 检查当前轨道索引是否有效
    & g. }1 b, M2 q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {! @' @' Q/ M( H2 Y, U; K
  66.         // 获取当前路径数据对象
    . ?. t% p7 Q4 s, b! h: l" I0 e
  67.         let currentPathData = train.path().get(currentRailIndex);
    1 V  |- }8 c+ L; z" p
  68.         // 获取当前轨道使用的自定义轨道名称
      \: d: f) W( k+ a6 G, O
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    1 m( p6 D; Z1 b1 F  E
  70.         return trackModelKey;. ^7 l8 y$ ]% n8 G/ ?* k) T4 v. f
  71.     }
    8 g: @; ?+ {/ |, V$ [" D
  72.     return null; // 或者是一个默认值
    7 H" t6 a. S* d
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错% B, @# n- E2 }$ l# I; ]- [% @' I
有事加我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:049 s- u2 S$ r7 D
bve声音要方便一些吧,他有可视化可预览的编辑工具
- r' U& h2 e- L9 ~# L
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 - E" c6 a& s  B1 M1 n
) e& p# Q0 k) U3 O' m. v9 {; F0 B
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
2 [6 r5 A7 @8 N2 ?! Y& d' V9 ~+ X$ K) G
huliawsl 发表于 2024-5-17 21:120 ~$ @# h( J! e3 q: V) F
相较于此,我还是认为bve格式会更简单

! D: k. ~2 W. m; W& A$ B- ], m🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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