开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 ' k4 a3 ?: V& X  H  b

5 x2 N4 H  y7 B+ X+ }9 S; G" t' B0 r
最近在研究JS 做了一个简单的逻辑来播放声音! r) w* E$ M* J3 W+ O, t  T% `
  1. var pit = 1;//初始化音高(速度)
    2 o7 ?9 _& F1 ~1 C( C
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    4 x( F8 K* y1 u7 i6 b/ d
  3. function create(ctx, state, train) {- @& g- \& b( y3 [
  4.     state.number = new Array();
    / Q( r$ }( J- g/ X0 G( D
  5.     state.soundsspeed = 0;//初始化速度
    / S$ X: }2 x. A1 m
  6.     state.speedsub = 0;
    4 R& A9 |( Z% q8 H. _
  7.     for(let i = 0; i < 100; i++){; g/ y3 i' t  r; a5 j) a: h
  8.         state.number[i]=0;//初始化数组
    ( @, I" X% z3 p* ^) K+ _# [2 ^
  9.     }
    . {/ s1 O9 m$ K( }+ C
  10. }; C5 ~; U4 T! k5 F

  11. : w' }% R$ O6 i% G" U8 ]* B8 B
  12. function render(ctx, state, train) {
    ! C. ~; M: ]) C3 R0 O
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    8 A0 P' O2 u2 u
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)* x8 I0 a" ?) v  Y& O7 Y/ P
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    $ q6 P2 M  \# t: g, g
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    / K( {5 i# u- w& H# a
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    6 h/ q. z- `4 i
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    % Z/ l6 V! y. D
  19.         for (let i = 0; i < train.trainCars(); i++) {
    5 t/ f' V; b% z9 `
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    # r8 _% r$ E1 i6 o: y, U4 }
  21.             if(state.speedsub<-1){//如果车辆减速
    0 L/ P. q8 ^8 N  w$ Y/ w' b1 ]
  22.                 ctx.setDebugInfo("shache",1);//记录刹车3 Z7 d4 l& |# n* K
  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
    + d( k* [5 d+ ~- [  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" c. Q! _4 [1 T  ^9 l
  25.             }else if(state.speedsub>1){//如果车辆加速
    " q. C+ W3 \7 ~
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速  Z: c  L4 _! ^2 v
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声7 M4 G6 r8 w  E
  28.             }5 x+ M/ e; X, g1 N8 C. \
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声- S0 a% D% I! I5 v, h
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声5 v9 f* V2 r, Y4 L6 {6 ^
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启# y# b" j3 I7 {5 l
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右" f2 c" v7 K% @% c6 C9 n
  33.             }1 p0 f) D7 E& _
  34.             if(train.speed()*20*3.6>5){
    % F2 B; O( W7 t8 H3 U3 d2 H
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声" s* _' A. q( V2 _. t: q& S, M  L7 A
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    8 s% p1 ?8 \, q2 t; p
  37.             }1 U$ B! u3 @: `  G3 W
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    7 v  o7 g/ c) z+ l
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声* u5 s: ^8 L( t$ g: V* [+ G# ~0 ~
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    3 r2 g: s2 @5 H' z' f* `  f9 Z; n
  41.             }
    5 p' n: |  q0 O' Q9 k% B# S+ [
  42.         }# l* _+ {( I  t- [5 z3 g
  43.     }
    ' }! _, Y" X  _1 U
  44.     state.soundsspeed = train.speed();//更新速度
    1 T' i0 I! G4 L
  45.     for(let i=0;i<4;i++){
      z# l8 c* |1 y* f
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    . R/ A! C5 D7 T+ m( c5 \% T1 N& E
  47.     }6 H% @" n2 e# M/ b
  48. }
    0 b, `* S3 d+ m# W4 a2 o+ f
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    0 G) T9 z6 F' V0 f1 b
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    , m& n# M4 `* B
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    1 \- p8 _- a4 h* y2 Y* o
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    2 b+ S5 P- `$ C, a
  53.     }9 [- u8 ]  A' ?3 |
  54.     return nu;//返回新的播放时间  d0 b3 _( @3 ?: S! |7 ?$ {  l
  55. }( ^8 _8 w) B. X0 X* |6 z' ]: q
  56. function grnn(min, max) {//随机小数
    " `& Z- z1 X! R, R7 z
  57.     return  Math.random()*(max-min)+min;" M- q2 d- y6 I
  58. }9 k! D. m7 d5 s6 C1 O0 \
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ) x+ z8 l; u' `- A! y
  60.     // 获取列车从车库开出的距离
    ) z* L) p+ c4 L9 _: q
  61.     let railProgress = train.railProgress();; T( `  h5 G5 W/ C
  62.     // 获取当前轨道的索引: [. l& t- M7 B4 v
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    . O9 E  `: u; Z: O8 `
  64.     // 检查当前轨道索引是否有效
    / |6 J( i& A& S7 |/ c' q: L
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
      `) M, Q8 A/ }& c% P% V
  66.         // 获取当前路径数据对象
    - V, g0 g- e5 Z$ t$ K
  67.         let currentPathData = train.path().get(currentRailIndex);
    ' ?* g2 J8 R' F! s! r( R
  68.         // 获取当前轨道使用的自定义轨道名称2 S* s* j( A6 [7 N9 b
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    0 F# P2 Q3 B& e- H8 B
  70.         return trackModelKey;! h2 U5 w- d" Y, D- o0 c2 `
  71.     }
    + c# o0 u9 h4 i
  72.     return null; // 或者是一个默认值
    : j0 X- L" g" n1 q, z. R  K, I$ \
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
/ W4 i, \" ^. z+ ]/ ]
有事加我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
7 n3 c% }1 b5 y, U% ]8 E( Lbve声音要方便一些吧,他有可视化可预览的编辑工具

- v9 N0 h4 a  I! b7 Y. i- g8 @1 H嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
3 W5 p0 Q0 A' t+ L0 m& t" h: P( m0 t/ v( ?/ l3 X
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
" p$ P8 y, X6 s3 a
huliawsl 发表于 2024-5-17 21:12+ @5 C) j! D1 C; c7 K* X% e7 V
相较于此,我还是认为bve格式会更简单

1 n6 c) B# M, t# p: Q' G4 ]🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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