开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 7 L  X9 @% Z" y) G( ?

6 |0 D1 y, K) a! O" m% q0 K0 }" z5 ~  [) ~2 f# J
最近在研究JS 做了一个简单的逻辑来播放声音" C$ r  j. A8 ^( f; T  R$ _* I
  1. var pit = 1;//初始化音高(速度). D; S4 e- }, I# g/ t
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ! @2 p5 d" H7 i( g
  3. function create(ctx, state, train) {
    4 Q% r" {- Q/ o2 @
  4.     state.number = new Array();
    2 @, k$ Y3 N4 A) }& z
  5.     state.soundsspeed = 0;//初始化速度1 I3 G( F. f; O- x" `3 j  l! A
  6.     state.speedsub = 0;
    2 h$ _" K% h$ Y
  7.     for(let i = 0; i < 100; i++){( j8 O9 n  m! F+ L9 {- R- U; d6 @
  8.         state.number[i]=0;//初始化数组
    . O( Q6 Y) J' p! M' T
  9.     }0 T: N" z8 @; I- C
  10. }
    8 \+ B+ C* W9 a" N" }

  11. % }4 ~& `/ x5 K
  12. function render(ctx, state, train) {# q. _) E2 s8 X( E6 a8 B
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    & q* l" {4 H7 c% Q3 K+ h: T7 Z
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' g  W& A- L. o
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ' a8 `' k) g: o  [3 J* j0 \+ L
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差4 q% f% ]2 Z( Z  o% T9 _7 m
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ! m8 d4 D& S9 ^& P( l
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    1 n, {; ^& k' j! q1 e
  19.         for (let i = 0; i < train.trainCars(); i++) {7 L1 T8 P* @# X4 a4 d; _
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    5 @; ~# ~5 j2 k- u' x% I, J5 q
  21.             if(state.speedsub<-1){//如果车辆减速* J0 g0 a( z5 S9 _& H
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : y8 r% l0 E% N! K, u- x& x
  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
    " k; g2 q) M  g1 [
  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: B" S. W& x9 v  M
  25.             }else if(state.speedsub>1){//如果车辆加速3 s3 f0 k$ k5 M: L' E
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    / Q8 `) U0 m0 \0 \1 w4 [6 {
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声8 G9 ^! U) Y. i  f! }/ x
  28.             }7 N( H+ l9 [1 ]8 p, j% z, @# M
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声! l/ n$ z6 |+ K& ]
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声% e0 p4 B! p( w. [. X% [
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    # {* j7 Y& S. x# u- y0 [* B4 N
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右/ K1 _/ P& j5 E- B
  33.             }7 e; k# w( ~9 h3 w
  34.             if(train.speed()*20*3.6>5){
    & d( d' @) m6 P% W2 {& d$ I7 m
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声1 E! {( W, M) l% U- l8 f
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声/ N: }, T: {/ {. J2 {
  37.             }
    . ]# s: m) u4 o, H' l/ b- ?
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){8 W3 A7 F" ]4 W7 ~5 D
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    + W) ^! j" Y0 M4 b& S
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声% C: ^! I4 b1 [  A6 @
  41.             }* J! O2 w6 O7 R( q, ~2 f& U8 K' z$ F
  42.         }
    8 K" H2 F* Z+ B  [  R
  43.     }* r) z( a: U+ B* E7 n0 C$ l  ?
  44.     state.soundsspeed = train.speed();//更新速度
    $ R. d# q9 [3 S# ]5 `. o
  45.     for(let i=0;i<4;i++){2 B8 B, V/ L& m
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    0 h& `2 I; |' C" R' Z
  47.     }
    & T4 Q+ [: V9 M0 m6 g
  48. }5 a2 J1 y' K8 b
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ) \  m) q+ K/ D7 P
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    - m' |1 U% F- h) o, P
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ' \3 n5 `& N  l6 ]
  52.         nu = Timing.elapsed()+long;   //更新播放时间/ K  R; u3 x  g. D  H
  53.     }% D5 K9 Y4 s* r9 I, h9 w. Q" a
  54.     return nu;//返回新的播放时间
    ( o- |* Z. }9 a: S
  55. }" ~* L- w6 d" i- F& ]
  56. function grnn(min, max) {//随机小数  o( l+ b1 g6 f  {% u! r
  57.     return  Math.random()*(max-min)+min;3 y1 _5 \& l2 M5 T
  58. }6 r2 U* i% g8 k0 |2 }$ b
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的# s" I" T  }; S) W, \! t* }" M" |% |) v
  60.     // 获取列车从车库开出的距离2 h1 {3 g0 m( v2 O/ X
  61.     let railProgress = train.railProgress();
    " p$ D8 K+ D$ i2 P
  62.     // 获取当前轨道的索引5 B. r. V- h, j4 f
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);7 U  B/ n" i* b9 c7 `
  64.     // 检查当前轨道索引是否有效) v- `2 w! N: D" \. D4 `& G+ d
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ) ^  B( T& M+ L7 r. S& m0 R9 X
  66.         // 获取当前路径数据对象
    # {% Z* `  P& e) y1 N& z
  67.         let currentPathData = train.path().get(currentRailIndex);
    + d' q" a2 F3 U* k2 Y. O
  68.         // 获取当前轨道使用的自定义轨道名称
    5 _) N) j  ~% i
  69.         let trackModelKey = currentPathData.rail.getModelKey();; |& H, _3 {' n0 _$ f4 ?
  70.         return trackModelKey;8 b+ L  Y2 O1 Q4 g' f+ p0 o& k
  71.     }# _& \: i  n$ p0 b
  72.     return null; // 或者是一个默认值# t( _. P. `1 @& ~$ h
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
# T+ x3 l3 l% j3 \# ?1 u3 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
! `7 N* X7 k# Kbve声音要方便一些吧,他有可视化可预览的编辑工具

" b& j( A: ~, S; r& R嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
2 I; w" Y( X! u9 W& H$ b+ _% d+ g# c, t( a) S* R" B+ X2 I3 n
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
! D/ v0 @6 C& f: C) u. g! D
huliawsl 发表于 2024-5-17 21:120 m# x! u. t0 }
相较于此,我还是认为bve格式会更简单

+ z+ I& y, P8 R2 z8 w2 Q) E🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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