开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
! T( o( g' {5 [0 q* r& N) O2 Q% ~) _! C( O& {2 A& R: }7 _' H# [

6 H+ S4 H1 c& Y- z: I2 F最近在研究JS 做了一个简单的逻辑来播放声音- @% N% A0 h5 N
  1. var pit = 1;//初始化音高(速度)
    4 h3 `* t3 z9 p2 J
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    " t7 J6 s: p0 g. j% c
  3. function create(ctx, state, train) {3 ?* R2 _& j) a3 B. E
  4.     state.number = new Array();
    7 k1 I# W* n; P: g' ^. T/ w( C
  5.     state.soundsspeed = 0;//初始化速度
    " ?1 W8 n" I2 F0 E0 Y
  6.     state.speedsub = 0;
    ( O5 ~0 s! v" u! d6 b* M7 y2 X$ b  T
  7.     for(let i = 0; i < 100; i++){
    8 e- E4 J8 A( `: _' J; _
  8.         state.number[i]=0;//初始化数组5 Z+ R/ N; a0 b: k# J' F6 F
  9.     }
    4 x' z# y' z( ^( n1 Q0 f
  10. }
    ( }% }/ ~5 \/ G/ h' Y
  11. & O2 o9 g7 ]( n; Y+ a8 k% @
  12. function render(ctx, state, train) {% O1 l* ]7 {: I5 N1 o3 S
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    $ r) b' o7 R' t7 x, D2 s
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)- z1 r  B# \5 v- R
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ( o8 z6 \' ~0 N$ A
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ! F- V; v7 o! c; Z/ f- a7 x" G
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    5 J4 v0 D; a4 y1 K& g4 f
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作9 F) S" p5 z4 W) m: t4 |
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ( Y, G# ]  |$ c7 {8 g; W
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    + i$ Q' ?7 b+ }( P% b
  21.             if(state.speedsub<-1){//如果车辆减速7 |' g. B& n( f* f* K
  22.                 ctx.setDebugInfo("shache",1);//记录刹车  {0 ^# Q' Q: C
  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% G. W1 f) i. S1 G* p
  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* Z7 K) X- k* ]7 q
  25.             }else if(state.speedsub>1){//如果车辆加速- e: n: r+ k: z( q2 t; b
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    6 _* j. L3 f% k8 d6 X  e! x
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ' L8 I+ w6 j6 Y9 B. t
  28.             }7 |& a, c+ i6 c  ^+ b# |$ H3 T
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声' R: n4 ^0 y: m) r2 Z# x- C& z
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    3 v/ W  E6 F' i1 Y0 z
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启5 R# k6 Q& \+ G5 ~/ k
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    9 S. r0 `. s3 p$ R" j- j' s
  33.             }
    / ^6 b% k7 b) l8 N- q2 k) S/ [2 k
  34.             if(train.speed()*20*3.6>5){
      _- y4 d6 P+ U6 {/ i3 i
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声8 e  Q) t# s4 g- G( c
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声. H/ n# u6 W2 \/ q( ~' S
  37.             }6 Z* E. N$ t0 V! o0 L% m
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
      L) n1 e* _- Z* K
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 o" e, V, s. [! @; K6 x- |
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    $ ?% R" Q9 [$ x; d. M; ]
  41.             }! R5 Q6 x5 d0 P/ u* l2 [$ ]
  42.         }8 a/ y2 }2 ^8 c
  43.     }1 w8 N3 E7 g( |- ?% A. ~/ E
  44.     state.soundsspeed = train.speed();//更新速度4 b  ?9 _$ X1 D: a! H% N
  45.     for(let i=0;i<4;i++){$ t- b. h5 R- f( C
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    * o: W, H6 D- r% j" R. I$ V
  47.     }0 x0 ?4 H- F7 D, J4 r3 w9 g
  48. }
    ! J+ K% m4 L* v5 R' g6 Z! A& v: v
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    : v+ O" B" F& z7 G0 R9 `: J" @' {  p
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; s* x8 Z6 w* H+ [" q
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放7 N( f  D5 z' r$ e- |: S
  52.         nu = Timing.elapsed()+long;   //更新播放时间0 \, ^# P- J& a) n7 p! m
  53.     }
    ) \7 I/ }* T' }! u" e( t$ @
  54.     return nu;//返回新的播放时间
    . W1 n) E& m  t
  55. }
    9 i. q6 M! }; U3 c. X3 C2 [
  56. function grnn(min, max) {//随机小数, J% _3 l) z/ q! z: a7 ?# K
  57.     return  Math.random()*(max-min)+min;; `: \6 n5 ]* T$ y; s
  58. }
    7 {2 G7 p5 O# p0 r3 |
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的5 u' N- m' [; F6 X
  60.     // 获取列车从车库开出的距离  s9 W" D. I2 f0 i
  61.     let railProgress = train.railProgress();
    : @' w0 B  F2 k
  62.     // 获取当前轨道的索引; J( @" W- r. ^" U9 R
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    5 q1 s' R  `+ s
  64.     // 检查当前轨道索引是否有效
    $ {5 J% x" h, X) u, Z
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    1 b5 k& W: Q+ A0 K
  66.         // 获取当前路径数据对象
    & q; Y# S  h, R% w# w+ H
  67.         let currentPathData = train.path().get(currentRailIndex);
    $ L9 K" z) I6 B! l  ?+ x8 B
  68.         // 获取当前轨道使用的自定义轨道名称
    9 f0 b. h2 w" C
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    7 K$ H3 M/ @; R3 [: c! R9 q6 L- M
  70.         return trackModelKey;
    # q& [4 g, e+ T* j8 R
  71.     }6 i+ }/ i0 M% e
  72.     return null; // 或者是一个默认值
    ) m. ^6 e  K$ p6 l
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错! U! j- P7 k' b) z) s$ \
有事加我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
3 E7 i9 x5 F1 B5 `( S: ~bve声音要方便一些吧,他有可视化可预览的编辑工具

, A2 c" r* d3 h# L- i! F0 F: ^嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 8 ?( M* [, @6 k! _, |

4 u& I5 v( Y) G+ Z0 O6 n/ K相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ) a2 ^, @/ e3 i% [" ~: l4 k/ B
huliawsl 发表于 2024-5-17 21:12
- w( w% ^8 c- E" F# Y相较于此,我还是认为bve格式会更简单

5 A) ]* Y/ e: o/ q🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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