开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
1 Y! j' P9 Q0 m* o
2 O( }3 J0 J" U# \6 D5 P
; a/ i; G; D$ H最近在研究JS 做了一个简单的逻辑来播放声音5 r6 R+ h9 k3 y7 M; _8 m0 k
  1. var pit = 1;//初始化音高(速度)7 d" o3 q4 ^" L7 m1 ^
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    4 j/ R9 ?/ B/ o# f1 I
  3. function create(ctx, state, train) {( ~9 U3 {% j0 f
  4.     state.number = new Array();
    2 W* M1 b9 h; V5 S9 F. r& Q9 Y# O
  5.     state.soundsspeed = 0;//初始化速度
    $ @4 @5 p- ]1 S! n3 W7 |1 E: w
  6.     state.speedsub = 0;0 E: t. k4 j: b* j' r- N4 w2 n
  7.     for(let i = 0; i < 100; i++){* x( @$ }5 ^2 ?7 d$ {2 o
  8.         state.number[i]=0;//初始化数组3 N* k# u( i9 i8 k# {
  9.     }
    / Y: C! K+ ]* o
  10. }
    - X, L8 |6 j! c* \1 _! h" k$ D8 Z

  11. , E4 Y6 t  B8 r2 o+ ~: U" m
  12. function render(ctx, state, train) {- \8 i# m+ P4 J& U
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    # O, W" l3 T( N6 r
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    , D) s% g" F' A6 i! [# @0 E; Q
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ! h8 H- W8 J/ Q% M2 T+ P9 ]. U
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差- E# X" B# g+ Q/ E
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ( l& r9 U+ q( s2 Y& M
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    . C+ x  S2 W" N1 y/ i9 G
  19.         for (let i = 0; i < train.trainCars(); i++) {
    6 h4 S( M0 ^- D1 D9 s
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启& ]& g$ T5 n9 V
  21.             if(state.speedsub<-1){//如果车辆减速
    5 t1 y% `% B7 C+ o
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    8 T3 W/ [$ _1 k6 u) ]" _' ~& 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
    " S; ^/ _$ [! j& \: m- _1 D" H
  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 p5 K1 d9 k1 }+ D, V7 \2 a
  25.             }else if(state.speedsub>1){//如果车辆加速
    % v/ e- }# f/ ~0 W  a4 H5 E
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速9 y; D( l" n/ t0 J
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    6 a8 g' c7 R' W% K- s  M2 D) H
  28.             }
    1 a6 b, h3 f8 J- a
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声! K) l, X- u1 }: o
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声2 d, X; @! P( a# ~0 k. K
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启3 l- M) [' Y6 W& Q2 Y0 k
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右4 H( ~3 p# U  O. A
  33.             }3 ~* S# ]" }! m( \  c( i
  34.             if(train.speed()*20*3.6>5){- g& D. i- ^! }8 W, Q% v6 o
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声- C+ x3 C1 A& V& t: D+ @; N7 m
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    6 W. N/ }- {1 y( Q0 a" v/ l% W
  37.             }$ F- X! d' B, c6 E8 P0 x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    * S- X9 M. w4 N6 b' Q: _
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    , u1 }1 J# `6 J3 n) d
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    , S# d$ @3 h! ?: i+ d- \& }- w
  41.             }( ~2 {% J$ h. Y9 I: s/ R
  42.         }* l2 f& @" W) p2 V
  43.     }6 Q+ f+ G1 o; D5 }7 Y
  44.     state.soundsspeed = train.speed();//更新速度0 |6 M8 n; `6 B6 f: K5 _
  45.     for(let i=0;i<4;i++){- X) t6 ?: w: I. i) Y6 F' \/ v
  46.         ctx.setDebugInfo(i+"=",state.number[i]);7 t6 s* N9 d: ]& ^; m6 k
  47.     }
    & |3 e, \$ F; ]- N( q  Z/ d
  48. }
    ( ~$ ], y3 k! D
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间$ h5 i% D4 j1 ^/ I0 K2 g2 b  y8 }
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间: g' V' c9 F0 G* g; G$ B7 b4 V
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    4 u6 R2 j$ u3 z  i
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ' N6 r/ I* V# F+ N/ C" G: e. t
  53.     }$ v# W6 ^4 K) H8 j( j( Z- O
  54.     return nu;//返回新的播放时间6 Y9 k7 ?& q$ K
  55. }$ T" `7 f: u, b* V) _
  56. function grnn(min, max) {//随机小数0 }' o. A7 E9 G7 H
  57.     return  Math.random()*(max-min)+min;
    + \1 u, t4 @2 o5 D
  58. }4 y" B) n" I" X0 K6 ?  x6 O2 ?! w" s
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的: D8 |% n! w# Q
  60.     // 获取列车从车库开出的距离5 w( i/ v+ u+ I9 ]  @" J  u/ h
  61.     let railProgress = train.railProgress();; `; }* |) T, a$ }4 U( [, Z' \
  62.     // 获取当前轨道的索引
      u$ }; w1 I( x. F1 d
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);  o# i  X8 k% M2 `& t1 W
  64.     // 检查当前轨道索引是否有效
    ! C. T1 X) |5 U5 Q+ A" l. Y5 U% i9 B+ }
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    5 l& C1 O1 D; @1 a7 I( ]1 g6 U
  66.         // 获取当前路径数据对象( D- s5 b3 g) R8 J& V2 i
  67.         let currentPathData = train.path().get(currentRailIndex);. L+ }% e! {/ s: C8 E
  68.         // 获取当前轨道使用的自定义轨道名称
    0 i4 y) c) a: K9 M
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    6 n" m* S8 L0 z$ ]2 U8 P
  70.         return trackModelKey;
    3 p& _+ b5 b* J: H$ W
  71.     }
    2 s5 O4 H% z. U3 w4 Z1 T: h
  72.     return null; // 或者是一个默认值" S, }2 h% x" e9 }
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
% U0 s% S/ L8 S& v# |8 e( g
有事加我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:047 x! ~% V+ ]4 A7 \+ Q8 B  k6 e
bve声音要方便一些吧,他有可视化可预览的编辑工具
) _/ T4 `/ k; }9 N- |  t* c
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
6 R/ V, \9 v4 J9 M0 Q( n2 }! q6 k! v
0 ^! J& t0 o* G8 h! H; C相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 " ]7 x: K' i$ _4 h( ?0 X' {
huliawsl 发表于 2024-5-17 21:12" d; g0 _7 O6 a4 ?* m2 }& W
相较于此,我还是认为bve格式会更简单
' ~2 R$ i5 |5 E3 V8 R
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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