开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
- d" Y  R6 Z/ S6 ^  x0 E  w. m0 Y2 |9 Q- b# t, u
, r+ g$ X$ U, w; p2 l: Q6 b4 p- c
最近在研究JS 做了一个简单的逻辑来播放声音$ M# ~( N9 P7 Y+ k0 D# `
  1. var pit = 1;//初始化音高(速度)
    9 d# [" ?. o5 E% f& [
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    8 T; I0 i' w* L9 c
  3. function create(ctx, state, train) {
    " U) }) M% ?+ H0 ~9 O& }: }6 t5 V; d
  4.     state.number = new Array();
    7 E, E- u- ^! y- H7 ~
  5.     state.soundsspeed = 0;//初始化速度
    * Z- B7 H; \9 Y: R; u, ~* b
  6.     state.speedsub = 0;
      g- @% }6 H1 u, H
  7.     for(let i = 0; i < 100; i++){$ ]0 r4 Z) ~, {
  8.         state.number[i]=0;//初始化数组
    " \! \7 ^6 h3 s
  9.     }% E0 A: A- Y! U
  10. }' {0 J: m; q0 K; U
  11. 6 q4 ?, N$ k8 e, G
  12. function render(ctx, state, train) {# E; }) \$ K) K- p$ f
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动! f, h. ?" o$ W! Y6 l7 l
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ! C2 X- F, I: o5 ~+ j- _4 {2 P
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    8 o0 D4 |* U* r
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    8 e, O  L. w1 [- J; M
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)7 L+ K" z* o& g# Q
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作3 i- U, J+ B" P4 Q2 Z$ V- o
  19.         for (let i = 0; i < train.trainCars(); i++) {
    6 A0 M& E3 Y' b. K  y7 U% g
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    4 D% f* W% T  o! `1 U/ C1 d
  21.             if(state.speedsub<-1){//如果车辆减速
    . x: Q- `6 _1 L# m* l5 g
  22.                 ctx.setDebugInfo("shache",1);//记录刹车/ k. t2 l; P! ?7 `8 @) e8 @
  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);//更新返回时间 播放刹车声在转向架16 N! u- ?  M5 V! h2 [, ~
  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
    " r$ A3 g* {; U- ~, ~8 z! q, e
  25.             }else if(state.speedsub>1){//如果车辆加速( u7 W: \" |) F1 @' j' \
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    7 _. K1 V. L: x' @9 P9 @
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    , _( Z, o9 B. b( o1 W
  28.             }! q! g; L- k1 V2 K
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声" L/ S, Q/ K# D8 b0 K
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ( H) m, V! e/ W) L8 }1 [
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    7 [5 \, x2 u" E
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右, [+ Y- Z, J1 v/ [( e
  33.             }
    : l" T' C9 T( U; A3 d4 }9 w
  34.             if(train.speed()*20*3.6>5){
    ! C8 Q) i* X* k7 U1 ^
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声, X. Q+ u. H- m0 s
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声* l  s; \! B% o* v# @4 r* M# j* y
  37.             }9 |# O- M4 y9 \& \
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){1 A2 @& p/ ?9 [8 y
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声, D& J0 O8 D/ R8 L6 n- _% X
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    & E+ u3 `8 o6 d" b: A
  41.             }
    ! D; e1 y& ]+ P1 F4 Z
  42.         }
    ( b7 P, ]' F5 ?5 y7 C, X  ^* [( \$ R
  43.     }
    ( z: G: P/ u  F4 @3 Q8 w3 {3 A
  44.     state.soundsspeed = train.speed();//更新速度
    2 E- n* j; l8 _- p1 b8 p1 G! u$ b
  45.     for(let i=0;i<4;i++){
    5 X3 S4 {6 j( |
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    3 P! H2 ]7 `0 g
  47.     }2 ?* c3 N) Y* P# Z2 w, Z0 N
  48. }1 u* I: \  z( l
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间+ q' k5 m4 P# L" ^
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间- j: A! g8 M+ Z! L6 I: Y0 q3 [
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放0 M- V) y: u6 j- b/ W' K
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    8 [: p5 M9 w  Z0 f/ c3 a% E1 z
  53.     }" N* H# U4 h+ f7 I$ v1 A
  54.     return nu;//返回新的播放时间
    ' z1 c7 u8 Q  ~4 }) n) P$ `- x
  55. }
    ! o7 @6 Q; j' G' X) L) u
  56. function grnn(min, max) {//随机小数1 q4 w; \% ?8 C: w' p" W( t
  57.     return  Math.random()*(max-min)+min;8 Q( T6 L% y+ v2 f+ w! S
  58. }
    0 h6 p6 \: _) T- \& G
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
      b  c2 [3 d5 ^' B1 ?- d! {
  60.     // 获取列车从车库开出的距离
    6 E5 b9 v5 M! Y
  61.     let railProgress = train.railProgress();# l" Y! s$ T. B% R& q. y
  62.     // 获取当前轨道的索引5 R8 a( `8 Y* d& K  z
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    & K+ q9 [4 m9 k5 j0 M2 L+ ^* C
  64.     // 检查当前轨道索引是否有效
    $ E: e/ O/ E6 `
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {  s, m, W0 [  z, k$ c# g8 E
  66.         // 获取当前路径数据对象
    , s! B4 p  q6 i; R5 r
  67.         let currentPathData = train.path().get(currentRailIndex);
    1 R1 l! P, g2 n7 b' z2 X! P2 u' B
  68.         // 获取当前轨道使用的自定义轨道名称
    $ [+ b4 L4 `$ @: c9 j
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    1 \  }. Y% w2 X, T1 T7 @
  70.         return trackModelKey;0 |4 B; t, w, v4 a$ o' Q9 z' B
  71.     }% \1 i1 b% ~" a2 ~; Q1 X* g* b
  72.     return null; // 或者是一个默认值
    * `/ u/ U* z# k7 ]" b7 y0 j9 \
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
. {/ R  H8 d% r. M
有事加我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
  ]! f/ E- ]- Zbve声音要方便一些吧,他有可视化可预览的编辑工具

" O' p* y! u' C* i7 Q嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 8 Q* Z; P: L- I* j3 _
* v* e2 V! v5 X) P) ^* l8 t0 A3 D/ t
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
* }" z; g0 w; t; P
huliawsl 发表于 2024-5-17 21:12
& m  e8 h4 @! c4 Y' e相较于此,我还是认为bve格式会更简单
  x0 L" G) m7 {* f* O; ~1 K9 T; p' w' @
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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