开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 A9 B2 B' z( x! s3 l0 Y
- T  t5 i/ Q. y' t
1 y5 P7 A, S) m3 n& m最近在研究JS 做了一个简单的逻辑来播放声音
( w2 f# P& Q( e/ |  W
  1. var pit = 1;//初始化音高(速度)9 ]# ?2 }  V: l0 c
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    / {0 h% |7 \5 c* N
  3. function create(ctx, state, train) {
    4 ?1 X* O" V+ b5 U1 d0 j: b
  4.     state.number = new Array();
    / R" Y* N! x3 r: `
  5.     state.soundsspeed = 0;//初始化速度0 w" G2 W6 ^0 n: X$ h
  6.     state.speedsub = 0;  p5 J* T. k, ~# u. i6 E' g
  7.     for(let i = 0; i < 100; i++){7 T3 x3 w: K# ?" D3 i
  8.         state.number[i]=0;//初始化数组
    5 Y+ T7 j  f3 J" o; S1 d
  9.     }' p3 j1 K0 ?$ Z
  10. }
    3 j3 m& K, O, X% C3 @* X

  11. - Q) R2 g+ o/ n3 W: s+ U
  12. function render(ctx, state, train) {  A0 k- T3 X0 c3 i6 D8 T
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    4 ?$ g& A+ E9 ?( T: w$ z9 p$ G0 f
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    6 ]7 O5 ^0 v* u
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ; m6 C6 ]% M, l# L* b  m9 s& Z
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
      F) n  f8 X7 _2 ]/ L
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ' ~' m5 b, S) R+ b
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作; S. K, y: |* m' W
  19.         for (let i = 0; i < train.trainCars(); i++) {
    3 N- u6 G) N) I  H- {. q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! g6 T/ o& n( B9 G7 q: I6 i7 V
  21.             if(state.speedsub<-1){//如果车辆减速. r, T: u6 g) U& y
  22.                 ctx.setDebugInfo("shache",1);//记录刹车/ X& m6 E) V5 z! h: a
  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
    ) L  A# Q3 [( T' H' _5 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& w7 s. @+ v6 g+ }8 [4 i) J, V
  25.             }else if(state.speedsub>1){//如果车辆加速
    + k; o$ x, F% G+ o4 A& [5 q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    % I' L, H; S% k  l- o1 ]+ p
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声' x. y& c& `: B$ R) u# g7 z
  28.             }
    3 H/ v0 X% g6 q" d0 E/ C8 f( X
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声0 K1 J! d8 I5 `$ p' I
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声# i& @3 i0 a/ p3 [9 G
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启. ]6 l- f( g- {
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右: ?7 R4 E; ^0 j" K! ?  w
  33.             }
    2 g, c! L6 z. b- |  W+ ]1 s& y7 Y
  34.             if(train.speed()*20*3.6>5){+ _2 ~, T& A5 Z0 T5 E
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声! C5 g! h! x2 Q$ J
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    : F; @! H3 \, C3 n& z
  37.             }" I& I3 j+ f5 u( S. x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    # l1 ^: T- q; n2 A' s
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声% ?0 [/ s$ K/ Y/ t  Q; |
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    # _7 i$ s7 y  z, [2 K
  41.             }& L7 F5 x7 V  K9 Z' U" H0 S
  42.         }9 q/ B: q0 Y" o
  43.     }; g* F/ A% |. i$ K) F
  44.     state.soundsspeed = train.speed();//更新速度
    2 k  b# M: x  @' |/ }, V$ F
  45.     for(let i=0;i<4;i++){
    0 {* \0 y3 W& I/ h5 t+ O
  46.         ctx.setDebugInfo(i+"=",state.number[i]);6 s' m4 [4 k; |
  47.     }3 L5 k; g( `6 [  B1 @3 {
  48. }
    ( d2 L3 g7 C; Y9 ^+ c' A8 D6 u
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间/ O( G4 J2 O0 ]
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间2 ]6 s1 A$ c0 b$ v7 D$ V
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    # [2 A% @) K8 z+ ]8 H/ U
  52.         nu = Timing.elapsed()+long;   //更新播放时间' x$ d+ ?  A* `6 T# o* x# @6 m: F
  53.     }
    . I; V! N2 T0 y0 W
  54.     return nu;//返回新的播放时间
    * p; `8 Z8 z- j! h( z
  55. }5 L7 u  @* D4 _4 l9 G+ ^$ r
  56. function grnn(min, max) {//随机小数% C2 k; D7 W1 m- N$ t9 j
  57.     return  Math.random()*(max-min)+min;+ Y- G4 L, {/ @( p4 F7 {
  58. }
    ( A4 M5 w+ p4 O( n" Y/ Z& E; V
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的7 F0 ]& F& n# o. x
  60.     // 获取列车从车库开出的距离
    & q8 k1 I1 F( h- l; }
  61.     let railProgress = train.railProgress();
    # \* w) G/ s7 J4 n. R0 g
  62.     // 获取当前轨道的索引8 k+ [- l  Z' m$ s$ `8 O3 V
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);7 [/ s- r6 Y" V# T6 W0 T) m
  64.     // 检查当前轨道索引是否有效, ]9 v7 I& |# ^* P
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {0 ]* ~$ }5 s# C3 F3 y0 e  [
  66.         // 获取当前路径数据对象
    % Y6 v2 Z9 C7 d. _/ @7 f( g) \
  67.         let currentPathData = train.path().get(currentRailIndex);
    / N) J% P* {7 ]" _* ?. N7 S
  68.         // 获取当前轨道使用的自定义轨道名称  L' v) ^: E& s6 _
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    % y3 F2 N/ K6 Y0 t0 B  u/ w
  70.         return trackModelKey;
    % _( Q6 @1 y& ]5 Q2 L
  71.     }% T# u8 m* f' g7 F; h: f: z
  72.     return null; // 或者是一个默认值
    9 p8 }8 z& z" k  O) E
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错0 i) g$ |: i/ W: q9 P, l9 s2 ?1 x
有事加我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$ {$ T% X# i& \% f9 P
bve声音要方便一些吧,他有可视化可预览的编辑工具

7 R+ L/ i0 R/ t( {+ f嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 % @( k. I  H4 P! O, k) ]4 T4 n
" z0 {6 e4 I9 h' ^: Z
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 $ A/ S3 K! h) X, C3 H2 Z5 a1 n
huliawsl 发表于 2024-5-17 21:12$ h4 p' O8 J, a2 D4 \3 s  K
相较于此,我还是认为bve格式会更简单
3 l8 H: l- J% H$ Z2 }0 M/ c
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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