开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
" r+ }" l' |% }, A+ W0 F1 i# f
. u4 A% q+ m1 O7 [; k+ }+ _, ~$ X, W( n! l; L4 \" Q5 |
最近在研究JS 做了一个简单的逻辑来播放声音7 x6 y1 v0 J9 @5 \8 Z2 R; l/ _
  1. var pit = 1;//初始化音高(速度)
    % W1 x' s' Y. B% r4 f
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    3 M. b' z8 }" S, `
  3. function create(ctx, state, train) {
    $ n4 R1 l3 u9 z' a; ]' ~& k: F. t
  4.     state.number = new Array();; u7 i$ e) ^# b2 C' T6 m  a3 m
  5.     state.soundsspeed = 0;//初始化速度4 \, O$ [: I% h8 U  d
  6.     state.speedsub = 0;0 G5 L. V* I4 }5 G
  7.     for(let i = 0; i < 100; i++){
    , c7 q# q; W/ h2 F' O3 a
  8.         state.number[i]=0;//初始化数组
    * y1 {6 O. C7 H1 O% B' i3 L' }
  9.     }
    ( K! S2 k7 N+ V5 g. y
  10. }$ y6 n2 [! G( ~" k( M) z5 U  b; Q

  11. ! J4 n$ V9 T" C- c- T
  12. function render(ctx, state, train) {
    " r0 I0 n7 y9 ~2 w& z
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    - r. @9 S- x7 K' l( ~- F
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    * o# U6 E/ T2 N3 d' T7 B
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    6 \: x* e8 L$ d4 m  ?9 G5 @
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    - |  }; H; \, Z- C: Z2 m+ G
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    2 z  v8 q; Y9 R4 i2 |  K( V2 Z' }
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    , ^) R, |' s1 Q( I
  19.         for (let i = 0; i < train.trainCars(); i++) {  r- _3 b+ [# ?! Z3 c5 s! t0 k3 [
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启" Y  N9 C3 l- q- U) R$ E+ D
  21.             if(state.speedsub<-1){//如果车辆减速  X2 h8 S3 p. W' u0 z
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    . Z/ M: E0 ?0 H3 w3 r& }5 i4 [: Q
  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
    6 O) r8 @) P/ S1 [* w4 }) T" k1 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);//更新返回时间 播放刹车声在转向架23 Y# O* M' d4 u: n' G$ g+ S/ S
  25.             }else if(state.speedsub>1){//如果车辆加速2 ?0 y* l5 n+ m' v+ _$ O( g
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    / g+ k; r, B/ s. ]
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声; F5 ]% i2 Y  V  i* B
  28.             }
    ! @; d  j+ n: F( b/ a' j
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    0 ^$ Z+ b2 Q7 E8 A' C
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声3 p6 J0 y$ S+ U
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    , h0 H0 ^# h+ ?7 z
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    - F; G* E5 F8 `8 d3 h# A9 s8 s. I
  33.             }/ ^7 Y) V1 {8 p% C' W; _
  34.             if(train.speed()*20*3.6>5){
    ' E. K* d, g. d8 i& M* k
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声! Y1 _& C! l( O, x
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声5 x* C& r( i& L! x- O# i
  37.             }
    / D: i* {* q7 b2 E, _4 e0 \/ n0 r* t
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){. ~: B* s# y7 U- A/ i
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    9 F# L. w7 F4 ^6 J
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声2 U) f2 @5 b% d8 Q2 F! |
  41.             }
    9 P+ V9 s& d7 @/ f1 N
  42.         }
    0 h3 ]/ t5 B- {. e: Z
  43.     }
    5 `7 V' n% q' m; W3 C' _
  44.     state.soundsspeed = train.speed();//更新速度0 K/ }) i" I9 r$ |" P5 ~
  45.     for(let i=0;i<4;i++){
    ' g) a2 C! j8 C9 L; [2 Q. U1 W! S
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    6 u  G" c' t* i; Q$ h* v& n0 x+ y
  47.     }
    / m9 @7 G+ C) f4 C4 t: v  x
  48. }
    ; N& M9 T" K  A  ~  g4 S
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    : B) d& y7 L! h% J  ^' m4 O3 Y
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; \' G  T! h$ j) `* l2 j( r8 `* j
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    % j4 E' N, V& T* G) R  N" `$ ~
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    4 Y; h' M9 V  }
  53.     }
    . u3 T# w; I6 n( [9 u
  54.     return nu;//返回新的播放时间; [8 W, o" k  q0 O
  55. }# Y7 k1 I, g+ i, P
  56. function grnn(min, max) {//随机小数; N! C! U  Q1 z5 |0 H% D. w
  57.     return  Math.random()*(max-min)+min;7 K; t6 P7 ~# V/ ?
  58. }
    6 H) l' Z# A% v4 O1 F
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的6 V9 u# \; P, D& w2 @# v
  60.     // 获取列车从车库开出的距离5 H8 k6 g3 T5 _' t" Z. D, J
  61.     let railProgress = train.railProgress();
    . o! m5 H. A9 _3 M4 v. }' \
  62.     // 获取当前轨道的索引
    ' l7 G2 ]7 Q6 a- {4 t, |2 K' u9 c
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 M# ~' I1 I, A9 V- [1 o
  64.     // 检查当前轨道索引是否有效
    0 I5 q7 \3 w9 v
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {6 i7 S  l8 B! M4 Z
  66.         // 获取当前路径数据对象
    ' a) j6 J. l0 ~2 z! h% m
  67.         let currentPathData = train.path().get(currentRailIndex);' P4 d0 T8 V* ]$ ?9 k/ L; V
  68.         // 获取当前轨道使用的自定义轨道名称
    3 E. Y! u% \  S, p' G
  69.         let trackModelKey = currentPathData.rail.getModelKey();7 W' R6 V* d9 G9 _
  70.         return trackModelKey;
    3 h6 e8 s  y& t4 s$ [6 x6 q! ~! W
  71.     }
    , C2 g* Z. A- O( v
  72.     return null; // 或者是一个默认值5 z/ f* Z8 a0 p/ s  W# z
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错9 v  j1 `; t3 q1 @! r+ ]2 t* 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/ \: }/ W2 n+ s" z. c! w
bve声音要方便一些吧,他有可视化可预览的编辑工具

3 O: Q; ~3 F# m2 I7 k. S( {嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ) X  a4 G/ l: i' V' E( O2 Q
7 |2 F! V: U+ C) C
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 8 o5 j! N) X$ c: n$ c; R  I" v! Y' @
huliawsl 发表于 2024-5-17 21:12
+ }8 {. O1 f# m  T8 {. }& \6 D( m% d& P1 C相较于此,我还是认为bve格式会更简单

% ^: u& o% E( i  R🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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