开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
9 H6 S1 l0 b  z  a# s) ~- \, B2 U2 }1 g. J6 r
. K& f6 b9 f+ v6 h
最近在研究JS 做了一个简单的逻辑来播放声音( `: o6 `9 s( m4 b$ m  q
  1. var pit = 1;//初始化音高(速度)$ e: U) J+ }6 s; ]" X/ a, n& x
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]4 h5 e, I2 d: p' g& e
  3. function create(ctx, state, train) {. n3 S: ]* m0 K5 l5 p9 x
  4.     state.number = new Array();! _& |, B7 [; X; I1 y4 W0 f! O
  5.     state.soundsspeed = 0;//初始化速度8 N2 J0 O! [  v! N( O5 P+ {
  6.     state.speedsub = 0;
    & P% I/ m/ |6 W% E' {% w# w
  7.     for(let i = 0; i < 100; i++){
    5 ]- ~6 m  E* `* j( h
  8.         state.number[i]=0;//初始化数组0 a9 {5 D9 O/ `3 h+ b2 E( |
  9.     }
    + Y1 m' P9 v8 [& I& b
  10. }1 ^5 D! H. I. `7 a3 z8 o
  11. 7 S6 _+ [1 E3 K3 J+ {# ~1 C
  12. function render(ctx, state, train) {/ t0 x+ r8 Y; W& g" A( h2 B: Q' @* Y& Y
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    $ |  _% }  T: [' ~
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    - v  B7 d" Y' Z' S
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    5 D: [1 g# ]$ D0 u' v( W1 C
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差4 c* o. x8 z4 t' V& r' b% z4 k( ~
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    8 Y; w$ M' T( s$ s) Z
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作8 }9 w/ l7 k4 q- M
  19.         for (let i = 0; i < train.trainCars(); i++) {
    2 h) v6 W' Q9 j$ U1 {4 E
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启7 b" ~: i4 R- G0 r
  21.             if(state.speedsub<-1){//如果车辆减速/ y; E5 u* ]2 q7 \: G; ~  o( N
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    + s0 A- K( z) B6 r7 \
  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);//更新返回时间 播放刹车声在转向架13 v2 O4 w6 n7 N, w  y" }" t
  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, ^3 j2 p; S8 q; t$ g; Z
  25.             }else if(state.speedsub>1){//如果车辆加速
    5 ?! D/ y( A9 v' B0 o% L$ ^
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    ! v8 y5 K& Z! _3 q
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声9 e) C1 ?$ M; u+ K' v
  28.             }1 ^, u) Y9 j: H( m0 M
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    4 W3 S1 R0 l, G/ @
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声8 v; ?4 h. b- L# _3 [
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启+ h! d# R8 W# k* ^: \" Y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右1 L; D5 f- m# e8 u7 m
  33.             }: Q; a* Y4 W; K8 d
  34.             if(train.speed()*20*3.6>5){$ P! K% x" R5 p: O3 |
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    3 P. d' p" F8 o9 h! ]1 ?  t5 J
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    % t3 d. D% E# d2 _$ U
  37.             }7 \' C/ r6 m- z
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){% S* j- h5 i& y& A
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声5 H7 o0 {3 P! e4 |# A" W8 t
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声2 u1 z; e; P/ G3 O4 t
  41.             }
    4 D' F! ~1 u  U9 N% t" K
  42.         }' b8 \# V) m7 S! x
  43.     }
    : d; T2 V2 z/ W: w% |' \" |: \
  44.     state.soundsspeed = train.speed();//更新速度/ P* a$ |  m. M/ v5 ]
  45.     for(let i=0;i<4;i++){* P6 H( Y0 t  [
  46.         ctx.setDebugInfo(i+"=",state.number[i]);4 ?: V) f# Z$ z! h4 @6 A
  47.     }$ i% \* c, j+ V: T- {% q
  48. }
    5 b8 L% u+ I4 c# G! D8 V3 L. p$ l
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间# T  T! ]% o. h1 `' P* p
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    " m7 W5 ~) c, l. u* i- l  S
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放0 M, a) {) [5 `% r3 C/ c
  52.         nu = Timing.elapsed()+long;   //更新播放时间' {1 l9 r/ o6 L1 E% C6 ?
  53.     }
    # V& `" l' p# _7 D9 l3 ?
  54.     return nu;//返回新的播放时间- E6 t& d6 ~/ Q$ C! r, t6 R
  55. }$ Q; l. M) R' e8 r& r! M  l
  56. function grnn(min, max) {//随机小数' i7 ?0 f; w% h7 I- a5 l, b+ M9 B
  57.     return  Math.random()*(max-min)+min;
    . H$ G, {+ ]2 E" |- t
  58. }
    8 v7 K8 r( g* y
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的! Z# }9 K( }& i: `
  60.     // 获取列车从车库开出的距离% V0 v8 @6 J3 A8 }+ Y
  61.     let railProgress = train.railProgress();  p9 ]2 o1 M9 k3 l6 f9 K
  62.     // 获取当前轨道的索引
    2 U7 h5 p0 j# ^) {4 O/ G* [7 e8 r
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);0 }  U# v0 h! p: C  v# d0 X$ V- ?$ u
  64.     // 检查当前轨道索引是否有效
    9 X4 {$ w  }, a6 G
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    % R! U5 [4 H3 R# Z; I% I6 p
  66.         // 获取当前路径数据对象
    4 F9 k8 b/ Y; E! ~, f# I
  67.         let currentPathData = train.path().get(currentRailIndex);. H/ u4 ]7 Q& I' Q# S" p$ R
  68.         // 获取当前轨道使用的自定义轨道名称" ~, l; i: ~9 d/ o3 y9 b
  69.         let trackModelKey = currentPathData.rail.getModelKey();5 s, F4 d& ?0 V8 v* [  v3 P9 v
  70.         return trackModelKey;
    - j6 u6 ^/ D4 A' }+ k) I4 i
  71.     }
      ]' a/ z. p: g7 U" x6 P
  72.     return null; // 或者是一个默认值
    4 y7 v  _$ A! L9 e% g+ P
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
! P% ~9 F! i0 Y2 l4 c4 u& T
有事加我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
/ k+ J& m" J# `: nbve声音要方便一些吧,他有可视化可预览的编辑工具
3 Z! Z( K+ Z% _) b( a8 O
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ; L0 G, z+ S8 T& q0 b8 o
# l* [6 M! x! A- [
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 - U* v7 n8 _3 d1 A; Q
huliawsl 发表于 2024-5-17 21:12
9 @: u  E/ f* W8 T2 Z4 e' T. h- P9 V相较于此,我还是认为bve格式会更简单

7 h* z' x3 Q- b7 |🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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