开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
$ J3 n7 E# \8 Y0 y4 `3 N1 f- ]8 [; v8 q  B4 Q

3 Z3 D' U2 }4 L( U( ]8 R$ G最近在研究JS 做了一个简单的逻辑来播放声音9 k2 C6 c1 ]) j
  1. var pit = 1;//初始化音高(速度)9 I- `. s+ W( H( Q
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ @& N" @" L* m3 W
  3. function create(ctx, state, train) {$ n# z& q4 u3 ?- g$ ^: x- I
  4.     state.number = new Array();
    8 ~& |- ?  M' a. D4 a
  5.     state.soundsspeed = 0;//初始化速度! v$ m2 I. u' B) L% I
  6.     state.speedsub = 0;& D. A( S5 H5 U+ }
  7.     for(let i = 0; i < 100; i++){
    5 e. Z" J9 Q/ D$ T8 l. I
  8.         state.number[i]=0;//初始化数组
    2 b5 K4 d3 e. _! R
  9.     }
    . c* `  |) j  U6 U: D' E2 d
  10. }
    " y- i+ ^' P- Q9 N

  11. & c( f$ C1 @: i: J7 D
  12. function render(ctx, state, train) {6 X! a1 |# Y0 F$ H$ V* M
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动% x0 `  A9 B) [/ H' S
  14.     pit = 1 + train.speed() / 40;//更新音高(速度). |7 X& h& J+ [9 ~  e  f
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    % g; X2 K! C) I7 |; n' v& Q
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    2 n! l2 Z! m' j9 g9 C
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    5 s; u+ D" t3 u3 r& S3 X' ?7 s
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ; s$ |" Q9 z8 ]$ S8 Z8 o
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ) @- w( H, G+ R/ t/ y, @6 h
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启$ p& T5 W! h6 P3 ]' u' Q
  21.             if(state.speedsub<-1){//如果车辆减速/ V0 h2 H1 z* `( b2 m
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    7 \; ]! q+ M# Y" d$ ]& `1 v
  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);//更新返回时间 播放刹车声在转向架12 ]# J* ~0 i- N% c- Q2 G5 V
  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
    ! L0 T( D  Q: f- p9 ?6 G
  25.             }else if(state.speedsub>1){//如果车辆加速
    ' r6 R5 t& T" Q4 |; i+ L; g
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 b3 u, W0 ?6 h; B# y# N
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声$ @( w" D0 w! ~  v$ t
  28.             }
    3 I4 W* Z# c7 F: `
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    2 E0 [/ E4 P1 E6 U* j
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    " L4 o3 s3 ^% ~# s/ e! v
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ! L  C# Y/ z$ C* g! y7 V
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右6 _' M1 F0 x/ o' o2 s% g$ _
  33.             }
    ) I% l1 p3 x  k* ?, C
  34.             if(train.speed()*20*3.6>5){
    2 v, m# w. d# n
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声0 G) e2 A1 m$ y3 Y
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ! c2 j; O8 C3 X% r; ?0 h  y4 d
  37.             }
    / H/ ^' ]1 P( @# Q
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){4 ]2 O' u$ r1 Q6 P& e% O( w
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    / f4 H5 h3 L% O
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    4 `+ \1 Q* x7 y& u  R) t
  41.             }
    4 [$ h3 b' ]; H2 e* l
  42.         }1 e$ r" I. L) H# }
  43.     }
    9 l6 V$ c8 g- S0 m/ S9 @7 c5 N
  44.     state.soundsspeed = train.speed();//更新速度3 {5 X+ N; \: j: O
  45.     for(let i=0;i<4;i++){
    * n+ y3 }# k  [  B* s
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    6 I, n. u) h6 P9 U! @8 Z
  47.     }
    + V* s/ c' Y0 k* q  L& g
  48. }; e: l7 c% U$ b' n
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间! r3 B8 Y7 R6 ?) K
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    5 x) e( }6 ?& R& f
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    0 f4 L( {" Y, G$ |! r
  52.         nu = Timing.elapsed()+long;   //更新播放时间3 R7 h, _' n- k
  53.     }1 F. K6 H" m: N) {; X- `! T) Y; M
  54.     return nu;//返回新的播放时间7 c, w; D1 U$ r7 T
  55. }
    & _* X2 g5 t" p/ Q. u" B! i
  56. function grnn(min, max) {//随机小数
      b4 D/ T  \& n8 u5 i& u
  57.     return  Math.random()*(max-min)+min;* I3 J# A$ j1 L2 i
  58. }
    - O- Q( Q/ _/ {7 Q, Z7 M: o
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    - ]' R, n; h& s& r
  60.     // 获取列车从车库开出的距离
    ' v/ G( ?+ E) {# a# R
  61.     let railProgress = train.railProgress();
    5 H. g; e, k9 _( |; w
  62.     // 获取当前轨道的索引
    4 e& v# J' F  |
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    # [  G" w& p, B0 [
  64.     // 检查当前轨道索引是否有效  y9 p$ N8 q; f2 e2 \6 ]- I
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    9 F* z8 ?& H5 t, F& f0 u
  66.         // 获取当前路径数据对象
    : y# v" K; K) n& @9 ?2 M! f  }
  67.         let currentPathData = train.path().get(currentRailIndex);. Y% P* `9 L1 k) z& m( p
  68.         // 获取当前轨道使用的自定义轨道名称
    # _5 h. B( D* K7 L
  69.         let trackModelKey = currentPathData.rail.getModelKey();% X; H! V' n; y2 v2 G& I
  70.         return trackModelKey;5 H6 j6 d( z' f9 }1 q. {# R1 u3 N% d7 a
  71.     }
    ) C6 [. M* w! F) }8 M
  72.     return null; // 或者是一个默认值+ X$ q/ m9 L6 r# D8 D( u/ q
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错) R; g& n; 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
6 [2 C4 f1 k8 T0 E7 U. h0 Q3 sbve声音要方便一些吧,他有可视化可预览的编辑工具
& K+ Z' v* Q8 O' a- n) m6 l
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 6 K9 D- U/ }9 W

8 B/ ^! K' j/ L& H3 ?: C/ X相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 0 F1 b( K6 c: w4 {# O* _
huliawsl 发表于 2024-5-17 21:129 K/ g9 S  [+ n: t
相较于此,我还是认为bve格式会更简单

8 u+ R4 j6 C2 `( N3 B- _🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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