开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 - z- s0 |' [6 E2 q$ N/ p' j! ?2 z

8 g, [3 G% l5 U, o# p. t" f2 v& }
4 J5 J2 c; p$ b+ |* ]最近在研究JS 做了一个简单的逻辑来播放声音# U% ]! K3 q& R7 q
  1. var pit = 1;//初始化音高(速度)
    - F1 n! l- V( M4 h( N
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]$ W  i- G9 {8 k, |4 A/ @" ~
  3. function create(ctx, state, train) {
    9 N9 `  C; U! H* U$ V
  4.     state.number = new Array();8 J+ L, \; N: l3 j  h+ N5 @$ n, [  x: x
  5.     state.soundsspeed = 0;//初始化速度
    ' M8 k& S8 k# L, D, J+ g
  6.     state.speedsub = 0;8 H  f& j- L1 u+ r9 ]' B* ^
  7.     for(let i = 0; i < 100; i++){; H* R/ r8 O+ `1 ?( o
  8.         state.number[i]=0;//初始化数组+ i% N) \) y) W& }- K4 a0 T% v
  9.     }% h: `7 @& C7 `  @
  10. }
    9 C9 Y: E$ e. I; ~4 B4 K9 |
  11. ) A# c# U2 N" `: ^
  12. function render(ctx, state, train) {2 {5 W# B+ R9 J7 f. e/ A
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动9 _6 C! m: J2 H' @
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)1 S0 o9 i3 R1 R  u# t
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    , O8 k& p/ M: s8 `3 N0 R) A" A
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    3 Z; Y, T% P5 a: A8 ^* W% y* i" A
  17.     ctx.setDebugInfo("speedsub=",state.speedsub), [' k- D% g2 e
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作; X1 k$ M" i5 N: x' i( h* t3 [' w
  19.         for (let i = 0; i < train.trainCars(); i++) {
    $ c* J" @# `2 J2 N% h$ x( r2 W
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    $ J- a4 v, o4 f
  21.             if(state.speedsub<-1){//如果车辆减速
    $ H  {* {9 x' Y4 p& D0 K
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    1 A" ?' p: ?& L" ?* ?& |
  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
    3 z% L1 t# J- {% R6 W! M. X7 ~
  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- g* s% t# _0 M& @( k- k2 W
  25.             }else if(state.speedsub>1){//如果车辆加速
    5 ~3 ]/ |* |1 _1 s: c9 k0 O: D
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速$ c2 @" i0 r7 n& _" ^9 U. i+ r; f
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ F$ |9 u6 R9 ?. a
  28.             }
    . x+ ?8 _, ^  Y7 \
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声. A1 a% w1 |  S. P# Z
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声! V) }, D2 o6 C$ o! }3 h
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启5 q8 h5 e2 F& Q+ g4 k
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右5 M; x5 y' Z) R& l- @7 d5 @5 X0 `' _
  33.             }
    9 E3 @/ b! p0 f# r" `# a' N
  34.             if(train.speed()*20*3.6>5){
    ) A% w; m3 m* q  f! R" c1 X
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    " M9 G$ A4 I- s* v
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声2 ?+ m3 F0 J% Y: q% O
  37.             }; Y2 |- }% c3 e. x1 N
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){. n! ~( O) a4 O" k" |) A+ w( W
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ' |3 V7 X* [6 F$ {$ T2 l
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ b, s  w, B6 D+ ?3 k5 [& o
  41.             }. m7 K: P) r/ x- v4 L% ^# B& D
  42.         }
    , V; t6 \' @" B5 j" d, i, t
  43.     }
    6 Z! M2 T: b; J2 L1 v% I. u8 C
  44.     state.soundsspeed = train.speed();//更新速度
    " u5 s& Z# T+ k
  45.     for(let i=0;i<4;i++){$ d8 r2 A* F2 t# x: c+ \
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    1 `, X5 \) c& ^* t2 _5 S7 K2 N1 S
  47.     }
    " j& V) k" ]: u6 S1 z
  48. }
    & A/ ]% O& Z. z0 j
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    * S, z, S4 _2 B+ d) Y7 F; o1 v
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; e2 K4 T" y' Z
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放( y  D2 z( W- j2 ], g  p% S
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ' p  z9 @% ]; `* b" e+ Z
  53.     }
    4 H% ?+ @( N! o9 L7 C6 ?
  54.     return nu;//返回新的播放时间
    / v! o& }! y$ G
  55. }, G: d' ]  Q$ Q  r
  56. function grnn(min, max) {//随机小数
    . w3 ^. ?7 d1 h9 @2 x# N
  57.     return  Math.random()*(max-min)+min;
    * k! _( `7 J- y% u; A# n% ~" |' {
  58. }' S5 M! u# e# \7 F0 M& T% `8 a
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    4 i$ s4 o: n7 n  ^2 m6 T' s6 j. k
  60.     // 获取列车从车库开出的距离9 z3 k, b2 E( `# s
  61.     let railProgress = train.railProgress();4 A) r( [8 T( C+ `, t
  62.     // 获取当前轨道的索引
    ; a, C& z% E: Z/ h, C
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    4 e: ?) h5 C4 O' {1 q0 p
  64.     // 检查当前轨道索引是否有效
    7 D+ m" T9 K$ Y. b& e5 ]
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    0 i9 O$ E6 R9 {# m+ u
  66.         // 获取当前路径数据对象7 V4 ^0 m/ r  a+ f! F3 O
  67.         let currentPathData = train.path().get(currentRailIndex);
    7 U# @' U9 s9 ]( y
  68.         // 获取当前轨道使用的自定义轨道名称
    4 p( D# K/ V% O9 r
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    , L3 y& |  y3 V7 E( S  k3 }! ~
  70.         return trackModelKey;% t* ~( H- i9 m* a  G7 `
  71.     }& _+ e& Y) ^$ O) @
  72.     return null; // 或者是一个默认值
    # Z9 Z2 c5 `. k' c* p$ e  b
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错* a9 x( u& c; g; C$ A
有事加我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' l+ D9 ]+ K- x; a3 V
bve声音要方便一些吧,他有可视化可预览的编辑工具
  ~% p* c" M+ y! I6 ^
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
0 ^5 v1 b: B# ]/ G- u% u' m
4 ^" F) T0 l+ p- N  h) i$ Y1 X相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
3 w4 m4 A: Y2 a" F3 p0 A
huliawsl 发表于 2024-5-17 21:127 N. N  a/ f6 f9 F; I
相较于此,我还是认为bve格式会更简单

' S' ^" S7 D$ p7 L6 v; m8 c🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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