开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 2 G) c  r2 [; W: f
' @+ ~6 |, q; [; V

+ w5 i, F' X% g# R最近在研究JS 做了一个简单的逻辑来播放声音
$ N% O" n8 ]' M* e
  1. var pit = 1;//初始化音高(速度): m; ~* H4 Y" \: U
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]$ g6 D! i+ B6 @% X1 p( w
  3. function create(ctx, state, train) {
    & ]. C# G2 s7 s9 U) ?4 G
  4.     state.number = new Array();
    7 F: A+ Q+ k; n3 `
  5.     state.soundsspeed = 0;//初始化速度2 P0 |0 e- s7 A5 I
  6.     state.speedsub = 0;
    5 j2 _6 v7 h. C. b0 z, `1 r8 l
  7.     for(let i = 0; i < 100; i++){+ x  d% G) z3 h) v: u  n- K
  8.         state.number[i]=0;//初始化数组6 c. i& j- W  i& c* |" R
  9.     }
    & e( x% L( ?$ \: e* U  q2 e1 L
  10. }1 o& i% D+ F# m2 F) U1 C5 a, \) u
  11. * o) P+ M; n' d  Y
  12. function render(ctx, state, train) {% m4 O# q& p3 B8 S& l2 y. i
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动& X6 |2 c8 f5 r8 a
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    / l% _2 y* R$ n0 L2 U9 A
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ' ~- H; X' N% s# q
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差- F$ ?" N9 [0 R+ c
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    5 U; d. [/ Z; j( p7 H8 J
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    6 S, ]$ z4 Z: f; h: c/ w6 S
  19.         for (let i = 0; i < train.trainCars(); i++) {0 V: w" M  Q, O, j' ]! Z
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ! ^2 P0 M# }) b0 G3 `$ G- x2 U. [
  21.             if(state.speedsub<-1){//如果车辆减速
    ( y& ]. L3 |  r/ q: l) ~& B% m) V
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    " ^5 Y2 F' s( X+ y( _- c8 Z5 Z
  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 D8 m4 _! R) g/ 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
    " E  C* }# d3 W
  25.             }else if(state.speedsub>1){//如果车辆加速
    2 x0 M% O4 [- F- `
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    6 ~. y4 x" M& B* d5 L: q
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声8 q3 q2 a/ n$ @. a- K
  28.             }
    4 j% y9 u1 N# p. ^+ \( b% R' o+ a
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    + F' M; T3 n# ~$ `4 l6 p) n; V
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声0 {! m9 W  M2 H
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启+ b1 \5 ]+ Y3 P5 r* e  x5 h
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右% o0 f# P$ s3 d' |2 Z
  33.             }6 U& t, ^7 j8 B
  34.             if(train.speed()*20*3.6>5){
    ) g- ?0 E- p3 o! Z$ T
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声, z! M) h/ M9 j3 z! g
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声6 w, g3 J. |. b
  37.             }
      L; v& i) ^# ?. w
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    * h" h  x- r. l- U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    * R5 e1 y& \& V! q
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声! H' m( ^* N  `: b
  41.             }
    ( O/ [% r( `3 N# [+ w
  42.         }' W: Y5 ^( c# f4 I5 T% [
  43.     }
      J* \4 S8 f0 W7 u
  44.     state.soundsspeed = train.speed();//更新速度/ Y9 v; Q1 U5 R
  45.     for(let i=0;i<4;i++){  ^( Z, B( s3 c/ T( P. W, T
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    * `  [% ~/ E6 S  M" w5 Z, n$ N" Y
  47.     }
    * z3 Q6 t6 S- [% \; E3 h0 p! u
  48. }- h  G, N% v: h" z. e
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    * T/ F: w5 M7 _: C! p- z6 h: L8 O
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间9 {5 v$ m" |2 H
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    $ o- v. h+ s+ l' }( }
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    / b& v* b+ f- Z1 O3 b
  53.     }
    ) j8 }2 A# }/ x. U" i* }* A
  54.     return nu;//返回新的播放时间
    ( o) I* [# H; _
  55. }
    ( t1 {1 a) {6 {$ I' J$ B4 D' U
  56. function grnn(min, max) {//随机小数. c$ ^9 O" L) e
  57.     return  Math.random()*(max-min)+min;2 @- r- S# P! d
  58. }" L) z6 p7 y2 L0 X% X- J# N" \
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的3 C' X' B6 k' p5 ^/ r$ r) C' [3 F/ C
  60.     // 获取列车从车库开出的距离4 [- K$ A) v: }1 E  E. K4 X, i) @
  61.     let railProgress = train.railProgress();
    4 i, O; q& W( S6 B- M8 u
  62.     // 获取当前轨道的索引
    4 W5 n5 m3 m* ^, n; P6 F! q
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    8 ^/ T9 m# {3 A
  64.     // 检查当前轨道索引是否有效
    4 z$ d6 |# _0 E, j
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {+ }* g) k3 C6 r9 R: I2 J
  66.         // 获取当前路径数据对象  q- H$ Z0 n5 {" `' D* o# ^/ \
  67.         let currentPathData = train.path().get(currentRailIndex);
    , g& E$ X  l) i, L2 H$ E# @
  68.         // 获取当前轨道使用的自定义轨道名称
    2 A! I1 u  M/ o& J6 C6 O
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    2 r4 b8 t  N5 x( b% g2 P
  70.         return trackModelKey;
    1 b$ d. e9 B' h# z9 Y& {0 T0 v8 e2 y; K
  71.     }
    / Y: [+ X# D( o& C; u
  72.     return null; // 或者是一个默认值5 J( R  f( o: i3 A
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
0 Y: M7 g! |7 ?
有事加我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. o  W2 }0 ^/ K; ^$ {
bve声音要方便一些吧,他有可视化可预览的编辑工具
0 X8 ?) T- N; I) p7 L
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
8 X# Z( M! T  M  f& K1 }( o8 O$ g( \, x. t# q  K. a
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
% }* ~1 e; h; {. W7 q5 E
huliawsl 发表于 2024-5-17 21:122 z/ g4 E0 F: K% C% Z' H/ `
相较于此,我还是认为bve格式会更简单
+ Z4 X7 L- Z$ u* _7 o4 P
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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