开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
; c; ~& N) O+ F0 z. c& i8 o! \7 H- B  @$ F2 ]
7 I2 X+ n7 E: n0 V( b8 u1 Q: v4 F
最近在研究JS 做了一个简单的逻辑来播放声音
! P* a7 R9 c3 s4 L4 Q
  1. var pit = 1;//初始化音高(速度)8 n+ D, ~' H" x9 f9 Z4 C
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    . j$ i+ V  P) f( L
  3. function create(ctx, state, train) {' R9 n4 j' I! j
  4.     state.number = new Array();
    & b. [: ^3 S( `, o! V
  5.     state.soundsspeed = 0;//初始化速度. D+ j: |& J5 ^) t7 u8 K% d6 o
  6.     state.speedsub = 0;
    1 l  r) R7 T. O- `& y! u0 T4 @, z
  7.     for(let i = 0; i < 100; i++){$ g% E* }) C) [8 a' C5 G6 C
  8.         state.number[i]=0;//初始化数组* E% W3 @9 |# y; k/ Y; K7 f  M' s7 _, c
  9.     }* g% }/ J1 w, h
  10. }# |9 Z: A: w9 V

  11. 5 I- M0 L2 g8 K' w& F
  12. function render(ctx, state, train) {
    % ]' S* p2 z6 M# W  _! M- `
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    8 m- P: |# h& h3 U& e% Q. K0 C# v
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)5 }  a/ r7 G3 b  C/ ?# H
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    4 v; k7 G8 g4 a( Q+ C: }
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    2 ~& p% p* _: R8 F- B8 o1 g
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    3 `8 U( ]) ?7 C7 z  I" C& ~9 K
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ; V2 X) l3 n, y  T
  19.         for (let i = 0; i < train.trainCars(); i++) {9 l) d. j" h+ C+ A/ O7 O
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    5 s/ J0 A; T" N6 N! H8 O$ O: Q# W2 q
  21.             if(state.speedsub<-1){//如果车辆减速6 Y6 j" T2 w  w4 `
  22.                 ctx.setDebugInfo("shache",1);//记录刹车% L' t) m5 t7 {) ]2 X6 L9 W
  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
      L7 U2 P: m, q& d$ E% M( w
  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);//更新返回时间 播放刹车声在转向架26 ~* J( B* p8 h; U0 B
  25.             }else if(state.speedsub>1){//如果车辆加速+ Q% Q8 U7 d- Y8 {5 e$ y% m/ k
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速0 L% x+ R2 V  x
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声5 Q! g; P* M- q3 I
  28.             }3 A  z# a2 q' `* B6 G
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声3 c  r0 t+ u9 [& C
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声4 y" B% H2 {* N  c9 B2 a
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启: Y4 b- u& r- i" c- N) B
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右- ~" T) s" G& X% m7 y% K( Q  a
  33.             }' A7 y$ h9 j) B9 W0 X3 i8 k$ ^" F
  34.             if(train.speed()*20*3.6>5){
    * y) d, z0 C6 N& y5 D. i5 f# ~0 p# ?
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声7 ~$ d* O8 Q( j& _7 d: B
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    " a! i" A4 R: Y
  37.             }
    : Q# _& ]$ K$ X7 _' j
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){* Z1 H; G4 C: \* j: n7 G# `
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声& Y" `5 x1 a: }( K; T' {
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声$ t. L) r5 m% r% w/ n. _
  41.             }
    # R  w1 E% R7 f' U: y8 Z+ C' S
  42.         }
    % C2 @) L7 f0 |8 Q0 K
  43.     }0 X. x) p7 w$ k& P/ J! z
  44.     state.soundsspeed = train.speed();//更新速度
    0 \! V! ]# s. [8 B; r8 ~
  45.     for(let i=0;i<4;i++){
    6 k/ Z4 V+ x& D! W# I7 C
  46.         ctx.setDebugInfo(i+"=",state.number[i]);' L, o5 Y8 W% }& S; S: `9 ?
  47.     }, L; L& l: w! `6 T4 q
  48. }0 m& V$ b) f" L. v1 {, h9 R/ ^
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间% a# R' D$ W9 ]7 N8 [
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    2 I) ?( M. L5 ~- E$ s9 f
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! u. @) l9 S1 M! `' g( v( W
  52.         nu = Timing.elapsed()+long;   //更新播放时间9 Z: }) u' b- l! U
  53.     }  T- W, b/ X- I/ n% o, e
  54.     return nu;//返回新的播放时间
    5 R- Q5 ]  Q' n- G$ W2 `0 b! G
  55. }& G. _& S7 Q' s
  56. function grnn(min, max) {//随机小数
    - e- W2 ?4 H* v- Z
  57.     return  Math.random()*(max-min)+min;) ]1 ^# \. U9 v
  58. }8 ^8 F" [4 Y- Q6 F
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的) E4 x; I# ~, ]; C" S
  60.     // 获取列车从车库开出的距离, s: x; c5 P* H& F& F! L9 U) @
  61.     let railProgress = train.railProgress();
    - m/ e1 p1 \8 ?% }+ M5 d
  62.     // 获取当前轨道的索引
    4 E! |4 M+ J, _) T- k( l
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);" U5 f( G* t3 H3 A0 j& w: W
  64.     // 检查当前轨道索引是否有效
    2 T9 i! S4 k; e& w3 A1 N
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {3 G3 [8 E3 `. L
  66.         // 获取当前路径数据对象8 G% L" I+ U+ L8 Z! U! M) [8 z  s
  67.         let currentPathData = train.path().get(currentRailIndex);! k$ g8 f: v* r- R, Q6 w
  68.         // 获取当前轨道使用的自定义轨道名称* J8 J, V0 e7 l- p6 Z
  69.         let trackModelKey = currentPathData.rail.getModelKey();! E6 t6 s' e" [- Y- K! {9 x
  70.         return trackModelKey;0 ?+ ^: [9 o. ?8 k
  71.     }+ k5 ~9 i2 c0 ~9 v+ E  n6 p* u& I
  72.     return null; // 或者是一个默认值
    * y4 S1 b, N* d5 |) v4 ?4 Y  Z
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错) ]8 i3 P5 f8 z3 ?
有事加我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
' r- |5 X; U3 S" K2 I) `; \bve声音要方便一些吧,他有可视化可预览的编辑工具

; G, A) S  F0 ?! V2 _嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
( a1 h. m/ ]0 ^/ f  j& `5 X* j: N* i$ w2 X: Q4 Q
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 , I- }( B$ a  v5 W; M1 e, a
huliawsl 发表于 2024-5-17 21:12
$ T- U5 a) X7 G4 A, r相较于此,我还是认为bve格式会更简单

3 z* _" ]4 w; |3 E9 [- \🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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