开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 ; G1 N6 R: l9 Y1 Q7 e) r

" B# g. ?( |% n. I7 t% G1 `* f; N1 N
最近在研究JS 做了一个简单的逻辑来播放声音
4 v0 F: q7 c' Z- j
  1. var pit = 1;//初始化音高(速度)
    - A0 O& V, r5 L2 X  _0 r( L
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    + i2 P) i5 K/ d% \: U7 N
  3. function create(ctx, state, train) {
    : w; _& M& N  C; p" [9 m
  4.     state.number = new Array();
    # Z, D( S* {$ U+ H, ~
  5.     state.soundsspeed = 0;//初始化速度3 e+ N, W# m" k: M. S. |* n% l
  6.     state.speedsub = 0;
    + p' b' E# o8 s8 ]5 k9 R
  7.     for(let i = 0; i < 100; i++){
    3 n! `& u0 Z& W$ E1 X# L
  8.         state.number[i]=0;//初始化数组
    5 P& [" u. V; X, s& W0 l; W
  9.     }; @& n) M" n- l7 g$ |# a. q$ p
  10. }
    3 C2 n9 k( z$ b6 U; s6 p# S

  11. 6 n5 X$ {6 D1 X% O5 W1 m  K
  12. function render(ctx, state, train) {
    * `( c% Y6 ^. Q2 f" p0 d
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    2 C& |  S8 r: g
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ) Q, h8 Q! K- e6 E; w
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    * Q6 f# y8 `3 @0 f
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    4 y1 N4 _, F+ m4 y
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    6 J* j$ x: w4 g5 M
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    2 H% z) H3 w( F2 ~: C8 ^. s! V
  19.         for (let i = 0; i < train.trainCars(); i++) {; n' s, y: R& A5 R$ W
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
      X) `# `+ g* J9 a% }7 R. G4 j
  21.             if(state.speedsub<-1){//如果车辆减速
    / w3 e) l% V6 b$ P0 S! |* ^" Y
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    * q% V# g+ X. u0 u0 @. r
  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
    0 z$ n! D: t" o
  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
      ~, j9 q" J8 j0 e3 Q% N
  25.             }else if(state.speedsub>1){//如果车辆加速
    6 ~( Z% w) G  J! G4 S. r
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    ; p1 o6 D" q% y  V$ I
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    $ Y  ?! {4 S- s/ I
  28.             }
    / ?3 D( O. ]# q& j, i
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声8 D  k: G6 ]. v# @8 s! @8 X! ~2 d! Z
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声( c1 ]! v" x5 b. H7 `9 i; w/ |
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ; d1 |$ b: x9 H' C$ w+ l
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    " p3 M& C! X* L1 ?  K$ p  G- ^
  33.             }* `0 V4 Q" {/ Y  z7 `3 @
  34.             if(train.speed()*20*3.6>5){9 T3 G6 @  p6 D; |! x/ ^
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声) ?1 G( U' Q) X3 A0 y5 \
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声) h2 M2 H7 D3 y4 _  I5 q
  37.             }1 d5 l3 Y8 l* M; a& O
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    # s8 S( T1 |+ A* i' p" O) H  D
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声) P+ u$ l" K3 M/ M4 J9 w" b) n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声# _. R2 \+ d0 I
  41.             }( v0 u. `8 T, \: w6 O$ j
  42.         }
    + a; h6 d6 V2 ?8 r, J( ?" |: }
  43.     }
    , k  ^# r$ y7 M* F3 N% G9 d
  44.     state.soundsspeed = train.speed();//更新速度
    8 t* [, C% f, |% [: b' i
  45.     for(let i=0;i<4;i++){; Y; S( k/ T7 r+ `1 u
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    4 k7 j6 f+ Y0 w
  47.     }; g& e: k! }5 e" n5 R/ p9 m
  48. }
    ' K: n/ w9 k% J8 u5 D2 ~. l- g3 y  {2 ?
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间$ T% i; t  Z! u4 V) y& V
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间$ ]2 m: G2 X3 r- X1 z# v
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放/ T0 E: S- @7 Z# u- H  o
  52.         nu = Timing.elapsed()+long;   //更新播放时间6 M  H0 `& K4 `3 _
  53.     }2 H: j2 q' ~7 @7 r9 M9 q$ F
  54.     return nu;//返回新的播放时间
      z* k4 k9 G/ U
  55. }
    : P+ n: ?" q3 g# X
  56. function grnn(min, max) {//随机小数
    ) y- ?0 B; e, G5 _; _# Y$ i% b1 u
  57.     return  Math.random()*(max-min)+min;1 l/ J- H) d8 [: Z
  58. }
    ! F& K5 b' j" F
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    6 I( S& ~- Q* [0 d
  60.     // 获取列车从车库开出的距离$ H, b) Q! Q! D' ~9 I8 k) D3 |
  61.     let railProgress = train.railProgress();
    ( G, b8 L" N) Y$ l6 p2 z2 {2 R
  62.     // 获取当前轨道的索引
    2 y( Q! D6 O# I2 d9 l
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);9 l+ X9 K, O2 z
  64.     // 检查当前轨道索引是否有效4 \! C& W8 W3 T
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {. m- P" s& K5 }6 W6 V) f
  66.         // 获取当前路径数据对象
    4 a/ m( t1 d. o: o
  67.         let currentPathData = train.path().get(currentRailIndex);
    - ]. Z9 }8 h/ T: a% V3 L
  68.         // 获取当前轨道使用的自定义轨道名称* Q9 J3 I/ j- a3 \/ Z
  69.         let trackModelKey = currentPathData.rail.getModelKey();; a( r1 C4 A) e4 ^3 e! F
  70.         return trackModelKey;
    ) @2 o' [" l" A! S" T% D
  71.     }
    9 \4 z* Y' s; |; n
  72.     return null; // 或者是一个默认值
    ( L; H2 p& P% I* {4 |; F
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
% a1 y4 _" y- s2 G3 F9 [$ Y1 ~
有事加我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
! h8 g2 ~4 ]1 W# Y0 R5 V7 f3 `bve声音要方便一些吧,他有可视化可预览的编辑工具

5 d* s( l8 Z5 d8 m嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 9 a, l0 _2 E/ y- [# j; H' C0 w

0 R# u5 k2 q' d相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 % D% _6 ~4 v# {! i2 A7 H
huliawsl 发表于 2024-5-17 21:122 h7 U* d; x9 w1 Q' P
相较于此,我还是认为bve格式会更简单
2 J) T! o: `( d, r6 u% C+ g
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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