开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 $ h& e, J8 ~5 V/ K0 a; @

  O( @/ @! N; P& O/ w2 V' q
2 ?; q* N6 u8 o: y: M* L最近在研究JS 做了一个简单的逻辑来播放声音# |: ?: Z$ k: l$ p) u* N! g  a8 |0 ^- H
  1. var pit = 1;//初始化音高(速度)
    9 d# W: i: u5 f3 U. [
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ) c2 h: y8 S4 w" c: [
  3. function create(ctx, state, train) {
    ; @2 J5 g! m: N$ u" k0 d) K5 G1 l
  4.     state.number = new Array();
    # ]; X  p' o6 h, }
  5.     state.soundsspeed = 0;//初始化速度2 }$ R3 X) Z5 b  x  p
  6.     state.speedsub = 0;0 F/ Y, h- K" ^7 d4 j( A  N9 w
  7.     for(let i = 0; i < 100; i++){: i* W/ h: ?" o! {& O4 U
  8.         state.number[i]=0;//初始化数组: }+ ?2 I- z' o: z3 E
  9.     }
    ; r1 \$ f5 S. G; B* P7 b
  10. }
    + m1 S+ X  H- I8 j) e% e. C; v
  11. . r# I3 A" U" L" }( N
  12. function render(ctx, state, train) {7 [7 W% L9 i, P) M8 k% V' q* w8 A1 T7 O
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动. R) Q- _+ y1 R/ |" U
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)6 L" p" S6 e) Y! a5 c& O# X
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    7 p7 Z7 b1 N/ N: \- c! j3 r+ `' `
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    " P- C1 k6 V4 v  B
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    / g, _/ \; a6 G. w$ f+ b  U2 [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ! k0 X, e; c9 D" i
  19.         for (let i = 0; i < train.trainCars(); i++) {
    7 K' b$ c2 E0 ]9 O: W- ?- }
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启  j( @  C8 ]* n! L" [$ q8 G8 {: U
  21.             if(state.speedsub<-1){//如果车辆减速! s( n- w7 ?$ N6 ?% X
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    7 W. H8 c! P* y4 j1 \$ J
  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! ~  Y5 }) k1 J1 s& p6 T
  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! Y" E5 t7 \- o! ]4 G
  25.             }else if(state.speedsub>1){//如果车辆加速
    1 E4 a) \$ j  w. r2 u
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    # F7 w* `$ I1 x( d+ H+ T
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声  L" M7 Y, E. ?3 P* D. O  w
  28.             }4 t( h% e6 g- Z) v
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    / j, P- c. v. H' H
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声) R6 \: G5 Q$ ?/ b) D* S1 I
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启: ~; Y' A  q( \
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右1 d: f+ l1 J. m2 T$ Z, o5 [4 k3 T
  33.             }$ y9 u; [- p: i5 R! U
  34.             if(train.speed()*20*3.6>5){' Z  p7 w& W) S3 J/ m/ E: r
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ! r2 _; a  z6 c- A! |* }
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声4 ?5 R9 x$ `, ?
  37.             }! T9 r: }% k' t3 G# _: `; s
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){4 F1 X1 k* h2 X. }' X5 H6 C  U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声- C0 Q' o* d5 Q$ }' a
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声5 P) ^) g& j- |* u$ n
  41.             }) r9 Q0 c% U4 d! k/ g+ ~2 {
  42.         }/ e( F$ C0 g- ^
  43.     }" t& B$ S' R% M; n; L/ d- m/ e" S
  44.     state.soundsspeed = train.speed();//更新速度
    * t  H0 \5 m' l4 ]# o7 i! S6 c3 v- j
  45.     for(let i=0;i<4;i++){3 X+ e' Y- M* z$ {2 U  L
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    4 `2 E: Q; B+ R1 i# \
  47.     }1 E9 Y4 c( @2 s1 M, P
  48. }
    : d- C) a8 O2 T) l% \! z1 o
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间6 U# K$ ^* m4 a  {
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    % j+ h2 U! P2 ~6 Q9 r  ~8 V
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放2 m& `* x, f3 h) t0 {+ B/ o
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    4 m6 S* V1 f- `; G( M/ D
  53.     }6 R5 f& ~  C& O3 A# m
  54.     return nu;//返回新的播放时间
    % s9 v* v4 a/ i8 f3 m3 k
  55. }
    , {5 x7 W! T! k: [/ `- f
  56. function grnn(min, max) {//随机小数7 b; r+ i9 W! r' E; S( V1 u
  57.     return  Math.random()*(max-min)+min;
    ' K; ~3 k8 ?- {; a
  58. }
    - a3 ]) Q! b; h+ _( b+ ^0 N
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的, G9 U4 x; Q4 P7 D; k3 ~( T6 {
  60.     // 获取列车从车库开出的距离; ]+ t4 q5 m, R) @4 {
  61.     let railProgress = train.railProgress();
    5 J" N; h) Y/ [& i, _! u" _
  62.     // 获取当前轨道的索引
    # Y6 y* g5 `8 P" g$ h
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    5 j( B9 Q7 `) P" q$ ]& x
  64.     // 检查当前轨道索引是否有效7 l6 s1 C6 }* B
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    & }) x* R! x  ^7 g& G
  66.         // 获取当前路径数据对象! z+ `6 K2 P0 }* K0 t
  67.         let currentPathData = train.path().get(currentRailIndex);) A$ Q5 g" y+ n6 F' \/ m
  68.         // 获取当前轨道使用的自定义轨道名称
    & n( E4 G" s; G4 f  E
  69.         let trackModelKey = currentPathData.rail.getModelKey();6 t. g  p+ O# o: ^5 `6 S
  70.         return trackModelKey;' G: V( {: h  l( d
  71.     }+ f( e- u1 t  K" G3 @6 Y, J6 i
  72.     return null; // 或者是一个默认值) D5 j' P# t3 ?( t5 V1 N* ]  s0 a
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错5 H: u: j  U. u/ \5 q0 D
有事加我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
6 J- ^0 A$ n! ~" k% }bve声音要方便一些吧,他有可视化可预览的编辑工具
, ]: e) T$ _8 U
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
2 q; ~; W, i" [! U/ e
2 _# j3 b. P% r6 H; F( f4 a2 D$ ?相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
. [! ?+ f) r7 V/ ?' `2 \7 e
huliawsl 发表于 2024-5-17 21:12
9 Q0 K: R9 q2 f% K8 U相较于此,我还是认为bve格式会更简单
5 I* u$ e) Q/ t/ X6 a' C
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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