开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
; i* g; v8 R2 k# Y
% i# |9 c  N% G$ x! m8 ^. o8 h7 c; {( Q" _' w) t& U$ A: ]
最近在研究JS 做了一个简单的逻辑来播放声音
) x2 n' R7 m& H* c9 w+ R( P
  1. var pit = 1;//初始化音高(速度)$ j1 d  r7 R: U, s1 _+ H9 f
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    : n& ^. m1 y; o7 |
  3. function create(ctx, state, train) {3 ~% z+ D( T8 L9 [- B9 V& X
  4.     state.number = new Array();( n' J9 v* T4 k) u1 X; n9 d, I5 L
  5.     state.soundsspeed = 0;//初始化速度
    9 F' V+ X; x2 s$ W* d
  6.     state.speedsub = 0;: x4 ~; X6 T7 X
  7.     for(let i = 0; i < 100; i++){3 j* c; y9 c* K  R0 j' y
  8.         state.number[i]=0;//初始化数组( ~2 }! q' u2 H5 d
  9.     }
    ; e8 E) }/ H, [+ @4 N" ^
  10. }
    7 c4 u$ {) \- ]) ~( U( L% x
  11. 4 A5 v3 a/ w( A+ Z% l! @
  12. function render(ctx, state, train) {( T1 |2 e, H7 W% p
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动4 C2 P9 y8 l0 O9 b" ?
  14.     pit = 1 + train.speed() / 40;//更新音高(速度). X& A3 L. F, o& D2 ]
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称      U1 p$ S  i4 R# X9 i4 C
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    5 @9 [9 B) V( @. q. }) i
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)& q5 f" `7 z9 Z& C: e
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作: F! a8 a6 Q+ I+ J. t
  19.         for (let i = 0; i < train.trainCars(); i++) {
    0 m5 U; H- }* z0 a/ `5 t8 O
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启8 ~' f( Z8 o7 n5 q1 H
  21.             if(state.speedsub<-1){//如果车辆减速
    0 X) a& G$ o. u5 |7 R# c
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    6 ]+ h, c8 {& @' B6 t- o
  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. X2 e; ]2 M8 y8 Z9 Z
  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
    - P9 v) }0 @3 N/ e/ b
  25.             }else if(state.speedsub>1){//如果车辆加速0 c- b% A) n3 {* E' M' w1 L* D0 `
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速0 Z9 a/ h  q* }: \3 ^
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声! l- r5 M. F' o  ]- w' l8 A
  28.             }
    ' X; t$ M7 x2 O: H/ G) Y
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声, |* c% c9 q. N* }2 P
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声) n; _  Z( m9 u5 g/ @. b  L
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启: w9 F( Z! a7 w9 A6 W# p
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右; E! X# k; m+ {& n, ]
  33.             }
    9 Y6 j" f* x6 n0 ]
  34.             if(train.speed()*20*3.6>5){+ A/ x  n% X' v6 O  [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    3 I6 i" u2 y& m
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声. Y; z3 E8 }& w8 E- h, I
  37.             }
    * o) m$ m: ^# ]. V# B4 _
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    : u& D  |2 f+ k  ]$ L) A) ]" s
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声) H, _8 [5 w4 f8 n$ y
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声! D0 l# v, U& U6 n, a/ G4 T& S0 k
  41.             }# [6 q) ]' |0 y% R' R. A2 E( v/ t
  42.         }3 _: N0 @+ j1 t& R
  43.     }
    1 X3 [4 r( b! X( r' _3 _
  44.     state.soundsspeed = train.speed();//更新速度$ Y/ n- ~0 |) N. z' [; {0 _" W7 ?
  45.     for(let i=0;i<4;i++){9 K! k( }$ P1 s* _% L9 |8 w9 t5 H
  46.         ctx.setDebugInfo(i+"=",state.number[i]);7 f( R: s% U/ u. }$ R9 z
  47.     }
    4 \3 {+ _3 r! b1 v4 `
  48. }
    1 p  u" T& m. Y) b+ |
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间/ J+ e, ?$ g" V' B
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    2 i' H" H7 e) O
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放' q8 J* U% n% `1 G2 D
  52.         nu = Timing.elapsed()+long;   //更新播放时间' d  T5 q+ x, t& J. W2 k
  53.     }  X& M7 n  u' v: t4 K/ V; a& K
  54.     return nu;//返回新的播放时间
    9 U+ n- n" F" x3 `0 G/ o. p- y( R3 m
  55. }
    / s9 f+ p4 Q0 W2 |: s% Y7 \. g
  56. function grnn(min, max) {//随机小数: L9 N: Q- N8 _9 ~
  57.     return  Math.random()*(max-min)+min;
    1 n. Y3 n6 U; R, O
  58. }
    / f- ~( K* ]  ^: Q; q' F
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ( P1 L* r6 Y& C. [9 W+ W6 O2 W
  60.     // 获取列车从车库开出的距离) z$ x5 p* Y3 Z
  61.     let railProgress = train.railProgress();9 S2 ?. S/ \8 k( H4 _8 l5 a
  62.     // 获取当前轨道的索引% ~, K2 ?0 J' c) Q  [
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);4 w6 y( }* P  O2 }- Y
  64.     // 检查当前轨道索引是否有效
    % u, s9 ~" B! }2 J% [& d8 o) n' |
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ) L! a% b8 u$ W
  66.         // 获取当前路径数据对象2 ?! X6 M. j! T/ o7 z# ~! ^
  67.         let currentPathData = train.path().get(currentRailIndex);
    ! r4 O3 s" r! i- o# C
  68.         // 获取当前轨道使用的自定义轨道名称, L1 u7 Y& P/ J' |& [
  69.         let trackModelKey = currentPathData.rail.getModelKey();0 ^9 i, e' Q/ {  W& F& b
  70.         return trackModelKey;
    $ t4 G5 e+ F" o, W
  71.     }
    3 {9 m3 ^: ^# |4 c# X) J
  72.     return null; // 或者是一个默认值
    # z( ~! ]* h- X: S8 ?' e, ^6 }7 u
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
/ e2 I( q* H3 m6 q1 ]! J3 X+ ]
有事加我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
: g  K3 }' ~' A& M* _  ~/ t% h9 P- Qbve声音要方便一些吧,他有可视化可预览的编辑工具

7 |% \/ z- Z( q6 D( g  @1 ~3 W+ u, ^嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 " u: ^' h& U7 v" }+ S

+ k# [7 k9 [4 D. T# L相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 7 ]; e  A8 y3 U. i
huliawsl 发表于 2024-5-17 21:12) x7 m2 V6 f* Q3 ~7 Q
相较于此,我还是认为bve格式会更简单

% M5 x; V) J) \, C: }6 C& S4 C🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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