开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 7 J# |8 S/ ~; Q; u# H) V. v2 [8 C

6 v$ x$ c0 Z3 y  S2 l
% T6 j0 m4 R: O. w最近在研究JS 做了一个简单的逻辑来播放声音6 N) A9 |) t4 ~9 K* `, A2 r8 a
  1. var pit = 1;//初始化音高(速度). q" L4 z) T/ A) g% B
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    # T8 |+ g; g6 m: s9 F3 O4 K  `
  3. function create(ctx, state, train) {
    7 K: d6 f$ j. L5 K2 D
  4.     state.number = new Array();
    ( P, ~, \" m3 Z; t3 o
  5.     state.soundsspeed = 0;//初始化速度* h! _4 i: |- m9 Q8 k# U" r
  6.     state.speedsub = 0;# r6 G# p0 M7 e7 v% g1 z" D; N! x
  7.     for(let i = 0; i < 100; i++){
      r' E9 w' }% i2 n' e+ Q
  8.         state.number[i]=0;//初始化数组8 S) J* X/ P4 |  C' v
  9.     }/ _0 V# \$ G6 l1 B# x  Z
  10. }
    * B+ Z, F+ f  c3 J  k' m& P
  11. 4 N1 r2 T5 y  |
  12. function render(ctx, state, train) {4 I/ b4 U& D) X" L
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动7 \; p. t7 r. h. k  {( F* Y
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    9 s+ O' }  p5 q9 K. |, t1 p
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    7 f; m$ ?: T8 K' L5 E; R: {
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ) p/ V* ~) M. z5 Q8 C+ l
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    6 p, V8 `% Z# U) E* n  G
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ! Z6 g" n& j8 X, T4 d% W$ c
  19.         for (let i = 0; i < train.trainCars(); i++) {$ p7 [- {9 x2 ?8 C: h" }
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启' g- n+ `3 |; h& P$ x% I
  21.             if(state.speedsub<-1){//如果车辆减速
    5 k, c' B! c2 ?! J0 O
  22.                 ctx.setDebugInfo("shache",1);//记录刹车5 B, j* ?0 M$ K. z1 `
  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);//更新返回时间 播放刹车声在转向架18 t' H# m9 g% q! y: q. P
  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  `7 K2 k: M5 G! {2 n
  25.             }else if(state.speedsub>1){//如果车辆加速
    8 D4 Y2 w+ w( n8 h' J
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    & u4 T$ k' V# i' M. ?
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声# b9 G) ^3 y9 g8 e5 I- M
  28.             }
    4 ~- n% J. v# G' n
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声/ g2 m3 @- u  i) O* U! k# T# p
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    + W( w4 D, J4 l: [5 N1 i
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启  w6 W5 `7 a& v3 c5 l9 r$ u
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右; K$ W8 [3 E  d( L+ G; t
  33.             }" k  c+ d, h% U2 Z8 E- K
  34.             if(train.speed()*20*3.6>5){% E# d4 K9 R$ Q$ W. X6 f' F
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声: O! d: j+ x9 d7 w( {" f" v
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声1 K7 H; L6 m% ]' f0 E! U
  37.             }! l; W  }7 B3 |2 d, `
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    9 J* t" d+ h) @$ O) |5 x
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    6 Z  ?9 f" _; A8 J" m
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声! q7 G) M, p. p, q/ }9 {- e
  41.             }
    2 u: n! `4 c! v" L8 P: N
  42.         }0 ]) \0 x9 A( i) f/ {( q
  43.     }
    + ]8 V8 _+ L+ Q! N9 }' c
  44.     state.soundsspeed = train.speed();//更新速度* i, W% ?( r  H5 w' X, d: q/ B
  45.     for(let i=0;i<4;i++){
    ) u& q: p$ [6 u) m
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ' q& J( h7 i, e- H, l& O
  47.     }
    - e$ o0 O$ J6 n+ D* O
  48. }5 N7 W2 c6 l* @) \8 Q
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    7 [# P) y  Q' M% A+ \: p0 G8 x
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    " k6 e$ T7 ~+ [8 O. L! ]; W9 m
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放2 a5 O* }, q" b) p+ Z. o9 |
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    5 E3 C, V0 ]  ]; |, U/ R6 E0 A3 j  h! Z
  53.     }
    ' ]* F9 D' u1 F% m, R% M
  54.     return nu;//返回新的播放时间7 n. `! B0 S" h6 n  e
  55. }
    5 [- \9 \1 a% t) \/ p8 Z) h* B
  56. function grnn(min, max) {//随机小数5 C- s0 T! ?; z, X$ l) L7 U# Z! b) y
  57.     return  Math.random()*(max-min)+min;
    4 X' N: f/ Z+ F
  58. }9 ]2 w) v& v' K6 h% @5 U
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    * Q3 ^- {# X# [! L0 ^% r
  60.     // 获取列车从车库开出的距离
    3 m' N$ Z6 d) K! W. B% o7 w
  61.     let railProgress = train.railProgress();
    9 N2 ]( G. P: O  x" \2 s. E  S
  62.     // 获取当前轨道的索引* B$ ^' Y, E, Q9 X" I
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    : P0 P8 c# T6 P8 l& T# I7 R0 s
  64.     // 检查当前轨道索引是否有效
    % v1 J8 {' |% g# ^
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ; T% s" r1 o0 _
  66.         // 获取当前路径数据对象
    + l# z& X/ Q# G( r7 M. x7 \
  67.         let currentPathData = train.path().get(currentRailIndex);! W+ |# g! X& _: B3 H" P! o
  68.         // 获取当前轨道使用的自定义轨道名称
      `6 \% P/ U2 I  q
  69.         let trackModelKey = currentPathData.rail.getModelKey();0 R7 H2 e, [; V: Q% O
  70.         return trackModelKey;& ~* [4 c7 h6 c$ L% r
  71.     }
    2 e6 ^. M0 t0 `1 a  n' ~0 B
  72.     return null; // 或者是一个默认值
    7 p+ H2 {. J5 y8 e
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
% Z2 d$ L6 t2 o- p
有事加我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:043 c. N; y. n( E  i$ q1 f4 E6 {
bve声音要方便一些吧,他有可视化可预览的编辑工具
2 J% x1 I, w" o; p" M9 ^! a
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 2 s+ Q6 A# \* W/ f3 `: V

6 A0 \7 R9 b% f1 C相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
% o# c9 m5 E% u- H( g+ r
huliawsl 发表于 2024-5-17 21:12! G) ^# H2 t1 |( h9 K9 Z
相较于此,我还是认为bve格式会更简单

4 B( B) _9 S+ f% |, Q" U# l🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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