开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 & U4 R- |" [  u8 G. `, j* Y$ }
$ N3 ?) j/ \) I) _3 |! b3 P$ S1 s: K

; P- q2 b! @) \( e最近在研究JS 做了一个简单的逻辑来播放声音; R0 \9 S: ~0 }' d& h) e. _
  1. var pit = 1;//初始化音高(速度)3 @6 Z3 ]7 Z( t$ W4 F+ d1 e3 |& h
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]* d! j! F* g* |
  3. function create(ctx, state, train) {- D4 f& n6 P! i5 x7 A; p
  4.     state.number = new Array();
    : p3 l( Y- u" N; d2 v0 o$ a
  5.     state.soundsspeed = 0;//初始化速度
    1 [+ S! f) d" {! k7 j( \: I
  6.     state.speedsub = 0;5 J7 ?0 b  r+ T, y
  7.     for(let i = 0; i < 100; i++){
    & B/ Q- N% U5 }4 b
  8.         state.number[i]=0;//初始化数组
    * @3 ~2 H3 N8 A
  9.     }% ]4 n0 V/ Z) x+ V) K: H3 {
  10. }
    ! b9 d( b% W- {

  11. 3 O' U! ~( h9 j0 o$ [
  12. function render(ctx, state, train) {8 h: s# c3 z4 \) D
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动3 C, \5 Y. C$ {2 j$ \. M3 w
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' @- I' X! [7 V5 T2 ?& {; q* N
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    8 B/ H; @( E$ E5 D
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差' z/ d, }% c: |6 k
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)1 z( o' V  a8 `, d' \! G
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    : _; D" {$ l3 g
  19.         for (let i = 0; i < train.trainCars(); i++) {6 v# C8 C. G. J$ Z7 E2 Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启/ Z1 T: h: h2 s$ y( n; i! j
  21.             if(state.speedsub<-1){//如果车辆减速
    0 Z/ B( B6 `0 }& u- }8 {
  22.                 ctx.setDebugInfo("shache",1);//记录刹车6 b2 q8 X6 V1 ?
  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
    : y' q; R! l3 V' g5 w
  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& F4 |% U3 W1 o
  25.             }else if(state.speedsub>1){//如果车辆加速9 d' S! {. @  w8 u% r! `# x
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速: L6 Z* b3 X0 l; A1 @$ x+ J
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    # m7 y/ \% c1 b  a
  28.             }: x2 q8 k- h9 j5 c
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ; j" N/ }; E$ H7 y
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    & T; A5 j) i# v9 D
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    5 d7 U( f: ?/ X; K/ c! d* v
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    & _$ O/ g2 u' ^1 e& d1 c7 i( O
  33.             }
    3 p2 Q! N" B( t7 q# e
  34.             if(train.speed()*20*3.6>5){
    0 |3 j4 v* @* R: Y. v
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ' w1 D/ e. M1 }- O
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
      E' [" z; q/ ?
  37.             }
    ! Q0 }4 j, c1 j( y6 b5 R# R/ ?
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    # z* o  ]4 ~6 m7 p, O9 j' E
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声& u1 A- d' c$ \5 P6 |% d0 U; T* Q3 j
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声# m  ^, f/ u, t4 A2 i6 C
  41.             }
    % \) Z; c6 q! s5 l) ]& I$ v
  42.         }
    + R1 y3 l" g5 E7 {3 ^7 j+ _
  43.     }! Q8 `. D$ @; L) a  p
  44.     state.soundsspeed = train.speed();//更新速度
      M, d7 Y% P& z
  45.     for(let i=0;i<4;i++){
    ) F9 h6 y" t* Q  _
  46.         ctx.setDebugInfo(i+"=",state.number[i]);: r& n2 R( [1 _: T( q- t
  47.     }# y7 l9 X+ W4 g3 N) T
  48. }  Q* z' b1 y  G  O+ u
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间/ @  z1 @" q, l% X8 A5 O
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    0 M, U6 l3 @4 P" Y
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放9 C% `1 L( _* o; h% U1 L7 d# L4 [
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    : r3 d* p- l: h+ h( m$ p
  53.     }" G; y( `# u  {
  54.     return nu;//返回新的播放时间
    + ?5 R' ^8 e" m) [
  55. }
    / Q" j* i' O+ y& C) ]8 D
  56. function grnn(min, max) {//随机小数
    ( }( b" p* t4 B/ D; S& v( V4 Z
  57.     return  Math.random()*(max-min)+min;
    ; m, K8 m/ C; C; e; K2 j
  58. }
    ! D0 E5 T' O% G& T- K
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ; O( Q: u1 g& n. q) p
  60.     // 获取列车从车库开出的距离
    ; a7 b) l3 Y. k; V$ [
  61.     let railProgress = train.railProgress();1 v/ s% R  y5 P9 u% ^! O' _
  62.     // 获取当前轨道的索引
    9 L. [" T/ T" |6 V, ^' k  r
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    6 r$ r8 R/ i- }+ G+ l0 E
  64.     // 检查当前轨道索引是否有效
    $ e: Z' R3 E; p  K
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    4 V8 k; x# j. b& F; q, O
  66.         // 获取当前路径数据对象1 j$ b' a8 [  P* n0 Q
  67.         let currentPathData = train.path().get(currentRailIndex);6 \# N( ]0 ]5 T/ e8 K% m8 b- Q
  68.         // 获取当前轨道使用的自定义轨道名称# q3 u3 \# }. I) U0 _- `5 C$ S
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    ! ]  B1 Y. M, A1 w$ m/ e$ ?9 e
  70.         return trackModelKey;2 s- X5 p% R$ g; |
  71.     }8 \% w: C* F* ?% U# X
  72.     return null; // 或者是一个默认值+ B8 r1 A& _  l; r* y& C1 ~
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
1 L3 W6 C2 S. _3 u. ~& 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
$ N8 L) W4 h% b* xbve声音要方便一些吧,他有可视化可预览的编辑工具
" I# c0 l* H: p) j6 l
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
$ P. j* P  |0 R+ l7 I9 _: T& n1 D( k/ R( ^
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
# G/ u' [& ~% ?# i. p
huliawsl 发表于 2024-5-17 21:12
3 Y" e. }) ~8 @3 J6 v# R相较于此,我还是认为bve格式会更简单

- N- G6 L. R" S# U🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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