开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 : e" Q- w0 a* G7 v" J
2 e7 |( r, \; F' [: R+ w2 D0 v+ d: u
: h* j$ e: c5 d/ `6 i( a
最近在研究JS 做了一个简单的逻辑来播放声音# A( k4 e/ v1 r6 C
  1. var pit = 1;//初始化音高(速度)3 x+ b* ?! D' C* K
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    1 I. l, V1 x5 @+ {: h+ x2 K
  3. function create(ctx, state, train) {) Q& P9 G1 D+ y, [" i  s; W
  4.     state.number = new Array();6 S6 o- _. h* |" L
  5.     state.soundsspeed = 0;//初始化速度- r- r, w1 h( N: A+ g& L
  6.     state.speedsub = 0;) G9 x1 I5 R% D$ v( Z' u3 m; b  H, U
  7.     for(let i = 0; i < 100; i++){: L; H5 \! M6 H0 R
  8.         state.number[i]=0;//初始化数组
    ! M& c! n. i1 K$ X8 o7 m% f
  9.     }
    , @! P+ {0 F1 ^9 b4 s: Q! D: M  L
  10. }8 A3 ~6 M1 v, K& D4 @( M
  11. $ i* F7 _3 T; z' h) i9 `6 _& @  W
  12. function render(ctx, state, train) {  F/ p' O* d9 Z1 L7 ~
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动; I2 u6 W' X7 m: S$ B, \1 G
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ) y  p$ J$ O6 V" N
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    8 E! r* D* B3 B' x' C; a
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    - p9 E0 L8 `, s. m4 R
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)& j) ^' N4 A: n' `8 d5 z0 J' B
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作4 y' N+ ^/ W0 K  |/ m! n7 z
  19.         for (let i = 0; i < train.trainCars(); i++) {" `' R3 \$ `5 K+ r
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    5 }& G! J( D3 w
  21.             if(state.speedsub<-1){//如果车辆减速; J: n1 O4 n1 O* }; F3 q6 ^
  22.                 ctx.setDebugInfo("shache",1);//记录刹车, w" G2 u# i. {3 ^  V' \) Q9 u& d
  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);//更新返回时间 播放刹车声在转向架14 o3 p' I2 u$ \7 U
  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( U, w* b6 t' m9 G! P  G* a  s
  25.             }else if(state.speedsub>1){//如果车辆加速
    ( c% t( g) j, P" }
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速" c& I# v. E. W7 N3 ^' j9 U# o5 M- m1 u
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ; a' C: Q$ n/ \/ m9 X
  28.             }
    % V6 z1 ]' ]- i7 f7 p0 c
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声) L* t* I% S* r2 X1 Q$ z8 _/ y3 [
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声; }. Z& X# T9 S% A; O
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    4 r9 u% ^' K% W0 [; ~& m5 j" W: g1 t
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右7 |& e( j+ G  B9 @- j
  33.             }
    ) s3 _+ n6 K, v% u* F# D
  34.             if(train.speed()*20*3.6>5){
    * @. o9 E4 J8 j6 `, B- Q
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声7 ?+ t; G+ A! l" u  v# z1 }; I
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声, E! a# D! V: ~0 {- ?/ K
  37.             }5 c# Q) n2 S% S
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){( ~* {' M( u8 }1 k; T5 s
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    8 d+ T9 s, p1 I
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声4 C! D. Y" F' u: R4 w# A
  41.             }/ S) |: M. v% {* C. x
  42.         }
    ! z+ \& c2 Z/ m& f8 L; P4 s
  43.     }
    ; m& T: y) m! J  i9 S
  44.     state.soundsspeed = train.speed();//更新速度1 E8 ~6 C3 h4 q) x0 j" l
  45.     for(let i=0;i<4;i++){
    . C2 J) A7 B9 J7 r
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ! U4 s8 y8 H& K& q1 S4 C
  47.     }
    . L! L1 G: D5 C+ c
  48. }' n' C0 {: A; n' v  q& c( Y
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间) p  C, d* S' |* l: I3 M
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间+ p- G7 a. Q. j: N1 X
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放) ^1 u" P, b0 P$ ^: ]* T
  52.         nu = Timing.elapsed()+long;   //更新播放时间; z& }( }2 _5 B3 S" U& ]
  53.     }
    ' o6 y' @' B  G5 h1 t
  54.     return nu;//返回新的播放时间
    : @$ p$ F" G* G1 L% X8 ?/ N6 h
  55. }, D* i. M, B( F% ]6 Q7 o3 I6 [5 k
  56. function grnn(min, max) {//随机小数
    2 n* Z! m5 V. ^; d/ O
  57.     return  Math.random()*(max-min)+min;  z* F! Z6 |- W; `
  58. }" h! _5 Z! [0 ~+ B5 |' h, I2 E
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    % K# |9 ^# s: ?" U1 m: j
  60.     // 获取列车从车库开出的距离
    " b4 i& j. a8 }$ e
  61.     let railProgress = train.railProgress();
    2 B1 F+ s# @, h+ i3 r
  62.     // 获取当前轨道的索引
    1 j( }. Y& [. ]* `% H6 y
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    9 k2 O6 v7 e" X  d
  64.     // 检查当前轨道索引是否有效
    $ h; G$ L( @$ w; {* ?! q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {0 ~( h% T. A$ K$ O1 Y" H
  66.         // 获取当前路径数据对象4 m3 W8 |$ g2 f; M# |/ _
  67.         let currentPathData = train.path().get(currentRailIndex);- L7 n! u. u: |% ?2 w+ b
  68.         // 获取当前轨道使用的自定义轨道名称
    6 R6 W9 G% g1 u% q7 D5 k( u
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    ( G5 ?$ r' U5 \% N
  70.         return trackModelKey;8 ~8 I8 _8 N* r1 m0 {
  71.     }+ g& n  d5 [- ^- B% y, S8 B9 H' I
  72.     return null; // 或者是一个默认值+ Z* K  R1 a- G
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错5 `" U& j9 i2 @
有事加我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
: b" a% [& f% S; J1 `& Dbve声音要方便一些吧,他有可视化可预览的编辑工具
8 ~& |' X/ y5 O" B3 A; U3 M) N
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 7 Q( F) l; P! z- }8 i; d9 H

( N" K$ ?. |# |/ \相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
: @8 }3 W3 h. ]7 F
huliawsl 发表于 2024-5-17 21:12
# O& G. D" d, n% B相较于此,我还是认为bve格式会更简单
) I5 E' r  m" c/ M
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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