开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
6 j& r  x" O) Z1 ^* J- E1 I. l0 y, b7 d9 d  W

& ]7 I0 c' b! D7 z6 r5 z" u; l+ \# B最近在研究JS 做了一个简单的逻辑来播放声音
1 S+ ^- K2 J  m5 I  }  g
  1. var pit = 1;//初始化音高(速度)& u  b- x2 N6 H
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]+ c" C$ u% S0 F2 d) }2 C
  3. function create(ctx, state, train) {
    - R! N' A; _5 W
  4.     state.number = new Array();; l/ x+ a, H! R2 u
  5.     state.soundsspeed = 0;//初始化速度  z4 R' p$ N, q
  6.     state.speedsub = 0;
    6 x0 }& K7 t3 \0 r8 Z; t# f7 T& {
  7.     for(let i = 0; i < 100; i++){3 S* j  d. @$ ?7 k& Q
  8.         state.number[i]=0;//初始化数组) L( M; O; D' b" R0 E0 |
  9.     }
    & s+ T6 {$ l0 `' O" ]' |
  10. }9 F/ Z; y6 _6 D* d
  11. ) v& q$ O% q) F1 Y* O
  12. function render(ctx, state, train) {1 R3 H7 D+ ]- Z* h
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    2 X8 M% X" y  F4 K0 H
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    3 o7 Y4 Y" Y  J; b. o
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    $ R& V) S4 r- x( X# f5 n
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差4 \# |# e* B$ w- i0 F
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)  t9 B. |: _& X6 K6 K: Y  l
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    - s5 b3 p' ?" u0 \( y! Z* i; i
  19.         for (let i = 0; i < train.trainCars(); i++) {3 w! N/ C3 v( d8 B
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启5 h7 m0 E- ~. ]+ R# S
  21.             if(state.speedsub<-1){//如果车辆减速
    4 U+ {5 j& W8 N! e' o1 Q5 q; ^: N  P
  22.                 ctx.setDebugInfo("shache",1);//记录刹车! ^& ^. R* h: ~
  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
    7 f2 M% f- M& i1 T3 G. ]$ q) i2 _6 [
  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
    0 I, Z8 G+ _* L' a. y* U
  25.             }else if(state.speedsub>1){//如果车辆加速! j5 u' u, y; Q) ]$ O8 x1 g
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    4 f& k* P# _# C5 m) l
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    2 N' u$ f# Q' M) Y- f( a
  28.             }7 `# i6 L9 C* z: m, w- v4 b. V/ O
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    0 C8 q) w; L0 {6 a+ j
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    / ]9 Y$ C. W& f' a$ j
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启1 J8 t$ J! r; p2 q0 |4 L
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右! ~( {( T; E! y% P; X$ c
  33.             }; w/ f; f; A; w6 D9 K0 c
  34.             if(train.speed()*20*3.6>5){
    0 Y# e3 g2 N; t0 p
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    $ W$ M6 ]' }7 I
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    , f2 B3 i+ t. ?9 B" b" P
  37.             }
    ( y( Q) l! h$ h9 V* y
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ; t' h& [6 ~: \/ t  Q* g) X
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声  C3 Y' g0 W# N* h
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    & \9 ?0 z' s4 w
  41.             }
    ! A! f7 ^9 ?! @7 ~
  42.         }
    " D( U/ N4 A8 j' b
  43.     }
    ; }9 D2 }) G" Y/ x7 E
  44.     state.soundsspeed = train.speed();//更新速度1 ?% u: d( q* [& q/ @( Q' |
  45.     for(let i=0;i<4;i++){
    * v- S; {" e4 P; j; m  c: j
  46.         ctx.setDebugInfo(i+"=",state.number[i]);+ l8 o: T6 A4 j; Z% p( R9 g5 n2 q( q7 K- {
  47.     }
    7 M2 b3 ?0 ~9 N/ m! K$ j
  48. }0 J& a3 t) Z5 ?* V: U' @
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ! O- v) ~* J3 H0 r1 O
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间, M% u8 \( D/ g! z) X$ n: h
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放& K: r! {& A1 d9 B
  52.         nu = Timing.elapsed()+long;   //更新播放时间& e2 I2 U7 r0 `8 D1 |( D
  53.     }- N' z' Y  z( M5 q) A+ B: x1 x
  54.     return nu;//返回新的播放时间
    1 L$ f/ |* i. S6 N! C3 a& k) D
  55. }
    6 x( @% h$ y: w4 Q( `+ k
  56. function grnn(min, max) {//随机小数) ?( a# l& ^: T' C
  57.     return  Math.random()*(max-min)+min;' O9 j9 o$ L6 q) P+ c( N
  58. }. O) L2 @4 f% l. N
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的8 P. J" Z8 m* r. V
  60.     // 获取列车从车库开出的距离
    % m4 b  d  U% H0 E3 }" H& x/ j
  61.     let railProgress = train.railProgress();; g4 i: u* K6 v
  62.     // 获取当前轨道的索引
    3 O1 P; k8 L8 Y1 W: w7 b: e# {
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);* t( s7 A" b" t- ^' A; z( K
  64.     // 检查当前轨道索引是否有效# \' \; I/ B1 N8 M
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    $ Z) {) ~! |- X  p
  66.         // 获取当前路径数据对象+ r  r6 y- U7 J  e$ c: n3 N
  67.         let currentPathData = train.path().get(currentRailIndex);, A# ~% `& |( X; G/ O$ p
  68.         // 获取当前轨道使用的自定义轨道名称' P% A" K# `+ l3 S% C; D
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    : b- t6 Z# E/ n1 h
  70.         return trackModelKey;; d1 G( s, Y( j# i2 A% f& G
  71.     }
    : A) ~. D( |& `2 H0 L  s
  72.     return null; // 或者是一个默认值5 j" h; A: F# I/ u% }  w4 m
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错" T9 }; q" b' F/ e% F8 A
有事加我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' W7 D7 M0 A" @' n/ E* O
bve声音要方便一些吧,他有可视化可预览的编辑工具
+ Q$ i6 ?3 E+ V
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ( o3 n( Y. @8 o( N8 {+ r
4 m+ h" L  U, y
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
! ~5 K; `* W& e
huliawsl 发表于 2024-5-17 21:12
$ J0 J  A8 h! o, f3 i6 B相较于此,我还是认为bve格式会更简单

$ W$ V" V4 l; U🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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