开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 + G2 ^( w" k5 d; ]9 d0 l
6 a* o) x& [' [/ W4 U! m

6 n, [: K: b+ X0 B* c; \最近在研究JS 做了一个简单的逻辑来播放声音
" ]& ~( a8 J! j& {
  1. var pit = 1;//初始化音高(速度)) U( \9 A6 ?0 y+ C/ E
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]! N1 ^5 y5 m1 [% J& b' s' q
  3. function create(ctx, state, train) {
    2 x% T% f' C5 M& i8 Z7 N
  4.     state.number = new Array();
    ; D+ d9 ]4 ~0 ?  u
  5.     state.soundsspeed = 0;//初始化速度! o8 @* Y$ E" K$ l/ j! \8 Z
  6.     state.speedsub = 0;
    4 ^  o! D# f9 ?/ V
  7.     for(let i = 0; i < 100; i++){
    # n( O. \7 K" ]+ B7 O1 n$ o
  8.         state.number[i]=0;//初始化数组
    $ q4 E( a6 R0 q1 U4 z
  9.     }  d8 I$ x# y/ q" `  X
  10. }
    # m; {: ~8 z1 S1 u1 G" M  b7 s2 U
  11. 5 z5 m$ u3 m' N9 i4 n
  12. function render(ctx, state, train) {
    : {$ K1 A- a* i: L7 n5 L2 m
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动3 @" S0 U! D& A$ P! @. y% |9 D: ~3 M
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' `% |1 _. ^) R4 ~
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    % C9 u) C2 C  b, |2 i  a! T
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差: s3 c# C' _! x* E
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)2 r3 S; T& F& b9 u
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作5 c7 n: O  T5 C, T% o8 p& w2 Y( C+ m
  19.         for (let i = 0; i < train.trainCars(); i++) {' W" ^1 Q3 Q4 z: p6 z2 |% V! C( H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启# X; J# ]. y# o+ I) `
  21.             if(state.speedsub<-1){//如果车辆减速
    ; J& M8 E+ P) k. }+ C
  22.                 ctx.setDebugInfo("shache",1);//记录刹车+ ?% H% N* G$ {
  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& \* o4 f" ^0 Z/ D
  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
    8 }. j9 d. C# D5 H' T% j
  25.             }else if(state.speedsub>1){//如果车辆加速
      @. l2 ]( Q' I7 W: Y
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速( k. z( b, V0 I( @
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ! [* E6 U8 q6 G7 V
  28.             }
    : p8 v( u$ r' i, t
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声4 j! _' R- x8 D
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声. S" z( P7 R: v+ S# z% a+ Z
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启, Z8 j$ Y" e' ^& s# n8 A
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右5 y) m: d! ^6 p7 N1 h
  33.             }3 Q& r- h: I! G% h* U+ \/ T& Y
  34.             if(train.speed()*20*3.6>5){
    & h# U: [; b: T6 H5 `3 K
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声6 m0 e) ~8 I5 i$ s9 w  d) {
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    3 C% d: G( b6 O" ?9 W$ O
  37.             }
    * Q9 D6 N& B( y2 @8 b: Z7 f1 m* R
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){, A, T* w- }: k0 x9 x
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    / N1 j) U/ q8 n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ T' e& U4 X* S* x5 `, q, J
  41.             }# m5 z8 C3 f- M0 A+ @+ G* z
  42.         }
    + S# i6 D9 ], O0 m6 v
  43.     }$ r2 M2 x, u8 |9 }% O( W
  44.     state.soundsspeed = train.speed();//更新速度% c5 ~: H" @0 i* P; h3 L; c# s0 |, M8 n
  45.     for(let i=0;i<4;i++){
    3 v8 ?* E$ z4 w( R6 V& W) v' V
  46.         ctx.setDebugInfo(i+"=",state.number[i]);# L: o) W8 }# Z( G0 J+ \  ~( ]
  47.     }- [2 W3 Q' Q  q, {$ h1 B. L' H
  48. }. ~6 ?7 B; ~# l1 d" S
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间# k1 c  c; W% W8 F6 G+ O+ d
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 M- W% h+ h% B/ i" J) _7 A' [
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    6 o% I  I" @6 |' T* i
  52.         nu = Timing.elapsed()+long;   //更新播放时间9 V: s1 \+ Q4 `. x& c
  53.     }
    0 |5 p4 `4 G9 Q4 ^5 g7 I- L
  54.     return nu;//返回新的播放时间( R% s* P! y* _. W+ m5 \/ }
  55. }+ V9 S1 f' T* {1 S
  56. function grnn(min, max) {//随机小数  s5 c: I5 @" {. F$ |7 T
  57.     return  Math.random()*(max-min)+min;
    2 y+ t. A/ U9 j! [6 o, c' l
  58. }
    0 [  Q$ y) F8 n% P
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的# z. `& j, C" Q" \0 h  `6 Y
  60.     // 获取列车从车库开出的距离: Z/ w1 o3 `, e) q) M: R! u9 {- e' x
  61.     let railProgress = train.railProgress();
    8 y9 Z! e) D' L8 J$ F; \
  62.     // 获取当前轨道的索引
    . r  a( a' Z4 M% H" T
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);( q' ^! C" G' ~2 t  B
  64.     // 检查当前轨道索引是否有效
    / s1 h* t' |( p, c! u" J- M
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    6 R% d' v( Y; C% R, o9 k
  66.         // 获取当前路径数据对象
    0 J8 C8 B0 t6 v9 f* e
  67.         let currentPathData = train.path().get(currentRailIndex);
    ' O7 T! G$ r/ ~1 h- G
  68.         // 获取当前轨道使用的自定义轨道名称2 u) d8 m( p' f: U2 u  f7 |$ E2 |
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    4 f' C2 t+ R3 r- R; j' m7 h" x
  70.         return trackModelKey;
    5 S- E! I* t) t% c9 X
  71.     }, f: J; w) f; {, k4 C
  72.     return null; // 或者是一个默认值
    % {, h5 J5 [" U3 ?5 ^  z
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
( {4 f7 @) I- J0 |$ i
有事加我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$ m  Z4 k8 h8 w5 ~. S
bve声音要方便一些吧,他有可视化可预览的编辑工具
7 `/ [! G+ w6 ~2 q2 v5 W" u5 [1 x
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 8 g* d) f+ u" Y5 [8 N6 o

: C2 w+ s5 K7 Y6 J; k7 ^8 Y! w0 i相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
" W4 \$ I  K0 i! J) O
huliawsl 发表于 2024-5-17 21:12
6 k$ h4 M( k  U# M" z9 @相较于此,我还是认为bve格式会更简单

5 X4 p! y- v% W8 s🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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