开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 z- \9 P2 u; l2 Q- E( H1 j3 L  C# E- i
6 _+ _: [' X( o! G2 o
最近在研究JS 做了一个简单的逻辑来播放声音
: S+ m0 y. i! K: _" H% j/ ^
  1. var pit = 1;//初始化音高(速度)
      \7 @9 y# Z  c1 |2 B
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    , j8 O0 U* x* y
  3. function create(ctx, state, train) {
    : G  G$ X9 [: |8 U5 l
  4.     state.number = new Array();
    , V/ S! N0 t! d3 C
  5.     state.soundsspeed = 0;//初始化速度" e& Y# ]0 K  h, A
  6.     state.speedsub = 0;+ Q- C, d  s5 \( L. U3 Q8 f
  7.     for(let i = 0; i < 100; i++){) d5 C1 ]1 K2 v. {7 d
  8.         state.number[i]=0;//初始化数组1 b" S9 e, H5 B- u
  9.     }9 R, Q: j/ S0 X9 _7 v- I( ^
  10. }1 }. d1 Z: J: q% Z

  11. 3 {% t  Q' A+ j: o$ y% N% H
  12. function render(ctx, state, train) {
    & i3 K9 @" S3 ]) J" e6 D6 r
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动; Y3 C2 \/ X! F$ U
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)/ v$ X: X/ ?% V% k. E( [# `
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
      z: m2 A; i& A1 ]) s8 {
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差1 C7 d( k' P. }
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)& Y' x% W6 l$ I
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作+ d* i  S3 ^3 g0 q% x8 Q' V
  19.         for (let i = 0; i < train.trainCars(); i++) {
    $ p% ~* H1 @1 s, L- D
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启7 W. E) A  t$ p5 z. u- n
  21.             if(state.speedsub<-1){//如果车辆减速# {8 G: N( n8 g# ~* ~
  22.                 ctx.setDebugInfo("shache",1);//记录刹车' E0 K' y* g5 x/ F* \) A# N, E4 n  l8 I
  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) h3 P  Q* O( N
  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
    ' d2 E8 J. Q, Q( B: J  z$ c& e3 M
  25.             }else if(state.speedsub>1){//如果车辆加速
    ; o0 \) T7 u/ A* c6 q, m
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速3 I9 A' V/ `; l; I+ i" E
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
      \5 A! z, U5 n/ e! c& U6 d% W
  28.             }
    9 p# O! M- U/ [; q
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    & B0 ^4 X% P$ r. X1 t9 {  S5 Q
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声/ W2 c7 c3 N" ]" u1 m
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ; N- p4 I3 s! e; q: r
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右+ H% u( _* d+ N
  33.             }$ G' w* m  j4 f
  34.             if(train.speed()*20*3.6>5){& w- P# i1 i# X# U1 U2 |3 S
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    & f! R3 |% y9 W& l* H
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声5 a$ O. i/ v9 ~. U/ [* b
  37.             }; w* ]" N* ?5 C* z
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){( g* h" p( {$ W9 ?/ c- @* a
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    % _  h5 E9 u  m. F1 z, @
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声6 j% B& s' L+ _* k4 z8 q
  41.             }# z- ^% Y% V. o% _+ }7 m7 A
  42.         }
    , F0 `$ _% s/ ^7 y/ p
  43.     }
    + q5 S9 e' f1 T! z1 c0 B
  44.     state.soundsspeed = train.speed();//更新速度7 j/ s0 f1 _5 z1 o& Q
  45.     for(let i=0;i<4;i++){
    : b4 X& i4 z* h
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    7 m5 c* ?: G* T# v) p
  47.     }
    " g8 Z" D6 B9 q+ e( e
  48. }+ F( N9 M8 Z" y( C3 V, s* M
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间0 z: |9 u! o+ Q2 E
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 G$ c4 k$ y% V7 A3 J
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放3 A3 H! s6 q9 C% Q. }7 @7 {2 e  L
  52.         nu = Timing.elapsed()+long;   //更新播放时间+ a# j3 I9 a/ U! n
  53.     }
      Z7 J4 D% e9 q% \# R0 S
  54.     return nu;//返回新的播放时间" g4 h7 \: B3 T4 K, I
  55. }7 b% e! _$ I5 V1 ?" p- {: w- R
  56. function grnn(min, max) {//随机小数$ Y/ _- }6 h+ ^6 S# n# |- c/ R
  57.     return  Math.random()*(max-min)+min;% n) S1 I- D+ s* n" K* d3 ~1 S: s
  58. }
    , h5 [! s0 S( Y. x5 [# [
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    + m0 _: C$ e+ A. ]
  60.     // 获取列车从车库开出的距离
    0 {2 T% T4 r- X4 q( v
  61.     let railProgress = train.railProgress();: ^4 Z. G! L* Z+ t& S3 {# a
  62.     // 获取当前轨道的索引6 N. `5 Z  }' ]5 G; c# j
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);7 i: a$ p+ m$ ]& ~5 W; F) G5 u
  64.     // 检查当前轨道索引是否有效
    & G- S- P9 E8 ?2 B- \  ]5 J9 U
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {$ o0 |& w% j) x! y( @
  66.         // 获取当前路径数据对象+ Z1 f1 c6 S# D) S0 ?- ?
  67.         let currentPathData = train.path().get(currentRailIndex);
    $ z) [- P* P, |! t  P3 X$ o
  68.         // 获取当前轨道使用的自定义轨道名称/ V) T/ G8 Y0 ^& \# s2 y$ ^
  69.         let trackModelKey = currentPathData.rail.getModelKey();+ F4 i2 h! G5 j# j+ f. r
  70.         return trackModelKey;7 j& Y8 E% }0 }1 m% `# j) i* L
  71.     }6 F- h7 w& H7 i9 ~% x8 H! n
  72.     return null; // 或者是一个默认值2 O: ?/ M9 R% x2 q
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错- z9 v0 o& T/ s4 P
有事加我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+ G  e' i+ k! T4 d, g
bve声音要方便一些吧,他有可视化可预览的编辑工具
0 N$ f8 v/ n+ H" }
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 " N- K. ~6 f# }5 P
3 Q6 t* ^  H9 ^1 A* R: M
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
5 h4 [5 N" l: d4 @
huliawsl 发表于 2024-5-17 21:12
- D  \$ w! D. W+ p" h相较于此,我还是认为bve格式会更简单

7 v& y9 h( |" M- j; r3 U2 I& S🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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