开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 - j' G# O" E5 M) T  x" Y) t# ^" ^! P( Q

4 v9 A' r, l. C0 z: x9 n3 p  H* Z5 b% N$ D/ s5 {
最近在研究JS 做了一个简单的逻辑来播放声音" `$ }9 ^. L( b, ^. |* A
  1. var pit = 1;//初始化音高(速度)* Y, S' D3 f! b. `4 h& M
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    , |" U3 X; H; E- A) N
  3. function create(ctx, state, train) {' f8 t+ F, l! |3 f) S: J
  4.     state.number = new Array();, u/ n1 p' F& }9 S9 D4 Q
  5.     state.soundsspeed = 0;//初始化速度
    ( @; Q- p- d6 ~' P) u
  6.     state.speedsub = 0;
    2 G# V% @* V$ o& F; x) P
  7.     for(let i = 0; i < 100; i++){5 {/ r$ Z3 B( K) Z. i/ }+ o3 P
  8.         state.number[i]=0;//初始化数组5 m2 H, f& C7 H7 m; m! D" x
  9.     }
    % R4 a& |+ t  D4 Z  F) r5 G2 Y& S  V
  10. }  c2 X5 n! l7 N2 o( W$ i
  11. . Q" |2 J& s, u* P! B7 N4 L
  12. function render(ctx, state, train) {
    $ [, `( \1 M) A' v6 L# T
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动( U9 \5 ~" _3 U- }$ I* d" i4 @
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    1 Z$ r" m; K7 C
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ) r4 G1 |! M; I5 b' B
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    $ ?: B0 }/ W# k  P  x' w
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    . a7 I$ w3 F$ z' U9 j
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作4 I3 }( r% s  T1 ~
  19.         for (let i = 0; i < train.trainCars(); i++) {5 q  Z% ]3 r& }% `
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启* b! G1 w: O' r0 \
  21.             if(state.speedsub<-1){//如果车辆减速
    - ]' n; ]; Q$ o1 ~% F. ]
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    ' D4 P7 Z& g- ?; @6 l, z
  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
    ( G4 X* S- w, L) X# O0 l
  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
    . U3 Y8 z- M4 I6 i6 q
  25.             }else if(state.speedsub>1){//如果车辆加速
    6 H6 i2 j" V+ Q6 z
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    , |# D" x& G( H& n
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ x4 F4 f9 ]9 @$ |9 X( {
  28.             }5 J+ n& K& `# g* A( J6 E
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声7 X; ^" D. W. l6 c9 D/ O9 F
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声7 Y! l% J" s; L& L* e; s
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    5 T  P! r5 [' V. j/ k- b
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ) v; m* ~) e/ J( w
  33.             }# q; a4 o6 ^/ w0 g
  34.             if(train.speed()*20*3.6>5){
    ) {' h' \& k# K2 l/ [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    2 i; C# f; ?' h8 Q9 }- {
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ! }4 E0 \- y) h" P
  37.             }2 Q1 B; p$ J: [; |  R. {, q- D& U
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    , [# s2 ^4 ~- F% n: e
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    : ~7 `/ A6 v# M5 \& w* S% h+ j
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声0 L& R! b$ C- r7 t9 W$ Z
  41.             }
    6 {1 e  o! r2 R: H$ z
  42.         }
    * E) h2 N) M$ a& ~  Q+ N( a8 g
  43.     }9 |  C& E& {1 H8 \" V& E; c
  44.     state.soundsspeed = train.speed();//更新速度
    / f( h; b8 A* |  q  o$ s
  45.     for(let i=0;i<4;i++){+ O1 j0 m+ L- O* [, x+ `6 e& `
  46.         ctx.setDebugInfo(i+"=",state.number[i]);  D; p# P% y% Q+ o, {9 Y
  47.     }. I6 P! \% [' p' ?4 {5 ~  @
  48. }$ T2 b  K6 |8 }# u& _& Z* Q6 {" N% C
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间/ e0 r- ]/ r" w) K6 w, G
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间3 ^6 a7 ], |, t) e; Q, d
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ) b. n  `: |, y9 l
  52.         nu = Timing.elapsed()+long;   //更新播放时间- u* W% L* J% B1 w  j
  53.     }+ }5 l1 ~5 ^( K8 M: a% s) A
  54.     return nu;//返回新的播放时间
    3 u: J- }" [, ~, E
  55. }" t, r8 G3 J' E# d
  56. function grnn(min, max) {//随机小数5 h, ^9 V( M! N. o+ o
  57.     return  Math.random()*(max-min)+min;
    % h( F: I/ v8 d% B, B5 T
  58. }
    ( ^- H! w; ^. D# i5 V
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    8 }9 j+ R: [# E  r0 w
  60.     // 获取列车从车库开出的距离2 A" f2 T7 p: d9 S+ r' y& I# r: X3 y
  61.     let railProgress = train.railProgress();
    # i; K8 A. w5 X$ [  ^5 u
  62.     // 获取当前轨道的索引
    4 Y5 y1 Q7 M1 j
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    & l, I& c1 [0 s6 P3 b% g7 \
  64.     // 检查当前轨道索引是否有效
    2 d7 C' w* f' _% S% X9 h7 _5 [
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ( m/ j0 J6 Z- G" |/ s- ?
  66.         // 获取当前路径数据对象# X1 P) D) k3 Y% _
  67.         let currentPathData = train.path().get(currentRailIndex);" d! K' M0 s3 U* x. q" n
  68.         // 获取当前轨道使用的自定义轨道名称
    ( E! o( c! l4 z( ^% E( _( r
  69.         let trackModelKey = currentPathData.rail.getModelKey();, d1 m1 R0 H% Q! V( r* F
  70.         return trackModelKey;
    $ A* _5 u' ?' }2 b" `
  71.     }
      b2 _( ~8 x0 F
  72.     return null; // 或者是一个默认值
    - g/ I& ?3 I1 y; n
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错, m/ ]( j7 b  M) F3 Y9 |
有事加我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:041 o3 n5 A9 B! t6 T! J
bve声音要方便一些吧,他有可视化可预览的编辑工具
, d: D5 z/ H+ Y5 z6 O8 H% {8 J; e
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
3 H2 J( i( k$ v7 Y
) x! A8 G- _- s5 v( C相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
7 n* V# F9 m6 W5 z' v2 e8 t
huliawsl 发表于 2024-5-17 21:123 d- x( R, G( p7 _% O
相较于此,我还是认为bve格式会更简单

" `. Z7 h$ i* L0 ~% b$ L9 o🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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