开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 1 P: }+ J8 K' g! F
6 N6 d1 ]! B( j5 {% Y' u
. K5 |1 J  b1 @( K" Y% B1 W
最近在研究JS 做了一个简单的逻辑来播放声音% U" y7 L) m' D  \/ X) L% F1 C
  1. var pit = 1;//初始化音高(速度)- e! o# a: U* j
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]8 ]6 T7 A# Y4 o! P
  3. function create(ctx, state, train) {
    . _" Q- S1 t6 Q. ?" N
  4.     state.number = new Array();8 h3 v% {; e, y6 O; b9 |  ^* k/ Q
  5.     state.soundsspeed = 0;//初始化速度1 ]* w- X- V" z- S9 k/ ^% r
  6.     state.speedsub = 0;
    5 G0 {1 ]$ a7 W. ]
  7.     for(let i = 0; i < 100; i++){
    3 B) e; z  ]! }  w! a" m
  8.         state.number[i]=0;//初始化数组
      K/ j3 J, S. e7 a( Q( a- W* t
  9.     }
    9 c& n7 M" k  n6 |
  10. }
    & R" L4 Q- V" V! x5 l7 K

  11. 2 F6 i7 v- g' q
  12. function render(ctx, state, train) {4 Q: G/ {/ l/ n8 J% j
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动# X5 G, s+ Z$ G8 L9 }" Z
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ( ]. b8 R0 n# R& `2 i7 e0 }
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    $ ?! I9 c7 f1 R4 q9 @* n; j
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    0 J' e1 o" Q6 b5 ~
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)1 L! S3 {3 }  |. D4 X
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    1 C2 b1 @: I, {
  19.         for (let i = 0; i < train.trainCars(); i++) {
    / i" x; H  v+ B6 l& P9 s0 ?& H/ p* c
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启3 ~2 O) I# M* e& i) ^! W+ S) S
  21.             if(state.speedsub<-1){//如果车辆减速
    ! g  o# r+ E7 W$ p8 J8 d5 P
  22.                 ctx.setDebugInfo("shache",1);//记录刹车3 {$ w! L  `8 v9 m7 _# X  F) h9 E
  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" v% n7 n6 i* }; \$ p0 v
  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) ~: q" h  X0 g
  25.             }else if(state.speedsub>1){//如果车辆加速
      g7 c; I5 ^- x) t6 W6 ^
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速( p1 X0 q7 l0 u2 {2 i; C
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    * ?* x3 v, g7 b* ?. w
  28.             }
      m" \& S- b$ s7 G* q
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    % T5 h, u1 D9 N+ U
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声. L; n7 j$ S4 \4 }8 g8 q8 q- g# i; q
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启/ @9 o9 {, Z! |8 a' q
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ; @% i' R- F& {! X
  33.             }/ R: \: S6 H5 A, X0 ]1 Q0 h+ Y0 [
  34.             if(train.speed()*20*3.6>5){& z9 N  U- q- h! ^# M
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    # p. B9 ~8 D5 `/ f0 C
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声4 d2 T; B9 d* y5 K' k
  37.             }
    * W7 q: p& E" S8 x! o
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){; ^4 n2 G: q4 F
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声  z4 j8 R. \) s2 u
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声3 H; a! Q) e' E  F3 F8 j( ]
  41.             }
    % g- g4 @' q" ^9 J+ o: ]
  42.         }
    6 N! s) c& P4 u4 ~
  43.     }  _1 D# y7 }3 n) N" T
  44.     state.soundsspeed = train.speed();//更新速度3 C) L# W( p- ~$ d$ m3 W9 }
  45.     for(let i=0;i<4;i++){
    - P' x8 W! ]$ \
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    2 }3 {$ c! f2 Z1 Q- D: Z/ j
  47.     }0 G5 f6 }3 a0 e7 l
  48. }
    5 X7 R  m, V/ W, V3 d% S% t
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ' C. t# e/ C- ]
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间) C: [" W  r8 I6 T: [1 m
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    4 X% i7 V3 ~! J$ y; J- U
  52.         nu = Timing.elapsed()+long;   //更新播放时间, c. ]3 n6 }% a, B. @9 z
  53.     }7 O3 l* x6 ~: J8 D8 h: y
  54.     return nu;//返回新的播放时间$ \% p, @9 F) \8 `& w, z" u" H3 {
  55. }( `: ^# D8 S1 x9 w; c" p
  56. function grnn(min, max) {//随机小数
    - s9 K( Z1 n5 [6 c$ s
  57.     return  Math.random()*(max-min)+min;5 ?  ^: G, \9 B/ P" k2 \( h
  58. }
    ( v) Y# h+ C8 j* r3 G: _
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的$ n9 j0 U  ~& l
  60.     // 获取列车从车库开出的距离
    / x. H! I4 I& P
  61.     let railProgress = train.railProgress();
    7 j5 d0 U' m4 m! e1 X' R
  62.     // 获取当前轨道的索引
    4 z5 D8 h' b* ~  s+ ~# J9 a
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);. o' P) z! e1 P, |# J/ v4 x" o
  64.     // 检查当前轨道索引是否有效: k, T5 V% h( ^7 e
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {, N' o7 U4 u4 t& v  T% f
  66.         // 获取当前路径数据对象3 W( e& s0 Y) P7 }
  67.         let currentPathData = train.path().get(currentRailIndex);
    9 A. w' h) ^9 l% M6 P
  68.         // 获取当前轨道使用的自定义轨道名称9 s1 |% r% }# Z
  69.         let trackModelKey = currentPathData.rail.getModelKey();5 s* o. Z; E* X5 p2 g2 q- U
  70.         return trackModelKey;
    4 {' f4 j* ]6 T( B5 b, V9 s
  71.     }
    0 S$ ~. a, M: E7 ?$ P; b$ |
  72.     return null; // 或者是一个默认值, M2 }' I8 N& d  d9 A* A
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ A0 y: W! r" q9 I+ n! `
有事加我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
" a0 x6 _( N2 R! x" Z- @" gbve声音要方便一些吧,他有可视化可预览的编辑工具
8 w( O) ?% T1 \+ i+ a$ y$ {. _1 O! r
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 , i7 g8 ]3 z: D5 `6 T, i

+ ~$ X! o( V* ^相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 , T$ Y  o8 X, o8 e0 {" b
huliawsl 发表于 2024-5-17 21:123 P2 U5 L7 r; _' D3 i
相较于此,我还是认为bve格式会更简单
' _' a: ?- T. |. ~$ s: \/ v7 e
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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