开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 - x8 |1 w9 D1 T' _
) V- y/ u; r, X# C
$ s- ?6 o8 A/ D: ~
最近在研究JS 做了一个简单的逻辑来播放声音$ V; G  w: Z9 w+ n0 O" X
  1. var pit = 1;//初始化音高(速度)
    5 [$ P; S; r" j) z" Q' S3 z$ X
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ _/ r/ Y9 o2 f" K
  3. function create(ctx, state, train) {
    : A3 [4 L% ~( l# r/ R% O" n
  4.     state.number = new Array();9 m' }+ T4 o) [  O! B. @/ \3 }
  5.     state.soundsspeed = 0;//初始化速度
    6 s+ d) Y1 ~- B' Y8 r3 V
  6.     state.speedsub = 0;
    & t6 V8 v  i0 t: @! M: A
  7.     for(let i = 0; i < 100; i++){
    ' a- H5 T: t% O# s1 r8 g1 f
  8.         state.number[i]=0;//初始化数组
      t9 t4 N& t3 y1 |
  9.     }+ k' x+ Y3 F: U. p2 x+ Z) V
  10. }3 x7 E8 f  r5 ?: |2 k$ R- ?0 m4 z8 b4 r* {
  11. - f2 |' d+ r$ I4 ]' Y
  12. function render(ctx, state, train) {$ Q& h7 ^0 n: L0 r- _% U
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    % T9 z+ B8 f: t6 I+ r
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    : b3 r2 i. k1 E+ Z$ Z9 A0 r
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    + p# k( F7 n6 }' l
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    6 K7 i3 p2 o) P6 r4 X
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    / e3 T9 i% J, g7 K# K4 }
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    : C' R! I) J' J# N% ]5 \! U
  19.         for (let i = 0; i < train.trainCars(); i++) {2 V# Y+ z. A& J" f5 D& K
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    7 R3 e1 R& J2 d4 f. d
  21.             if(state.speedsub<-1){//如果车辆减速
    7 k# ]  x) d1 z9 E, J0 |
  22.                 ctx.setDebugInfo("shache",1);//记录刹车" @" W) C2 l$ l9 F7 B' h
  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
    ) z. ^( H, h* m
  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
    3 d: O8 l0 m& G: ?6 Q  E
  25.             }else if(state.speedsub>1){//如果车辆加速0 U  p1 `) K. G9 R4 F' E; a. k+ y
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速2 |8 }- \  j6 g  ]0 k
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ' m2 T0 O& g$ ]
  28.             }7 H7 G8 ?1 j. Q. y% h  b/ o: x. T
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    5 @3 J' c  j" }# y0 C3 @+ f1 w4 A
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声; x" N' H( k% P0 Z7 w$ L% K. h# z
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启- r7 k# l, Z  X. v
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右# A0 u! c* u3 i6 B9 d+ m( [
  33.             }
    / U% |1 [% L; f& ^0 ~
  34.             if(train.speed()*20*3.6>5){; d. `+ Y' t% ], x1 R% M( M) v7 q1 v
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    9 ^& H3 D  q3 Q3 p" K, K9 Y" Q% t
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    + P' R: Q4 O2 ]' i: i
  37.             }; J; y8 i- j5 |6 e) H* _8 q4 x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    : T* U0 @7 n  }% b# U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声9 k- H7 y, V9 {
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声1 P  x# G0 ]5 z" A/ E' F& a" T) F
  41.             }
    . \9 O1 N+ r4 E
  42.         }$ G+ O6 ^2 h  R
  43.     }' G  A( z2 h* Y5 {) x
  44.     state.soundsspeed = train.speed();//更新速度# V* P! i! z4 O& z/ c3 W( V& n
  45.     for(let i=0;i<4;i++){
    : C  o9 t- e$ m# D
  46.         ctx.setDebugInfo(i+"=",state.number[i]);8 ]0 G2 a/ E3 L
  47.     }
    2 j4 L( l+ x2 r9 \- M1 i
  48. }' m( P- I9 x0 x) p! \9 E9 l' j% d
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    / l6 t" [# s, s% n4 e! m
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ) x; Y0 h8 ^  i( E5 W; E4 E
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放9 s7 k/ S, K1 k: {0 p2 t! s3 T  w
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    % Q& [; K, k: h) {1 y
  53.     }4 I: y1 [$ W3 h7 f: U
  54.     return nu;//返回新的播放时间9 j* z- B9 C  l8 I0 M/ L
  55. }, t5 C4 Q/ T' D
  56. function grnn(min, max) {//随机小数% d1 ^2 N: C- x4 p2 i
  57.     return  Math.random()*(max-min)+min;5 G  T  b* @" R' N
  58. }
    ( T8 T, g6 h3 h) K' `: p' L' A4 L
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    7 }/ s; F8 a! e  G% Q
  60.     // 获取列车从车库开出的距离
    / D# ^# ?) a6 w8 Z* Z
  61.     let railProgress = train.railProgress();
    # g# B) Z. U$ \: Z5 Q$ ?0 i1 |" W
  62.     // 获取当前轨道的索引
    6 }/ ?" x8 p' b! x% G5 ~, X* |) V3 n
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    * N- A% ?! U" n0 J( D8 l/ v6 Y
  64.     // 检查当前轨道索引是否有效
    : H) R" [2 p! l* N" E4 C: }: i9 ~  _
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {6 r9 H( V' A8 W; n- `2 M3 i
  66.         // 获取当前路径数据对象
    * A: ?$ c$ ?8 i; }, W$ K% ]
  67.         let currentPathData = train.path().get(currentRailIndex);
    * y4 j6 f8 ]6 L  E
  68.         // 获取当前轨道使用的自定义轨道名称/ n7 C  u/ D* o8 H+ Y
  69.         let trackModelKey = currentPathData.rail.getModelKey();
      e6 d' R! C* b5 N5 C
  70.         return trackModelKey;4 i6 [/ |! M; x6 Y6 P! {2 U: w3 B
  71.     }( o/ M7 a( N, n4 m9 z) o
  72.     return null; // 或者是一个默认值
    # U4 `# W- N1 b8 \
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
6 A1 b" t& G7 O$ _! W( e8 m2 }+ Z( 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- w6 W' j0 k0 ^& L# K
bve声音要方便一些吧,他有可视化可预览的编辑工具
9 |( T  N- ]" H' K/ m' ~
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 2 A, `- c( r* E7 r: H% ^9 i

& l( M/ X7 i* k5 A相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 # u9 h( [# s  \: \8 w9 S4 O
huliawsl 发表于 2024-5-17 21:12" D/ d* z2 y: f7 |8 r
相较于此,我还是认为bve格式会更简单

9 ^' j* S5 u. |, [🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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