开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 : W% j% d! B+ z2 i' q

+ ~' h: i$ t$ x2 m6 r2 ^
7 m# e+ A7 y/ e" s2 X最近在研究JS 做了一个简单的逻辑来播放声音9 B0 J9 c9 L$ [5 M* ]4 t/ N
  1. var pit = 1;//初始化音高(速度)
    9 m# c& \) X. g- |
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]- j$ Z# `( F3 b# d. S' i. X
  3. function create(ctx, state, train) {. T& v( d7 |* r6 t, x
  4.     state.number = new Array();  c; c# t1 h' r
  5.     state.soundsspeed = 0;//初始化速度
    ' N: T  ]0 z! f6 h$ K
  6.     state.speedsub = 0;; i& B  z  [1 p" O2 k2 y3 f5 h
  7.     for(let i = 0; i < 100; i++){
    / h5 B" W. w/ w2 s5 a6 |: k& z
  8.         state.number[i]=0;//初始化数组
    0 ?8 z- U) {7 d4 |
  9.     }" g; v' h- z  a7 R0 g$ g* P( k/ n
  10. }. M7 z) i0 ], s, q/ b$ l4 D* L
  11. : Y9 ^" t% H% X4 u0 I
  12. function render(ctx, state, train) {
    * V! [. x$ Y/ I$ b+ o) N
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动- E  n8 ^) x3 c% \3 l; p- H1 `" h7 A
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)7 Q& z2 \0 G) C
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    % S% m/ {! v. O. k; X  ~
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差5 @- F% y! m! i: o- ]
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)2 O3 N( Z; u5 ~/ _7 @  X  v7 t) C
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作1 t- X: `" z+ d+ }) z; E2 }$ ]
  19.         for (let i = 0; i < train.trainCars(); i++) {' b( `; k3 X$ D; c1 v. j
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! n( b: n% [/ g! O, r- j$ w
  21.             if(state.speedsub<-1){//如果车辆减速. `! `8 I8 \# h2 d* e
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : |& s6 K7 s- S* p- v! c
  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
    . F4 V9 g" Z0 p+ h5 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; i0 h/ z; w+ M/ x& J
  25.             }else if(state.speedsub>1){//如果车辆加速
    ' H& E' o' _$ e1 m$ y3 t
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速5 E8 z# _% ~: ^$ S
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声" S  ^9 [) O# i4 X, s7 R7 v
  28.             }
    & _- y) h  F; ^8 M' m! v
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    2 x6 R% l2 ~4 P5 X. M5 T: e( b
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ) _) M+ A; J6 R/ l0 F
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启$ j  h# }7 T4 p5 N
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    . }) H, q6 r& f
  33.             }
    ) v  V& r8 ^6 |" f
  34.             if(train.speed()*20*3.6>5){
    . P* u, M2 k  s) O3 l9 {
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声$ W9 L4 U1 r! m) r6 O- k
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    6 \5 z) J5 W( c1 J% o3 `$ K
  37.             }' L9 P0 \2 Q7 G7 d' q$ `
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){/ _7 [: V! E, k: z- Z  y
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声$ p! [: C" Q6 t2 u# _: `
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    + j  H" f3 f1 Y8 x
  41.             }3 P/ E6 Q0 o! p1 h4 N( f5 ?
  42.         }% e9 p7 h. V1 o7 z2 P: K
  43.     }
    / k9 m# ~3 P! J5 o+ h1 p7 |$ I
  44.     state.soundsspeed = train.speed();//更新速度
    8 F9 J" x+ N  C' F2 a
  45.     for(let i=0;i<4;i++){0 t% }! K1 C! A3 L
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    4 o; ~; A  O; k0 i0 l! s
  47.     }
    6 y' k  i* R& q) x5 L
  48. }
    ) ]+ D' m0 b7 _7 J) E
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间8 o& Q: `& e. J6 g3 |- k/ A
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间. l! K# Z, b8 G' t
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    1 G2 ~( b" \3 i4 G" y1 j7 x, n
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    / `% }5 b# @+ k% ^3 P% b
  53.     }- g  u1 Z6 H2 k4 C: s2 B
  54.     return nu;//返回新的播放时间1 @4 }4 ~( n4 `, @2 ]
  55. }! D) _4 _1 u$ ]. `3 T" u
  56. function grnn(min, max) {//随机小数) U1 z& M. Q2 {$ q5 T6 x. e
  57.     return  Math.random()*(max-min)+min;6 w  T8 ^5 E$ s4 O2 c
  58. }
    " _" t( g1 g( u2 P- v' M
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    6 V0 }5 V, u* z
  60.     // 获取列车从车库开出的距离
    ) s/ M# Y; u' \
  61.     let railProgress = train.railProgress();
      v1 J- Z6 ^  O. r: N
  62.     // 获取当前轨道的索引
    0 C. C5 X9 L( ?: Q
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    # z  }8 h5 W' z. L
  64.     // 检查当前轨道索引是否有效
    4 _3 O/ o; F/ y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {7 L& }$ N/ R5 l
  66.         // 获取当前路径数据对象6 }: \* O; k, X) b
  67.         let currentPathData = train.path().get(currentRailIndex);: R6 V$ `9 a! u% S" L
  68.         // 获取当前轨道使用的自定义轨道名称
    ( e/ Z0 d  L4 G% ~, N8 ^0 p% C
  69.         let trackModelKey = currentPathData.rail.getModelKey();* A9 N/ P8 [9 @4 W' N8 L: P2 H
  70.         return trackModelKey;# p3 j* A* r  `9 L
  71.     }1 W  N$ i/ t0 r$ o# L
  72.     return null; // 或者是一个默认值
      V/ P( R/ Z, D
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错: ^" |, s' S6 o5 r
有事加我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:041 I% |9 f% Q# F  a1 a
bve声音要方便一些吧,他有可视化可预览的编辑工具

6 R) D( b- H1 C- ~嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
5 w8 _' \+ R1 |! ~6 i/ `2 l: L% P1 F2 Z' ]  g
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 9 [: M/ n8 v2 q
huliawsl 发表于 2024-5-17 21:12
$ z) _7 P- c" P相较于此,我还是认为bve格式会更简单

/ y( B6 v( N3 C/ \) E🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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