开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
1 Y$ q1 [" L3 e$ S& S8 _& ?: {; _: @# h% U2 o' u
( q% M3 m$ P/ O9 y* T
最近在研究JS 做了一个简单的逻辑来播放声音+ e+ ?5 V, |+ E3 v  D
  1. var pit = 1;//初始化音高(速度)
    3 f/ f$ ~9 i6 d  k9 R  H
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    : e- {$ @+ F- z0 W' K
  3. function create(ctx, state, train) {
    1 h" e3 l  O0 t) ]. ^8 r( q
  4.     state.number = new Array();: F6 ]4 M) `# @4 z
  5.     state.soundsspeed = 0;//初始化速度
    9 @: L! R8 q* z1 \" c! n. S
  6.     state.speedsub = 0;* {$ A8 A1 G7 P+ S, h$ e
  7.     for(let i = 0; i < 100; i++){
    : o3 k' W+ ]6 q4 ^
  8.         state.number[i]=0;//初始化数组# v& ?- D4 [; E5 S0 L! C* }
  9.     }) ^8 B/ ~/ I% ?6 y9 M$ x# q% G% L3 Q0 V
  10. }' x3 p8 s; b7 F' w9 k/ m2 c) W, E

  11. 3 j) U/ h2 \4 ~+ V
  12. function render(ctx, state, train) {
    , p( d7 t8 C0 K  j
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动% L. R2 b) n  r
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    + Z  p- a; t8 I2 t
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    $ L$ R. s5 e+ {
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差; N8 _7 T% ^4 A+ U9 \  p% j
  17.     ctx.setDebugInfo("speedsub=",state.speedsub); l2 J9 \  o/ |) A4 S
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    7 w7 _: O3 t0 K7 A
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ! v5 @* X- L' ?+ \  Y6 L7 _( h
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    % W# I9 F# {3 x6 X- b/ b
  21.             if(state.speedsub<-1){//如果车辆减速
    9 Z, v" f; b  x* e* O0 w
  22.                 ctx.setDebugInfo("shache",1);//记录刹车$ T/ E& B# l  P+ [: `: ^' m3 U" B
  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
    8 b: i4 c1 m1 E! z0 v% Y
  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
    ! a* k5 z7 ]% k: j" C  `
  25.             }else if(state.speedsub>1){//如果车辆加速
      w" s* s& y1 z  c0 I
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    + h- j8 T) J8 A! f: E
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声4 L9 P8 g2 r) u8 g( d$ S2 |6 z% d( O, x+ {4 e
  28.             }
    - }0 U4 n) ]  n2 P
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声3 j+ a* D+ K) I4 x( w3 S
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声( ?7 w( j) y1 h# ~  G7 H3 h6 N' O
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启! |, Y) f6 e' F' x
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右# o# O3 X0 }+ s% E6 ?
  33.             }
    . t! I' C' i9 X
  34.             if(train.speed()*20*3.6>5){
    ; r: z5 K0 b! p) d% N9 D) ^! [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声, g3 G+ V3 y6 I, c  w/ f- {
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声% f7 P! b7 @4 t5 r
  37.             }
    " x: `# D: F6 l, P  E
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    & A# w* K/ i/ s
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
      d/ m5 {* O- }0 s2 P! Y
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声8 e( J2 e/ E$ n2 T( z
  41.             }/ O: V  h# N5 L! S
  42.         }! t3 Z  W; p' c; e  q
  43.     }
    6 ~+ p2 |- a3 @9 C# r
  44.     state.soundsspeed = train.speed();//更新速度
    6 k  H4 p  |, b2 A
  45.     for(let i=0;i<4;i++){
    : l2 c$ J, s; J: e" o! M: B
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    5 v3 }  y# N/ W
  47.     }
    - P* d: _. U. r& l
  48. }* z' M2 @* q- ]5 F
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    , x  L% L; `8 T4 F& i: k
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    0 v+ I! @+ l+ I8 v2 B6 w* R
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    9 D2 X! e, i7 ]7 w/ j! R  I
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    + s8 j1 N  ~0 i% H: I
  53.     }, f, I7 ~2 |4 t( @
  54.     return nu;//返回新的播放时间/ Z. l$ t$ |4 y' u5 n; C; n% G
  55. }; Q& X% C& x" V& S' ]8 i) ^
  56. function grnn(min, max) {//随机小数9 v$ I+ P0 c' j: u
  57.     return  Math.random()*(max-min)+min;, w0 H, U' @2 D2 H
  58. }
    5 Z/ u. C' C8 Z2 ~( H
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    3 ]+ g3 |6 f! a3 y
  60.     // 获取列车从车库开出的距离; F$ [! C/ W0 h7 g* g# ^0 ~/ y* p
  61.     let railProgress = train.railProgress();/ R2 d, T9 Q& X9 T3 c- J
  62.     // 获取当前轨道的索引
    5 y" @8 r3 }- `: w; W- Z
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);9 {, h4 K: `  w/ x+ A
  64.     // 检查当前轨道索引是否有效1 n. f2 `5 L' R( Z5 A3 m3 s% |2 q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
      L; n, |" c3 p" F3 r% F* `. j
  66.         // 获取当前路径数据对象5 T7 A: I9 @. M5 Z. F, U" q6 u5 B
  67.         let currentPathData = train.path().get(currentRailIndex);3 P9 j' _  J* }5 x* O3 T
  68.         // 获取当前轨道使用的自定义轨道名称
    - [% Q4 ?) @1 y
  69.         let trackModelKey = currentPathData.rail.getModelKey();2 d4 O: U1 T+ g
  70.         return trackModelKey;
    - H. {5 H0 r( a2 c' r+ G
  71.     }
    & D  U' z+ j/ m. ~4 ]. g
  72.     return null; // 或者是一个默认值8 p: {+ {  ?4 ]! G* B
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
# }6 Q6 O, V1 B$ O0 C3 ?
有事加我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& k4 d1 e, y( w+ |8 a0 o
bve声音要方便一些吧,他有可视化可预览的编辑工具
) F4 @& b& o) ^. n* X+ h
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
* X. D& |* D: r  \- H8 s0 ^9 J* X" {3 }* _1 s
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
8 @" h" p1 O8 _; T% y7 W: _
huliawsl 发表于 2024-5-17 21:120 X' G. d+ ~8 B) k* ]
相较于此,我还是认为bve格式会更简单

4 m. z% |8 r0 K7 e* @/ W🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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