开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 6 U3 _. e, u4 d1 u4 ^
, ^4 h6 s. }) R9 ?! ], R
/ u$ U( S. b$ Z4 ^
最近在研究JS 做了一个简单的逻辑来播放声音
: `# J5 c  G4 w. f$ O/ j
  1. var pit = 1;//初始化音高(速度)
    - A7 ]  {+ Z; u0 l3 {- @6 g7 ?
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]+ ?( H& I; r& P* `" P# f" O
  3. function create(ctx, state, train) {0 J' v! s  z" x6 y# l( [
  4.     state.number = new Array();
      D; U4 k, H8 ^
  5.     state.soundsspeed = 0;//初始化速度& a/ {% i) {* Q
  6.     state.speedsub = 0;
    + r) Y% M" ~& b8 e, i
  7.     for(let i = 0; i < 100; i++){1 n9 i) _$ T% N3 A2 z0 M
  8.         state.number[i]=0;//初始化数组
    6 ?, L/ W( K. v/ c2 T, z- q
  9.     }; p( O* A  O: S
  10. }% X% |. x# b0 |
  11. ( Y) f' X; B, ^% t" I
  12. function render(ctx, state, train) {
    ( @! Y8 Z3 V  ?/ K9 I$ d% L
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    3 _0 r0 A! n+ \0 \, A/ a0 i5 I
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)0 x; X) E) ~: r' B
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    1 i, {3 d5 n0 R. ]' l: A
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    " |- F9 T+ ~! L3 }4 ?! P
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    2 H6 i+ Y0 e7 V9 f; t
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
      o( `' \/ w, }
  19.         for (let i = 0; i < train.trainCars(); i++) {
    . {' i" |; I! ?8 ?0 H# M* ?$ j
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启: X5 }. S5 @( _
  21.             if(state.speedsub<-1){//如果车辆减速* K; O, i5 r6 \) s
  22.                 ctx.setDebugInfo("shache",1);//记录刹车: F" r$ i7 z7 S9 P0 V( |, H
  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
    ) c& a5 \! [4 T9 C
  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( J; ^+ A' ~4 O( H
  25.             }else if(state.speedsub>1){//如果车辆加速2 e8 o* `+ m" u4 |6 W; Q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    * d7 ^! t8 ~, p# w
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声4 w8 {2 o) [  t, M* |/ e: ]
  28.             }/ k7 k% E- T  B- L: [9 ?9 g, X
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声' W  J6 T! l# x
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声1 r" u6 X3 v! u8 I# Y
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启5 c4 v; v7 X  r; O% ~5 I: m) y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    . w; s: e2 E4 A8 _* B& C$ W
  33.             }
    * J- B; _1 ~5 T: K
  34.             if(train.speed()*20*3.6>5){
    / t2 ^( J+ Q5 |& s$ M& y; e0 q2 l) _
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    5 ]" A+ i/ p/ u) F* K0 [6 c" M
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声$ [  X6 g% F& U% ?2 h
  37.             }
    + e. t& w. I/ L$ o2 M' `9 e
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    4 ?4 N: [: P9 O
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    + k4 W5 |( W1 B
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    , U. B2 m$ p. K
  41.             }% S0 i% G7 U: ~* k0 q  j
  42.         }
    ; q- ]+ x0 W" j4 R8 t9 R' ?3 J& R
  43.     }' p6 d  m- i9 Z( k( O2 |
  44.     state.soundsspeed = train.speed();//更新速度
    & P/ R# q4 h/ `# k: ~9 o" x/ a
  45.     for(let i=0;i<4;i++){
    % Z3 t7 W* g1 U$ t2 Q& O
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ' z, x2 h- T& {$ o6 @1 R
  47.     }. f& |; [$ d3 E0 y
  48. }
    - f# R" e, L  g0 ~8 [, l$ F
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    * Y* ~& g* ?2 S: [% W# ?
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    & y* i0 X" `9 Q/ r3 P  u
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放- l1 K& I+ F. V
  52.         nu = Timing.elapsed()+long;   //更新播放时间: s+ f$ v- j) t( h
  53.     }4 J" y  ~: }* H
  54.     return nu;//返回新的播放时间, ]( u0 h) \5 Z5 m2 W. _) ~
  55. }: K4 H* T) O) G& q. `0 ?
  56. function grnn(min, max) {//随机小数; C( E% U: K1 Y1 m, k5 Z' a
  57.     return  Math.random()*(max-min)+min;
    3 w$ \& g  @- j8 `) \* h- O
  58. }
    7 ]4 }9 U% W7 e+ T% v9 l
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    3 Q( K7 u' p' B  }
  60.     // 获取列车从车库开出的距离+ D, D2 s9 {+ I3 w" A" {
  61.     let railProgress = train.railProgress();, y( p6 v5 m# E' ~6 p2 H( O0 Y
  62.     // 获取当前轨道的索引# h1 [6 a! y; B6 _% p" {2 O
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 ?; n& M7 W  @3 D
  64.     // 检查当前轨道索引是否有效! }8 ]# W0 g$ n! M5 r1 R) E
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    0 R4 b. r9 l# x- l; s0 U' v
  66.         // 获取当前路径数据对象5 s) {9 C+ l4 D4 P
  67.         let currentPathData = train.path().get(currentRailIndex);: F0 Q: ?0 G2 Q' \4 w; U% q$ h  g
  68.         // 获取当前轨道使用的自定义轨道名称
    ! ]; [* D" m) Z2 V& s
  69.         let trackModelKey = currentPathData.rail.getModelKey();! `' X- o0 w0 P1 e2 U
  70.         return trackModelKey;) {+ f' X1 k  M9 @. l/ g) w
  71.     }
    - C- ^9 k! ?1 z/ d% p
  72.     return null; // 或者是一个默认值9 ~/ P0 |5 O: }, Z
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
. ]: O9 z6 v# t1 i# k* K
有事加我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
' ^  e& [4 P1 Q* O4 Lbve声音要方便一些吧,他有可视化可预览的编辑工具
! m0 W- j# B# u
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
! m4 `: f9 H8 z3 y# l/ V- W! }( P6 k8 T
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
, B0 t9 D  k& N! t7 q
huliawsl 发表于 2024-5-17 21:12' I- I# h5 N  N0 E* D. L) i5 A
相较于此,我还是认为bve格式会更简单
# [" D7 Y0 a) A$ A$ h
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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