开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
0 [* O6 T+ f9 t9 j6 a0 N2 R* C7 r1 R( L' m( \5 M8 ]6 P

3 v" a, `& l9 w( E最近在研究JS 做了一个简单的逻辑来播放声音
% a; v& F+ q9 j, o
  1. var pit = 1;//初始化音高(速度)3 x' H* c% I; T5 [
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]8 }+ N  F5 E% M! n
  3. function create(ctx, state, train) {$ D0 S* z* k3 s$ k4 p  m) s# b
  4.     state.number = new Array();
    ' I! \# Q! s5 ?4 v& W" d
  5.     state.soundsspeed = 0;//初始化速度& O9 T. ~& g, |3 s; s
  6.     state.speedsub = 0;; V/ P' v& @4 t+ [
  7.     for(let i = 0; i < 100; i++){
    9 h3 I) _5 C1 Y" L
  8.         state.number[i]=0;//初始化数组
    # S% d" b5 d0 ?8 L5 \
  9.     }
    8 \" Z4 z1 h6 F: m8 ~+ _/ i
  10. }% W& i1 j6 s: h" z! ]0 U" ^1 ~
  11. 3 v6 k9 J% s  N; ^0 P
  12. function render(ctx, state, train) {
    7 K8 U3 E2 H4 [2 a5 E
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动' D% Q$ ~5 p1 f* f+ i
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ) Q: J/ Z" O' h$ D' e
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    , v; l) e! E- t0 O* L8 q9 C
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差* ^7 l3 x1 I6 g- N( S' d
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    1 T+ j1 p( E2 u& b4 E. o
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    8 h) A! K9 x5 k3 ?  E8 F( {
  19.         for (let i = 0; i < train.trainCars(); i++) {
    * P' q3 A$ N4 p9 K+ P
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启+ Z/ U3 y+ w0 T
  21.             if(state.speedsub<-1){//如果车辆减速/ K- J$ ~- F" `# ~" t. L! y) |
  22.                 ctx.setDebugInfo("shache",1);//记录刹车$ ^" W& H3 E( o/ |2 g" o- u6 u
  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
    6 h, R+ |2 w+ e% Z$ B% {4 U
  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
    ; T9 l  L$ t+ N
  25.             }else if(state.speedsub>1){//如果车辆加速
    $ o: n# t) F  g2 P) N! D
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
      `) A* ~) u7 _" D4 x$ K/ w
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ i8 R% J# @+ ~1 ^  {
  28.             }1 \% K4 W+ N; a$ |- T( e2 F
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ) o% a1 s) e+ k# X0 s
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声3 m$ l$ w# S/ i  `9 K. [; {6 s% n, E
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启) Q+ ~, S0 y' x' A; B" C$ @
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    : y3 Z& c8 D1 B5 M) B* b
  33.             }
    ; Y" c! w8 J) {2 o) Y( }
  34.             if(train.speed()*20*3.6>5){' d) d. S& k9 F
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
      u) g' j+ N  J  H0 v+ K
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声! A' `' Z' F0 b# }  w
  37.             }
    ) W& R  [9 S( C  E+ a
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
      h7 \# u' n, m
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    5 s3 }. @, l; M: P. w( K1 Y; K
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    $ C; t4 I8 H: l5 Q$ B
  41.             }
    9 B/ O& {( @3 q, m6 X
  42.         }+ k- m  c+ `# {* S9 Y3 V
  43.     }8 {. ~5 {) _, V2 p7 B1 t" T2 p
  44.     state.soundsspeed = train.speed();//更新速度
    7 D" N4 F( {2 n7 A- z
  45.     for(let i=0;i<4;i++){
    & O# O& o- q+ y! M0 {. g  n! d
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    # ^2 N5 V& I0 y7 w1 A5 W0 L& [# g
  47.     }
    / T/ ~. ?  X) f3 ~6 E7 Z) e6 H
  48. }
    ( O9 s' g4 M, o) \, |
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间+ I+ S/ ]! D5 p, G
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    $ x/ }/ V* y/ s! ?7 V" y* _7 V% O5 D
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    9 h! W, _3 u# n6 _) ]
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    & [& k3 ~! r  L0 a/ i( x- N. C2 [
  53.     }( ^6 `' R: P0 a  X* c1 Q0 K+ G  B' K
  54.     return nu;//返回新的播放时间! I9 j4 J2 Q) q9 t! F& [
  55. }
    + V' [  r  e4 I$ [# P8 P4 q
  56. function grnn(min, max) {//随机小数2 w2 k' H8 u0 \- t/ }
  57.     return  Math.random()*(max-min)+min;
    1 ^3 H5 ?0 S3 `, c/ [( B$ Y& @' o
  58. }- k8 u6 m6 T: z; k5 e
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的" z/ H4 {5 L8 }7 A$ q# c
  60.     // 获取列车从车库开出的距离0 A- a3 T0 l3 X5 W3 R8 M" i& g4 i
  61.     let railProgress = train.railProgress();
    ; k. O7 r' Q) n) {0 G
  62.     // 获取当前轨道的索引) [4 V! P1 ]4 z3 `
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);: C# u) e0 A& B0 R- F8 @4 X
  64.     // 检查当前轨道索引是否有效" W' u  F/ _9 d# z  B
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {6 R. z' ?# `2 s6 a
  66.         // 获取当前路径数据对象
    6 P  B- }$ u7 |1 I! F' o
  67.         let currentPathData = train.path().get(currentRailIndex);' ]5 h1 k1 Q, c9 i
  68.         // 获取当前轨道使用的自定义轨道名称
    $ A9 F- a' W" j& {" {
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    3 f$ o# ^. s, Q/ h0 S! a" P; U
  70.         return trackModelKey;4 g# d  B1 j8 {# e9 x1 k
  71.     }
    , z0 z  S5 r9 n" y
  72.     return null; // 或者是一个默认值
    . Z3 U  \( h/ G7 w7 q' p, m
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
2 ~+ B( L- q4 {- i9 \
有事加我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
) S2 M! I' W6 R0 o% [  jbve声音要方便一些吧,他有可视化可预览的编辑工具

9 F; N1 [  Q0 Q  F嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
. i' c& F# T6 ]6 I1 ^/ B6 n( ~) o' Y% n* b& P2 o  u2 Z
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 2 T4 _8 d1 J5 h" O+ N5 o
huliawsl 发表于 2024-5-17 21:12
+ c- t2 u& o" m0 Y) Z8 k4 D相较于此,我还是认为bve格式会更简单

7 _& A& j! [" u2 k5 F3 |+ V1 m; a🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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