开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
- ~# x" z5 v7 I; [2 J
- r. g& Q' g' @4 [( X( V# @0 l9 s* X# K3 B6 u) _
最近在研究JS 做了一个简单的逻辑来播放声音
9 A* d1 K0 y$ v" K$ k
  1. var pit = 1;//初始化音高(速度)
    / L2 ^1 c$ C( K& j1 l  x6 b  |
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ! o) h1 y7 _9 j& Y
  3. function create(ctx, state, train) {7 C5 m; V: l( r# y7 F1 Z, |# _
  4.     state.number = new Array();
    1 M  {1 @# d7 [
  5.     state.soundsspeed = 0;//初始化速度
    3 Y$ W# v2 H+ ]
  6.     state.speedsub = 0;1 _, @' E5 p6 A5 e
  7.     for(let i = 0; i < 100; i++){8 Y) {1 W+ F* e3 h
  8.         state.number[i]=0;//初始化数组
    8 [' b+ h! n) W6 P/ N
  9.     }
    & |( H, g) [5 S( U7 j# F; I
  10. }
    0 {  V3 h; B% S% T% S' S$ [
  11. $ F& H) [, H8 h9 s. f7 \7 A
  12. function render(ctx, state, train) {1 }# e9 W! V# o; T/ E
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    # `0 c: O" ?- n) y0 U
  14.     pit = 1 + train.speed() / 40;//更新音高(速度). U5 ]* Z% ~& C6 S
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    4 T0 F) W+ W( O. ^8 P* c$ ^' F- `0 o
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    5 S/ Y" j/ U  n8 m, S/ G" u: E8 W
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)# ~0 U. @/ M5 K- E/ ~0 G
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ) @8 {* ]/ J( Q3 x# N
  19.         for (let i = 0; i < train.trainCars(); i++) {" s9 b" |" {. M
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    : C- q' u7 J- z( v& W
  21.             if(state.speedsub<-1){//如果车辆减速
    4 \7 e# Q4 z8 _5 F5 t; G2 N; H" K
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    8 b1 n/ P* o+ N: {* v1 R% O' x% i3 |
  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
    . P$ N5 I- u4 h' M
  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
    - i( d# d' J. o- A4 _& j
  25.             }else if(state.speedsub>1){//如果车辆加速
    ; C, T$ r$ u3 G7 U$ I
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速" p  P$ S- a/ L7 X! Y7 Z9 l) d
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声! a' L8 z; Q2 z9 M7 m! \7 E. h
  28.             }
    0 _+ x+ x7 _- s' C9 N* @
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    6 U  U% \/ U1 x# b1 I6 C& z" |
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声, y3 T( d/ ]0 ]8 _
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ( ~- K- V  m  A4 v; E/ l2 l
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    : |8 c" C: L2 b7 s# C
  33.             }) X1 G3 I- k5 \: p8 z+ Q) o
  34.             if(train.speed()*20*3.6>5){  L1 @. Q1 I9 L8 H
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    1 V* s4 [7 ]' ?5 i: j
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声) a' W/ K6 `# c. h
  37.             }
    % P0 L: ]- ?* x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){+ Q7 u: M' B  f4 u3 u: v/ [
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    1 f; L9 [! B& r: y
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声+ c* {/ D6 V8 P
  41.             }: T8 P0 x. h8 H! N1 L* G! T" W
  42.         }
    * v5 v; R/ x$ d  _$ F5 B
  43.     }5 R8 E# U- y( b4 A7 u
  44.     state.soundsspeed = train.speed();//更新速度( ^$ f) Z! a% A2 b: w
  45.     for(let i=0;i<4;i++){
    - R9 F3 p: W3 D8 B4 n# Z
  46.         ctx.setDebugInfo(i+"=",state.number[i]);& z! c5 X$ O6 ^. u5 x' K, Y7 N2 s
  47.     }8 O0 I* m$ g) A6 z: t' h' S( e
  48. }/ j& d! q* r5 F& p
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    & J4 T1 }8 y) G' K2 A
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    2 l, `, E& M/ S5 @5 d' F
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    4 u' t. R8 N+ {: |7 x1 e: t1 S1 K
  52.         nu = Timing.elapsed()+long;   //更新播放时间- B% _/ K" K; s" q' \
  53.     }# S8 B1 e9 ^3 ~4 Y; x
  54.     return nu;//返回新的播放时间
    4 O' s) t0 Q# _, O  ]& D, U
  55. }
    0 e7 c9 X4 u8 N5 }
  56. function grnn(min, max) {//随机小数
    . L3 c4 v; i- \8 L
  57.     return  Math.random()*(max-min)+min;
    ( Q3 E" q' x* g) F3 B% ^
  58. }
    % x0 ?* p7 L/ c: q  i4 x
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ; }5 }. j1 a( H9 f* ^
  60.     // 获取列车从车库开出的距离
    / _2 b# l) w$ G& Z
  61.     let railProgress = train.railProgress();0 \. J3 n3 P' O, x& ]' R* ?6 ^
  62.     // 获取当前轨道的索引7 R1 a# T: V! J" A% T% q4 n
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
      a; ^+ I1 z* T' d" a0 ?2 M
  64.     // 检查当前轨道索引是否有效1 p9 g6 K$ A" k9 a; [# N. r
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    & @5 ^4 h  [1 G/ I
  66.         // 获取当前路径数据对象# x  i% f+ O% k
  67.         let currentPathData = train.path().get(currentRailIndex);
    1 K. B' j* C) f
  68.         // 获取当前轨道使用的自定义轨道名称
    ( g. I. K- p, u- q$ [) u2 y
  69.         let trackModelKey = currentPathData.rail.getModelKey();5 \) V$ a, d0 t- i% {: i3 Q- G
  70.         return trackModelKey;% k9 M: T1 B! L+ L+ e' `5 y
  71.     }
    ' x# |" u3 v2 {9 h0 B+ ?+ M5 H
  72.     return null; // 或者是一个默认值/ [: ~7 U6 j' G* Z
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错& P8 x# u4 i+ H: b" f+ `6 Y
有事加我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
( Y. c) |3 c/ m9 ubve声音要方便一些吧,他有可视化可预览的编辑工具
, W: @' X* T3 ]. b
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 % N2 C+ }; L( U) p4 e7 l
$ ^2 K; {* j$ g
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ( ]1 C. M, _. U4 ?$ D# R+ i7 P
huliawsl 发表于 2024-5-17 21:12* A9 W8 s) Q4 b, E; f' O4 V" Z
相较于此,我还是认为bve格式会更简单
. G) [* G( J3 L' H/ h
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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