开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 0 L2 o6 B- t- O. ~( ^7 l" ?& A
8 L9 p6 F3 _' E+ ~

' c& f) i* x1 V; ?最近在研究JS 做了一个简单的逻辑来播放声音
/ B- o1 Q$ v7 S" Y) k5 c( F! M
  1. var pit = 1;//初始化音高(速度)) j( T6 g; }$ h8 \4 {
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]  ~, P! Y. A, e! \
  3. function create(ctx, state, train) {0 U6 f: k" W5 c5 B! R
  4.     state.number = new Array();
    9 @5 s8 X$ ?8 V1 C7 L
  5.     state.soundsspeed = 0;//初始化速度
    . B& G: l9 @, o2 A
  6.     state.speedsub = 0;3 Z/ s1 E6 P, n% T' i
  7.     for(let i = 0; i < 100; i++){# `. i; n: b3 x. ~* K. E
  8.         state.number[i]=0;//初始化数组
    , ~6 Y: O3 b5 _! I( @5 m# V) ^& D
  9.     }! y9 f1 f: o1 Y1 e) X' T& n
  10. }1 y& T% `+ G3 G: U. G! Y* m/ d; q& G$ |
  11. / d" @" I/ P1 E& a
  12. function render(ctx, state, train) {+ Y1 J, c1 D5 D
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    + h/ Q/ ^' g3 T# K: Z
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ) B& w! p$ t9 N5 P* h, _1 t
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    , @! E  i; Q) b
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    9 ]- y0 [. E) p, y5 Q# H
  17.     ctx.setDebugInfo("speedsub=",state.speedsub): ^! \+ w& Q& |6 `5 c) w
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    . x) _5 a; S' @0 H; ?, @' V) O( n& L3 Z
  19.         for (let i = 0; i < train.trainCars(); i++) {! I1 o4 x: ^5 q- R& A& H" g* b
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启2 L6 ]' \  q" z- F  A; S5 L$ \# a
  21.             if(state.speedsub<-1){//如果车辆减速
    * }" l" I$ |4 i, w; e
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    7 h+ {4 L# [8 l: Y  X6 {! e  A
  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/ [: I& S9 M2 J5 f- E% x7 Y
  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& n' C* W0 V9 j+ N2 c8 ~
  25.             }else if(state.speedsub>1){//如果车辆加速
    / d$ `$ f! g6 t
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速5 {8 |) y. \- p+ c3 y; |1 t
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    8 N- E# F( m$ P2 Q
  28.             }
    5 p4 I2 t: Z) Z8 `/ P
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    7 _' V( k$ {& s9 K  B. j5 l! X* Y
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ( I: C) {; V+ M% U9 k/ L: T0 K
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启( w! }9 W9 t0 a+ V; |  @. i, G
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ T+ y* `" q* C! y8 H' v8 B7 z2 y
  33.             }
    ) D+ y& Z8 [, a0 l
  34.             if(train.speed()*20*3.6>5){' B4 z2 J4 M4 w1 f5 L$ s
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声: `; @: F8 i/ J2 j  _7 Q
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    3 P0 Z! K6 Y  `+ I. l' H+ C
  37.             }0 y* q+ C/ }9 D! d" A$ Y+ B* a% X" Z/ x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    & b/ |. w$ _! g; Z4 e
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声8 y9 M: B6 u8 `/ m. @# n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    5 r# l, K6 u9 z! e- D) M2 m
  41.             }
    ! t. _6 l  Q0 L; x- K  C2 G8 m
  42.         }; s+ l) k3 h4 q' ^
  43.     }
    6 ?; M9 K, T/ G0 C! B1 _
  44.     state.soundsspeed = train.speed();//更新速度6 F, c6 ]' K; A! b' p7 e6 |
  45.     for(let i=0;i<4;i++){
    % w, y/ z' |0 }* G
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    # O# F8 k0 i  P$ B0 W  f) c
  47.     }% u' z- f1 r/ x0 }: y0 _& I3 V
  48. }; e$ o: z" b' c, z0 z; x& @
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间3 E  t# w, l2 j6 M2 Y
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 q- M6 a4 Z  {8 j2 ^2 T
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放0 m" w% x! u9 e! z
  52.         nu = Timing.elapsed()+long;   //更新播放时间% ^/ v: ^- T$ Z) |
  53.     }% z. M3 o* ]6 K
  54.     return nu;//返回新的播放时间! z6 ?+ j: K0 t& r
  55. }
    % z( C0 x. ?' e  c$ `
  56. function grnn(min, max) {//随机小数
    * e( O. m, W- J$ U' x
  57.     return  Math.random()*(max-min)+min;5 D+ W3 r8 d+ j$ T
  58. }! ^( N# O$ r: P$ I+ Z3 i2 B
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的1 n. @/ ]7 n; q5 i- w" {* T
  60.     // 获取列车从车库开出的距离
    3 R. A, h* {2 @' E3 x
  61.     let railProgress = train.railProgress();0 j, v7 g$ g- e
  62.     // 获取当前轨道的索引( d" q! x  W- u
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);3 A. U' G" \! m  K* S
  64.     // 检查当前轨道索引是否有效
    0 y4 t' W0 L0 p3 b( ~
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    % T' L1 ~. ~  U" p$ v! k& H& b
  66.         // 获取当前路径数据对象0 Q5 k& Q* ~4 l/ Z% K. n
  67.         let currentPathData = train.path().get(currentRailIndex);
    - g  G8 u* n$ V9 m" o# ^: A
  68.         // 获取当前轨道使用的自定义轨道名称( L* W7 T' z" j( n- U
  69.         let trackModelKey = currentPathData.rail.getModelKey();* z$ ^% w9 y& j7 W, b" ]
  70.         return trackModelKey;
      E5 Z: L: j" J2 B0 F
  71.     }; g1 p" ^! K3 _. \1 ~
  72.     return null; // 或者是一个默认值. F7 w( L: @+ V* g
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错" a# ^! P  T# ~7 W3 L. j9 u
有事加我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
( r& d. a7 A- P! Pbve声音要方便一些吧,他有可视化可预览的编辑工具
: u; F' ~" H8 i* w
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
* g9 _' [6 B; E# I  E" E% T7 @# Y9 C, A+ A6 h, L* i0 ]
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 / U. g; i: ?: u  G8 c3 R
huliawsl 发表于 2024-5-17 21:12
1 n; {+ }1 G$ D) X, m0 n& n: T相较于此,我还是认为bve格式会更简单
' P0 q0 G9 ~! Y: A4 [' Q( B
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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