开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
) Q  j% V' {1 l; N1 W
1 \+ {' k' Y+ ~3 e+ \5 i# C
1 }% T( V" A4 ^最近在研究JS 做了一个简单的逻辑来播放声音7 l" i( f0 V3 h8 m2 \
  1. var pit = 1;//初始化音高(速度)5 _. E0 u, \, _. Y
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    . P3 N+ y4 F( b3 a
  3. function create(ctx, state, train) {' d, f: {$ X+ B. C
  4.     state.number = new Array();, C$ C5 l: v$ V" p; w
  5.     state.soundsspeed = 0;//初始化速度
    , P& Y1 L$ c5 l2 g+ Z
  6.     state.speedsub = 0;# m% l; g) Z* Q- E* H
  7.     for(let i = 0; i < 100; i++){6 R9 I& H: E6 A, J' \; l
  8.         state.number[i]=0;//初始化数组
    3 Q+ r) r- b+ M  g9 c0 b
  9.     }
    0 e' U- ~' h8 V+ d
  10. }7 r1 W3 o8 j+ S. D! C9 W3 b! U

  11. / U$ L2 i' ?% }
  12. function render(ctx, state, train) {/ H, z  t" a' r9 f9 L
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    4 h+ v) w+ V2 t7 ^
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    2 `( K/ F3 \  S+ ~+ u5 N  v. ?
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    + Z8 l4 |+ Z  L( N) X4 E( c  u- H; [
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差/ }" [/ f6 h3 d7 P6 E
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)8 t3 H+ ^4 B6 P5 i. W
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作$ Z( i0 Z: _- K0 K1 }  Y0 ]
  19.         for (let i = 0; i < train.trainCars(); i++) {
    0 i+ l6 A6 R3 y7 l3 N6 _
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    0 F9 c- R8 [# E7 @
  21.             if(state.speedsub<-1){//如果车辆减速; l: R' U9 N6 G& N5 C
  22.                 ctx.setDebugInfo("shache",1);//记录刹车# {) E1 ]1 H# d1 q6 ^! I
  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);//更新返回时间 播放刹车声在转向架17 |+ t( p" n' f6 I- X
  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);//更新返回时间 播放刹车声在转向架29 G6 A- p8 W; B  q# V3 W
  25.             }else if(state.speedsub>1){//如果车辆加速
    / x. X( e% H; Y# g: F
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    & K% `# L* ~% F# h$ f' B
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声( {  R7 M8 z+ Z( H6 q2 c) z3 u
  28.             }
    1 X% ~5 u- K% x3 y
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声( {0 M  X7 l4 B; a. g- w, i
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声7 q# S6 p! n" w& R
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    * J5 n* U8 s  f
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
      q8 ~3 r& G, Y7 Z2 |
  33.             }% A0 y  Q3 t8 m$ ?* }$ N
  34.             if(train.speed()*20*3.6>5){( \: h" \  h& y
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    7 C' }% K7 ]- I% M  ~
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    8 T; L" C' {1 Z: }
  37.             }1 n& M! d; p9 D: f- ~
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    7 @% B* p) O  C9 y
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 u9 _% \: i! l
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    , [- L% B: P. _; c3 ~, D1 c+ N2 y
  41.             }7 ~) z% _- E$ r0 Z6 d7 O2 E2 ^
  42.         }! ]/ V% Z& W( T1 N
  43.     }4 N( w7 t  O+ @/ t; x. W% v
  44.     state.soundsspeed = train.speed();//更新速度; N3 L! e  X- a/ f2 S3 e
  45.     for(let i=0;i<4;i++){& e) W2 w0 M2 |5 Q
  46.         ctx.setDebugInfo(i+"=",state.number[i]);) X9 ^7 k, P  a# {/ r8 Z
  47.     }
    4 }- l2 }1 A7 B1 `. O
  48. }/ }8 E4 _/ i& r0 E: ?1 c
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ( I4 R! ]- E& M$ D
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    " Y# U, s( T1 ?9 C
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    3 k$ L. D9 z) d
  52.         nu = Timing.elapsed()+long;   //更新播放时间* Y( a2 Z. {6 ^. M
  53.     }
    % z5 u. ^9 P- d  _! j( L6 `
  54.     return nu;//返回新的播放时间
    $ O1 c3 N; i/ ]- ~! `8 N+ \, U
  55. }: ]  V: T4 Y- G3 n9 r" o0 V+ Q$ U& }5 B
  56. function grnn(min, max) {//随机小数
    ; N/ n+ r4 c1 f! |
  57.     return  Math.random()*(max-min)+min;
    ( {( S' {4 E; k* q7 N, P
  58. }4 f  \' ?3 A) |/ n+ r) e  w
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的# h' V" d. ~* _. P
  60.     // 获取列车从车库开出的距离
    / V# w( o9 G- H+ q  @
  61.     let railProgress = train.railProgress();) S0 W. M8 B  N/ l3 A. x
  62.     // 获取当前轨道的索引
    4 K9 s; m# h# e" x9 w3 J
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);* Q( N4 o/ V3 }3 R
  64.     // 检查当前轨道索引是否有效7 h" z1 x: v) Q3 k; Q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {3 z6 g' m$ z4 J4 `
  66.         // 获取当前路径数据对象0 ~. t7 K4 o8 i2 U! Q4 h% O
  67.         let currentPathData = train.path().get(currentRailIndex);
    7 K1 w4 o. \8 b% e
  68.         // 获取当前轨道使用的自定义轨道名称- Q& M1 V3 W; _& d
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    4 p/ F$ d7 ?! f6 l$ S/ S$ ~' l
  70.         return trackModelKey;. {: ~5 \& E- ^) m! m: g
  71.     }
    , w6 Q6 p+ v, d! u
  72.     return null; // 或者是一个默认值6 V- N4 j( o# \! l- I  z
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ R3 G6 v  i; g% s" ~
有事加我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  z! P& x$ Z+ l4 G8 Y' d
bve声音要方便一些吧,他有可视化可预览的编辑工具

2 D5 ]6 [2 }' T# V) H嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
$ C# Y5 @) I, ?& `7 u5 _
- t7 ^- U& H( f) S相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 : d3 N' D0 T0 O5 _+ @' A! a
huliawsl 发表于 2024-5-17 21:12- O1 F5 D5 u; B) z" [9 F
相较于此,我还是认为bve格式会更简单
2 y/ m0 K, [+ B5 D2 Z+ Q+ M
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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