开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 k+ S% Z0 ?9 _& K2 |1 Z! N# V1 C! k+ B5 D  b6 |

- L/ }/ l# n0 z最近在研究JS 做了一个简单的逻辑来播放声音% e7 B  M) `8 |( r; b, Q
  1. var pit = 1;//初始化音高(速度)7 ]- l/ S) L; E- I8 W- G$ m
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    5 P, N* V6 \& t. q
  3. function create(ctx, state, train) {, \; J) \7 b/ y$ w
  4.     state.number = new Array();) G4 |+ r' i8 ~: D. X4 J
  5.     state.soundsspeed = 0;//初始化速度
    % {  [* X/ Q$ ^  t
  6.     state.speedsub = 0;- b4 X: T/ ~; {2 Y5 z: S
  7.     for(let i = 0; i < 100; i++){$ P# B7 J0 b% i  \3 c
  8.         state.number[i]=0;//初始化数组
    0 T' J( t! p7 o/ \. P! E
  9.     }
    $ J, {# Q, Q, F# |
  10. }. k. H( K/ y8 D' U) E

  11. - l$ ?' W1 v. P% W/ h$ y9 a( J* g
  12. function render(ctx, state, train) {4 f+ I+ j4 @/ o  g8 A
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    & O/ q2 Y/ u4 b. S5 D) p
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)$ Z: m! K7 ?# @! D* S
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ( m! w. q; K% B
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ( V0 i* c: M6 F/ P# j. b9 M6 G+ Z
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)+ Y2 w' s; s; L' ?5 d
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    " f/ S/ t0 ?4 M1 @9 P& d: M
  19.         for (let i = 0; i < train.trainCars(); i++) {
    " W& H+ i$ t+ s+ n
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    + i9 C% g, n0 A+ q& [( N0 s
  21.             if(state.speedsub<-1){//如果车辆减速+ R& v) F9 {% T: d  E3 [
  22.                 ctx.setDebugInfo("shache",1);//记录刹车: J+ Z+ @8 _; b5 o+ ~' {9 P6 \5 A
  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
    8 l# F! z4 K; 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);//更新返回时间 播放刹车声在转向架25 Z- I$ ]4 R; P1 l
  25.             }else if(state.speedsub>1){//如果车辆加速; N! b+ G9 W$ g+ V; D. i" C6 F
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速" `+ _: l, Z4 s; _. F. w
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声# P: x6 b/ m+ u. y; S) [" c1 ]
  28.             }
    9 v0 ?2 [2 a7 u* z4 y1 C2 t
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声. b; ]5 z0 F7 u5 G
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    / U5 Y, Q- N, y/ A" n  v
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    # W6 ~+ D8 q; ^! D' x
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ( V$ }/ g2 a! G- L/ ?/ U
  33.             }& N+ |9 B& S# j$ O
  34.             if(train.speed()*20*3.6>5){
    # k& Y& I7 z. U4 p# M# h
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声! z3 p7 _$ w% D/ g
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 Q7 P4 x/ W% Y6 f% o
  37.             }( H3 Q, @+ \. E
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ) q2 I! _3 ]* G4 A) T5 v# W
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ' V7 C, u$ ?: B. ~- Q
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    2 M3 D, x* D; q. h" J% j/ |
  41.             }, [, f: p3 V4 n) b& O; P
  42.         }
    : I, a. g& K* [( Y
  43.     }& f+ O! D% f# U: Y6 P( B
  44.     state.soundsspeed = train.speed();//更新速度9 o4 p( n: d3 u, @5 P7 L, n
  45.     for(let i=0;i<4;i++){
    ! S7 c0 ~' Q. b3 O9 R
  46.         ctx.setDebugInfo(i+"=",state.number[i]);+ O( g- C# W& }8 H+ R# C7 ]
  47.     }% s) u/ R. k) B: N! ]0 Y! F8 Q
  48. }2 M- i0 W7 J4 A4 m, y9 U& U0 t+ ^
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    " M/ O1 u- K) `
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间! N9 u& I" x# L5 A0 @
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    / m' z! s3 o& {7 k
  52.         nu = Timing.elapsed()+long;   //更新播放时间  H3 [. W2 r. z6 I# J) J8 _# w
  53.     }
    + k* {/ P2 Q& B* @
  54.     return nu;//返回新的播放时间
    $ j+ a9 ?  s6 x4 f+ W- H* |$ i
  55. }
    8 P6 L2 m, T6 _" P
  56. function grnn(min, max) {//随机小数4 g, V3 P1 f/ }& c8 K, M
  57.     return  Math.random()*(max-min)+min;/ T4 C  K% Y2 V8 o* i
  58. }6 f9 y* \. s. F
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的4 j! ]- L4 r& Y0 f9 C0 B
  60.     // 获取列车从车库开出的距离
    4 r. L& D  z! j$ S# H
  61.     let railProgress = train.railProgress();
    * H. ~2 {' r8 m( z: \: F
  62.     // 获取当前轨道的索引' ]/ O! T- ?* Q. A- @
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);% w0 u6 o7 S7 {6 ^$ R7 y
  64.     // 检查当前轨道索引是否有效4 @' j. i0 R) Z
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {( y) p9 \8 s, w$ d# n
  66.         // 获取当前路径数据对象) H; J; _( f; Y: _
  67.         let currentPathData = train.path().get(currentRailIndex);
    ' T7 D- H; a* H9 G( p5 N4 F( y
  68.         // 获取当前轨道使用的自定义轨道名称! V7 A5 `( `3 |: p7 Q
  69.         let trackModelKey = currentPathData.rail.getModelKey();; o$ H& ]% P! }0 T' {
  70.         return trackModelKey;7 C' y' l+ d/ Z2 t: y$ h
  71.     }
    * K3 g) Y1 z) R& `  U+ X) U7 g7 j) c
  72.     return null; // 或者是一个默认值2 [% ^8 o; @% Z6 x9 n
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
7 C. D8 f3 K; n& f1 g
有事加我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
2 ?5 f+ ?' ?9 P! `' e% @0 \bve声音要方便一些吧,他有可视化可预览的编辑工具

* T' O$ D; R( Y! U7 {嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 0 Q8 P& {* H0 v6 C$ m& c

2 n- c$ m4 G. S! L. w$ B$ j; O相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
0 a) j3 d* r4 X' I- O4 n/ c3 }& y
huliawsl 发表于 2024-5-17 21:12
2 R" d: I( y6 O) n相较于此,我还是认为bve格式会更简单
' Z/ k6 g" D7 G- r) \
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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