开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
: g4 ^7 ^( W- ?6 X6 Y+ c
; z6 B- X  I( ^3 S& g: Y. Y  R( Z7 d3 S! f# X
最近在研究JS 做了一个简单的逻辑来播放声音
2 h1 R$ a6 I8 B2 U' B
  1. var pit = 1;//初始化音高(速度)
    : i9 M( V/ M: y7 Z0 {1 T
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    & R* Y6 T1 ~1 I
  3. function create(ctx, state, train) {' ?/ f( n" X9 @5 G5 Z8 p; k
  4.     state.number = new Array();
    * T1 ~" Z$ R% Z) L4 |
  5.     state.soundsspeed = 0;//初始化速度
    4 K) c/ @8 M. P1 c7 @
  6.     state.speedsub = 0;
    ' K' a3 r. r1 Q$ Y$ _% V
  7.     for(let i = 0; i < 100; i++){
    ! _; g% k: c; C' Y/ I- e. A
  8.         state.number[i]=0;//初始化数组+ p) M, Y3 Z- c3 ?
  9.     }9 m+ A) U8 i6 w6 X" V1 ~) R
  10. }
    ) M! |. M, Q4 O: H& u7 e0 z7 }( d, i
  11. + D, s; Y" ~; m3 t+ O  T
  12. function render(ctx, state, train) {
    : F: Z2 A; m9 U1 d/ d8 H4 E
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ( ^7 \1 {/ P4 i8 |0 n
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)6 O; g6 c: A  A  b) {' _
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    3 w# `4 K+ P4 b
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差; y. y- z- T- }) v2 y: }5 }: z
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    / U+ P" I, f+ g  K; [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    % h9 Q+ P6 y( \2 V
  19.         for (let i = 0; i < train.trainCars(); i++) {1 C% n% w/ I; c, ^: R
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启/ R0 s: `, y9 p% R
  21.             if(state.speedsub<-1){//如果车辆减速
    ! N/ E, d! E( C
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    & D& l( e: H9 h. p1 b9 r
  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
      m$ ]9 E. D3 V, o6 H
  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);//更新返回时间 播放刹车声在转向架21 J; }) ?, `5 H- Z  Y
  25.             }else if(state.speedsub>1){//如果车辆加速/ G; ~. S9 h2 _
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    " k8 v5 ~, [  Q" N" |, t- Q
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ' ^' x: T* J. O! A3 U8 a  k) H9 e
  28.             }0 P. I1 Q; H: D: r, H5 m, i
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    , b5 }+ P' q' Q8 r, h
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    6 J0 |0 f* j0 J9 r5 V0 ~
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启9 i. G% z$ @3 @! [
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    8 ~: c5 e8 p) ~
  33.             }8 r& ?- O; D  y4 |
  34.             if(train.speed()*20*3.6>5){
    # g, b! I. w6 o. ^9 D
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ) X7 Q# `4 F8 j  ^0 V5 D/ T
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    7 x1 R5 t3 \5 p& B
  37.             }; f* F$ _, r- u" j2 N1 L
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){8 O3 a. B5 }& J) ^' k9 l
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    2 ~  G3 j& p) V9 Y
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声* Y( u" ?+ Z' J2 \1 C8 h
  41.             }/ s3 J, r) @$ p4 Z$ I1 r
  42.         }
      p/ D' f7 e+ J: g7 k# n7 v
  43.     }
      r  l' m# s- G& A1 L
  44.     state.soundsspeed = train.speed();//更新速度
    6 S& |* u. e& a
  45.     for(let i=0;i<4;i++){
    , W% O+ a  [% ?2 s
  46.         ctx.setDebugInfo(i+"=",state.number[i]);; L' I" z' V& i  h
  47.     }
    2 D: C+ [- a8 t4 O& V2 }
  48. }
    , s5 [. H9 N! {+ t2 Z' G4 `3 F
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间9 f' k& |, x$ @
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    9 {9 S+ p8 p" `8 V7 F5 c
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    / p  K" x8 D& F, {2 O4 x
  52.         nu = Timing.elapsed()+long;   //更新播放时间. b1 ^, {! H' o8 M9 l
  53.     }2 L, W: B9 [- e' y* [) K' }9 A6 @# q
  54.     return nu;//返回新的播放时间
    ; V$ }8 r9 Y7 L7 Z* U' W; d
  55. }
    ! Y2 x+ q0 c1 q! ]/ x. S
  56. function grnn(min, max) {//随机小数
    . S  c* Q; K9 E3 j+ X8 y
  57.     return  Math.random()*(max-min)+min;
    , p/ F- e& K, Y0 o" @- h5 Q
  58. }
    0 u. k% n" B3 S1 i! V+ S6 C
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的) m4 \* K$ |0 I& d2 `: t2 i
  60.     // 获取列车从车库开出的距离) |! H, O+ n7 v; n% `, [
  61.     let railProgress = train.railProgress();
    8 v2 r7 }# x5 {  k  {4 u6 A
  62.     // 获取当前轨道的索引
    9 f0 L9 s' G" g+ q5 P/ S% p& O: m5 F
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);) k1 p1 ?( [# I# z9 I6 z) [, Z3 ]
  64.     // 检查当前轨道索引是否有效5 l) `- F0 J1 N1 ]0 I5 C
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    0 _. U/ N# Y4 ?7 W) z
  66.         // 获取当前路径数据对象  A& x% O: l. }2 `/ u" ^
  67.         let currentPathData = train.path().get(currentRailIndex);6 F8 t2 W$ E' e& J* R  w/ f
  68.         // 获取当前轨道使用的自定义轨道名称4 x1 N6 b# f: a* F6 S
  69.         let trackModelKey = currentPathData.rail.getModelKey();. C: }. W/ l2 i6 O2 w" ^; L0 n2 K
  70.         return trackModelKey;+ M2 L6 O* _/ L, I
  71.     }
    + u! z! ?8 x' V* ?: C* B- s7 f9 Y
  72.     return null; // 或者是一个默认值  L. U) b- a+ n/ b/ z5 X; e$ {
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错# Y; s3 Z1 `- t& o% v; r
有事加我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
* a0 u( m, _5 r6 ybve声音要方便一些吧,他有可视化可预览的编辑工具

* E5 h7 S) ~1 q5 Q* E8 [6 \* v: J" [4 Y嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 / F0 r# N+ Z6 a- Z( l
. ^& m0 N& L: d
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 2 J* d5 G* J+ k/ a1 `6 v9 J% w
huliawsl 发表于 2024-5-17 21:12
4 q* U$ y1 M: Y, m0 q# u相较于此,我还是认为bve格式会更简单
$ D0 B5 P* e- A' L+ b. a; x
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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