开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 ! S0 n2 {/ _& [+ ?" i0 f4 u+ o
* k9 ?2 \* {1 m% d4 R7 g6 a

: p$ O' u' Q1 }最近在研究JS 做了一个简单的逻辑来播放声音
! z3 W, S5 }$ T9 C8 y9 Y
  1. var pit = 1;//初始化音高(速度): J2 M$ K5 S' I0 y% p
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"], v0 [+ t0 \! r5 s: X9 @* ~3 E
  3. function create(ctx, state, train) {
    / w$ ~. V1 w* M" J5 d4 V/ u0 V
  4.     state.number = new Array();) f  L% w& @' z5 z/ W0 g
  5.     state.soundsspeed = 0;//初始化速度
    . _, {& @9 Y. Y$ h. l
  6.     state.speedsub = 0;
    4 j: k+ i- h& j& @7 |/ E
  7.     for(let i = 0; i < 100; i++){
    2 C, Y% \  q) M. k& B
  8.         state.number[i]=0;//初始化数组& d( G3 U/ P, l
  9.     }. c- g3 O& ]. A0 Z/ J/ V8 F  k
  10. }4 G( W. g' }# t$ L# M( U+ A

  11. # r/ d3 [% ~* p8 b
  12. function render(ctx, state, train) {
    6 h8 z3 B3 Z' r* L  t
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动& K* D' b( z0 R8 s" y: s; ?- P
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    + V' |9 Y2 O# M/ Y6 y
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    3 B7 ]7 p+ H% Y" k; Q4 _9 }9 d
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    / Q  U) y9 ]+ k) v8 k7 ~2 N
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)% e' O1 u5 }+ k
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    0 h. o5 p# W6 v! i3 b
  19.         for (let i = 0; i < train.trainCars(); i++) {, Y+ j$ d4 F3 h+ b7 [- q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启+ Z0 d, d- v/ ~0 y% Z  z9 I5 e
  21.             if(state.speedsub<-1){//如果车辆减速
    ! N1 v, M& n1 P
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    6 r! N, w$ y9 P+ z- }
  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
    $ K8 H; m2 W( ?4 h: i( U- f
  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
    8 J8 B/ ~  O: \5 \8 I1 l+ Z! n$ A
  25.             }else if(state.speedsub>1){//如果车辆加速
    3 D3 l+ }% p" E, ]# R! |
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    9 c0 g: l2 g& X. i& [
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声- b3 J3 x& w' a
  28.             }  m' ?; w4 W* D! ]" N4 Q
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ) W+ _6 O9 U" e
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声2 c" O8 ~# ~/ C( q; n, T) q9 k+ b
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启1 A# p1 o% A+ R
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右8 L+ E& Y# c6 B4 d- b  U( h. \: d
  33.             }8 J+ j( N' Y+ C8 J& C
  34.             if(train.speed()*20*3.6>5){' N2 E" o% O$ X* C& B9 K4 L
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声3 A& u0 `( V9 n( U3 C# n; Y( w
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声7 U$ e- R7 p8 q& b2 ^$ `! S
  37.             }8 Q. }( J  m  t0 J4 K0 i3 d4 k
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    8 `2 U2 n% V! [4 {1 N
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声4 \) D% `# \' L! F7 o
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ( m7 X+ s4 d; u9 r# h3 k
  41.             }
    & u8 L6 v+ y; Y% k2 k: R
  42.         }
    6 \4 q1 J' ^" l# d; T, _
  43.     }3 L9 U8 A2 u7 x) k: q/ }
  44.     state.soundsspeed = train.speed();//更新速度* O' G% I$ r1 W  V- b8 r3 W
  45.     for(let i=0;i<4;i++){9 p$ q* {0 d- I, u7 u* o; [
  46.         ctx.setDebugInfo(i+"=",state.number[i]);: F- \0 h2 `4 g- y
  47.     }0 m' }) ~, F+ Q: w* ]
  48. }
    1 c6 V: K  u* b4 T2 E8 ~* C
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间& k+ z3 c* S" x% G5 T$ d+ h
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    . m- K6 Q4 w0 y, E! q2 w( }$ Q
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放% k2 B4 _: I. X9 C" F$ ^
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    9 U5 z: l- F% L  ]
  53.     }% k3 c8 d2 T+ ^7 j
  54.     return nu;//返回新的播放时间9 I1 C' p$ b+ G& v6 R0 W
  55. }
    % ~- s( Y3 ?4 D( x
  56. function grnn(min, max) {//随机小数% z7 X" y/ n! s+ Y" ]$ O4 D1 J. u
  57.     return  Math.random()*(max-min)+min;& T9 L( ?2 g5 O& x' q* D1 B% s
  58. }7 w$ u' M( i; c) d/ }; g
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的, ]$ H7 w% |% @7 F+ j
  60.     // 获取列车从车库开出的距离5 Z( M; j$ Y# Y
  61.     let railProgress = train.railProgress();8 E+ _! X! L1 b! K  r3 ~* f
  62.     // 获取当前轨道的索引
    ; r* I/ @. b; V2 F$ P
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    ) y$ K7 ?1 `6 `' u" i& C1 \- b
  64.     // 检查当前轨道索引是否有效2 [: h2 Z! T' X+ _1 H
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ' _  ~9 f5 b. t  W
  66.         // 获取当前路径数据对象
    % X' r% [8 ]# f
  67.         let currentPathData = train.path().get(currentRailIndex);0 u/ \* e: H' W
  68.         // 获取当前轨道使用的自定义轨道名称" E3 ?% U0 Z& T* \; j0 j
  69.         let trackModelKey = currentPathData.rail.getModelKey();2 Y. U- b9 f3 X5 ^0 t& u' |
  70.         return trackModelKey;
    ' K- W: e. A8 g8 Y
  71.     }
    2 g) t- s+ k6 _: _, ^/ a" u
  72.     return null; // 或者是一个默认值# p, ~9 F+ \& d: R% P) K2 R0 l
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
3 W7 P; ?" X! ]5 _, t" A/ E. E) P
有事加我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
  t5 _) P* R& Z# r9 S, Abve声音要方便一些吧,他有可视化可预览的编辑工具

- p1 S. j* o& g  y' \6 I  i+ l, }嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 + e) i$ r6 C+ Y) ?

8 w) Q7 w% V) K/ X相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 # q. S2 G  s' X
huliawsl 发表于 2024-5-17 21:12& B. T- H* F* r7 b% `
相较于此,我还是认为bve格式会更简单
5 P9 m3 {0 n& X. H' {- V
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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