开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
$ C+ A) B* w8 Q6 A; l
- T5 b% b, W6 W( M% S. I$ Z0 R, J+ f( m! O, X. A" S$ G
最近在研究JS 做了一个简单的逻辑来播放声音% R; O! L( V1 L' [8 L6 X
  1. var pit = 1;//初始化音高(速度)
    6 a) A1 X) t* R* p( V
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]  X' |! F  K* [% x' N2 v  @, e
  3. function create(ctx, state, train) {/ @* k, W8 u$ y- x' N
  4.     state.number = new Array();
    " `# e3 A6 e- }$ J. Z2 h: i5 M
  5.     state.soundsspeed = 0;//初始化速度! r. ]9 o0 j- u2 }2 o6 {, ~9 R
  6.     state.speedsub = 0;8 a6 H, \" W3 X
  7.     for(let i = 0; i < 100; i++){- w2 f7 O8 Z6 {9 o
  8.         state.number[i]=0;//初始化数组% }9 ^' {2 D9 B6 R- _3 U
  9.     }2 C, U; k4 G7 W/ R6 M+ o! {
  10. }; f% G) F5 _' e* l: o

  11. ! v4 P' p" q1 h' F( z( |
  12. function render(ctx, state, train) {
    . T/ F( M( Y, k. b7 i
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动2 b) I1 X- w0 T
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    4 ~+ h9 [) q% T/ @6 m/ l) e
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    5 g+ M$ m+ \7 M; C1 J
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    3 H8 ^6 y& d: g2 {+ S( I
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)3 Z1 U3 b% w2 ?% h6 x
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作# L7 ^  _7 e. n( p7 [9 g
  19.         for (let i = 0; i < train.trainCars(); i++) {
    # w2 n9 x; q7 z& J: t' l/ }
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    + W/ j# p3 ?& F6 j; [9 j5 ?+ i
  21.             if(state.speedsub<-1){//如果车辆减速( M  u( C  D( }$ Q. X/ v/ s# E
  22.                 ctx.setDebugInfo("shache",1);//记录刹车* u' j) H& W/ I7 Z0 E2 `+ B, n
  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
    " w4 y# t7 }9 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);//更新返回时间 播放刹车声在转向架21 y% j* X' @, r: H, o  o
  25.             }else if(state.speedsub>1){//如果车辆加速  F& l% G4 t" f7 ]8 g# Z
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速5 _1 {  p0 P0 w2 h9 E0 X$ k
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声2 T8 F* A- {2 y. N
  28.             }5 U" t5 ~% E. m* |# P( B2 |9 X
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声: X, Y! m1 e8 b' v2 h& v0 X6 f  F  v
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声( y& @' k  L( q. N% H. _
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ! ^2 J8 s- B& y9 H" r  [
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右6 G# H% |) B6 w7 }1 a5 o9 z
  33.             }
    7 L+ l. w7 c9 q; X
  34.             if(train.speed()*20*3.6>5){% C* M" `! l1 A  M
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声' c- @1 ]4 @; z: [2 n
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    . P+ e4 c+ m( n6 z8 a1 ?* Y3 z
  37.             }2 x$ K# e5 o) I! _; ~& Y/ I
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    % D: H4 U) l- V" y4 f6 w" F1 O$ R
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声5 A2 _+ M5 }; ~6 Q7 B3 W
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    + T& w/ f, v0 Y: K( g/ z
  41.             }4 ]0 R4 e# a, E( k  T+ F" W
  42.         }
    - c! v& ^  h2 s: U" Y( f
  43.     }+ F5 H3 U  `: K+ y4 B; ?' }
  44.     state.soundsspeed = train.speed();//更新速度+ R% C3 r7 r" R" r7 [& R  ?
  45.     for(let i=0;i<4;i++){7 o& ]4 s2 `/ s
  46.         ctx.setDebugInfo(i+"=",state.number[i]);* r2 R7 O9 K) a: P  b
  47.     }
    3 t6 ]( A0 _! t1 q
  48. }7 v% t4 ?+ @2 x* W
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ; ]9 d4 V; S7 r! B, q2 q* `
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间& ^. H6 G8 I" N& g0 A7 |3 |
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放* \3 |+ S9 f2 ^
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    + b2 `5 ^5 |1 K7 D- N7 ]
  53.     }
    ! B6 |+ A2 X+ M# U* S( c
  54.     return nu;//返回新的播放时间5 I4 u/ C' o* I
  55. }% |4 b: O3 P$ j/ y$ V: f+ H
  56. function grnn(min, max) {//随机小数, u0 p2 g; H: l2 O* {
  57.     return  Math.random()*(max-min)+min;) e0 K7 `' z; l
  58. }
    4 j( _" ^7 H- O' |; l  r1 @
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的' t) L5 v; v7 R" d# a# |/ R! T- Q7 b
  60.     // 获取列车从车库开出的距离
    & Q4 A* {. o. p! N
  61.     let railProgress = train.railProgress();
    $ x+ j! D: C2 D3 k
  62.     // 获取当前轨道的索引
    7 H7 {, x' e/ Q
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 O/ B! i8 k2 Q
  64.     // 检查当前轨道索引是否有效
    6 p& Q! U, ~- S2 h+ S0 ~6 m0 g
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    , Q4 E: `% h: i7 D
  66.         // 获取当前路径数据对象( o& H& X9 M  d! U$ o
  67.         let currentPathData = train.path().get(currentRailIndex);
    " Q0 R2 @- r+ |2 J5 L
  68.         // 获取当前轨道使用的自定义轨道名称
    8 x- Q! z; }' N2 {
  69.         let trackModelKey = currentPathData.rail.getModelKey();4 x0 o+ J, ^) B- t, d- K' n
  70.         return trackModelKey;
    4 Y5 q4 j0 t: O' @; K
  71.     }) }' t; w: E! N, t2 X
  72.     return null; // 或者是一个默认值) K% S# s: O+ C( l1 u) n
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
. q/ p9 z  f% Y* ]6 S: 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:04
9 P( X+ U! Z( }9 o, d  j' V1 @bve声音要方便一些吧,他有可视化可预览的编辑工具

8 B9 d4 m. l: x嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ) b0 L* j9 T: b- [4 x% A' H
  }7 H4 _! a) ^$ B
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 6 u! n. |8 Y- H; U$ r5 X; Q3 E
huliawsl 发表于 2024-5-17 21:12
/ h& v7 r+ j8 D( W. ?6 `: o相较于此,我还是认为bve格式会更简单
& W9 M0 u. F  X. h
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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