开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 ; K2 t7 m3 k6 u  a& g: p

; H, J, ?# Y# E: a" Y3 [+ D6 H/ H1 T- G+ c, H" U
最近在研究JS 做了一个简单的逻辑来播放声音! Z- V% M% t- u4 D
  1. var pit = 1;//初始化音高(速度)0 s! G+ \* A2 I  c9 n  A
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    " o7 x6 Z1 Q$ y( N1 k3 _
  3. function create(ctx, state, train) {, Q8 b7 z  C% B8 p3 e
  4.     state.number = new Array();
    0 D, a1 V9 G( W$ m/ O- T% p
  5.     state.soundsspeed = 0;//初始化速度9 i0 _' U% E* ~8 v$ @/ e
  6.     state.speedsub = 0;7 U4 n6 H3 `5 [& F# y  D9 H
  7.     for(let i = 0; i < 100; i++){
    $ s* }; H" \4 T: f* \7 n% P
  8.         state.number[i]=0;//初始化数组! r8 P5 {, E; e4 }2 C
  9.     }3 c4 z4 }, _( l  X  @
  10. }; _: \, z* l0 V: y5 z' q3 _& d

  11. * Y' |, W7 M. B4 i
  12. function render(ctx, state, train) {: h7 C5 U2 J) }- w8 ?6 I9 y3 q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ( i. s5 x: h3 W  }, O% T
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)* p$ c, R2 {& f: x% [% h) C
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    # h: G8 m5 a& {8 p
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差6 _$ ?0 L/ s/ _  z& [& J) [1 D
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    * {: N* y- C" |- k8 B9 U# D; E" \# I
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ( A8 q1 z3 N* p& _
  19.         for (let i = 0; i < train.trainCars(); i++) {7 W4 r( j' v1 L8 j- Z
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启' G; x* O6 `7 R* V5 M, @
  21.             if(state.speedsub<-1){//如果车辆减速
    " e$ ^. ^+ s* G" a7 j: {
  22.                 ctx.setDebugInfo("shache",1);//记录刹车9 K, r- W4 x: R
  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
    2 h6 C1 p0 O6 k2 B/ K0 u
  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
    4 U  b0 j) A8 y  i' d9 P! V
  25.             }else if(state.speedsub>1){//如果车辆加速
    # o$ v) b9 ~/ A/ s" ^6 _
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    : B4 T3 }7 a5 M5 ~
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ! ~1 ^$ @) Y6 L- F! g
  28.             }
    0 n3 `) m/ ^) h7 t9 v1 L$ z) o$ C
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声1 Z0 G5 v2 t! n. W9 E% \+ h, X8 g3 u
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声9 V" @+ n+ P& ?
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启. G* n3 k5 j5 B6 U1 l, E" n1 Z
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右9 {+ f& e1 d7 M; M$ a2 L, U
  33.             }
    7 d, h. L- s/ u/ [, t9 i6 u* K; K9 e
  34.             if(train.speed()*20*3.6>5){+ |; Q# j1 P1 t0 I
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ) D$ n% x) w7 z7 ~/ ^
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    # }# M" p5 Z# A) Q
  37.             }
    0 r' H3 A# b" k7 ?6 X
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){# T* _% n- U9 {& C' x
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ; ]9 W/ J) J" U
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声( P) }+ m& h! e
  41.             }
    * V$ u( w) t+ T$ G$ F; J1 E" f- ?
  42.         }6 w, M6 ]7 L0 ~. r5 Y" f! b
  43.     }
    / v# j; W7 ]3 [9 K: I
  44.     state.soundsspeed = train.speed();//更新速度
      f6 x3 R$ \" K+ V6 T& C' ~$ U0 j
  45.     for(let i=0;i<4;i++){+ P( a) ~3 V$ ?! [
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    . c- O, |0 H; w8 o4 V# \  g3 m
  47.     }
    4 z  i; s( R, v- O3 M& p
  48. }& T4 H5 f$ H/ |
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间8 z% h. Q+ p3 i" B/ o
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    9 A0 `9 ]( j( o% E) @, z
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放1 S# _7 ?  {, L2 I
  52.         nu = Timing.elapsed()+long;   //更新播放时间* S2 r/ u' _2 E- A
  53.     }
    ( |, H4 W  ~- C$ H) `5 k
  54.     return nu;//返回新的播放时间: L6 }" r9 P, ~0 G
  55. }* d$ a9 Y2 y& h- B7 I  P
  56. function grnn(min, max) {//随机小数6 h0 j5 t! {( I/ ]) E
  57.     return  Math.random()*(max-min)+min;
    % v6 {3 u" d0 _$ F0 N9 m4 j
  58. }' q' F  h8 L& K- Z- m9 C
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的8 L+ |$ |1 }! H7 |* }/ x* r, o
  60.     // 获取列车从车库开出的距离
    + U5 z1 y- [. z: U, q4 z$ M
  61.     let railProgress = train.railProgress();* U  H/ p- a. L" w1 {
  62.     // 获取当前轨道的索引9 f& P" y- a9 r
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);) R- |! u2 t& J: q
  64.     // 检查当前轨道索引是否有效( s' L; h& g9 _3 w4 I2 v( {- b
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    * ]0 B+ ~  z3 E- G
  66.         // 获取当前路径数据对象% M; I1 S7 d- `" J6 e6 ?0 u
  67.         let currentPathData = train.path().get(currentRailIndex);0 P& N, h7 E' F7 W
  68.         // 获取当前轨道使用的自定义轨道名称
    / o* Q) X( g+ L
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    # z% i% N" J( L: U
  70.         return trackModelKey;
    ( |% U0 O% U9 B" ^. F7 v
  71.     }; K0 a/ G) c, h
  72.     return null; // 或者是一个默认值
    % v/ ]( A6 n; a# A. T
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错  m+ i" r# ~! U6 Y; y6 }' ]
有事加我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
# `3 B2 ^% Z/ p* m; R: p8 Mbve声音要方便一些吧,他有可视化可预览的编辑工具
1 S! ]% J; U+ H4 V- \
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
! t; y' {% z4 b+ {: }/ m( s& l4 T' A/ R- \
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 3 I9 Q$ ?1 h6 k" K- Z0 t
huliawsl 发表于 2024-5-17 21:12
0 y5 W2 @' Z* L  f+ m相较于此,我还是认为bve格式会更简单
0 _" q4 c4 x0 a, `9 o9 v* h7 g
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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