开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
# _7 u% F7 H! ]. T
* L8 U6 }! Z& v! g: k! `( n0 }1 H! T1 |  q9 Z! G  x: b% _9 d
最近在研究JS 做了一个简单的逻辑来播放声音4 ?( `! j+ e8 t' J
  1. var pit = 1;//初始化音高(速度)
    + g+ U3 h5 }0 w6 p
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]3 x+ c5 U  @% Z) s' z
  3. function create(ctx, state, train) {3 l1 g0 M  G9 n
  4.     state.number = new Array();  ~# c1 I  ~% h$ h% X' \
  5.     state.soundsspeed = 0;//初始化速度
    ! Z- }  c  M1 E2 L
  6.     state.speedsub = 0;- Y( k2 `" M8 V2 N9 `, u) \
  7.     for(let i = 0; i < 100; i++){" j% a9 }" }6 ~, y0 p7 |1 |
  8.         state.number[i]=0;//初始化数组, v6 `& Q5 q3 {
  9.     }3 a, B) P! v& C$ D+ ~3 O
  10. }3 F# V" M# o, J1 ?+ ]+ g
  11. 6 ]& b; n, ]8 O9 s3 b. g+ D
  12. function render(ctx, state, train) {
    / G) k0 x' w, E2 {7 e" f
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    - e- K" T5 C1 X( Z; K
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
      x4 X: U: k  b! Z  I
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    % N- V+ g2 E  |1 |6 H- c
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    + V. z1 b! ]- c0 r: F/ p; X
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    4 c9 U- N% Q& k! |/ S( A
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作8 S2 g: V( \- `. I* i
  19.         for (let i = 0; i < train.trainCars(); i++) {
    " E  w7 V  b9 W, J8 O0 \" |
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启  V, }. T0 d4 g& `) ?, R3 C9 W
  21.             if(state.speedsub<-1){//如果车辆减速
    6 b9 e4 p7 h/ O2 |& b  k
  22.                 ctx.setDebugInfo("shache",1);//记录刹车# ]8 n2 E( J. B6 |; m, N
  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
    ; F% q0 j, O& H, O1 ?0 J6 U% O
  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
    , R9 \7 \% N0 x8 y
  25.             }else if(state.speedsub>1){//如果车辆加速
    , v+ O; d5 O9 |0 ?% T
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    ( x2 _, L( f- X% [
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
      G9 N' ~4 \1 u; }: o( ^8 O
  28.             }
    2 a/ K1 I. n+ t! c- C3 j
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    5 v( e% x& T, V
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声7 G5 T8 X" i% `" t/ h* ]" d$ y  E8 c
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ! s' M. g! E8 R4 V, s1 `6 v
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ) f) }% p8 B& p3 G% m. n( L
  33.             }
    3 t1 \. A' @2 Z  i$ S3 O% |
  34.             if(train.speed()*20*3.6>5){8 Z' w- a3 k3 `2 k' F5 P4 V# N
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ( k1 D( c* n. N" k, k" W! t1 q
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 A& K( `1 `. G5 U! J* ~  L
  37.             }1 I& Y- A7 \1 {# c8 j
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    7 G, F8 w7 E8 m$ B5 Q/ H& I4 H
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声% `; }, P8 _; e. h& `& G# a
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声4 {/ v' ~, O( R, L& `; c4 x- V
  41.             }9 V! a# u- a1 l) Q; V! J; u
  42.         }
    2 K4 _5 {! n- G$ N* n$ A2 ~
  43.     }
    2 f2 h8 @: @& L! z5 g$ F# Q2 `
  44.     state.soundsspeed = train.speed();//更新速度
    # q( G6 X% m2 }! O! ^
  45.     for(let i=0;i<4;i++){6 ?- @- C4 f, }) ~; ~+ d' O
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ' L: y! n: w0 J* N0 H. Z( z6 y
  47.     }
    , h, R# B  \7 ]) q
  48. }
      H4 C: d8 H2 C* f1 D8 f
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间% n' X% X2 s5 _3 J0 E4 x5 T, i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间5 V" o- L4 A6 R- H- V
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    5 Q* i$ e9 ?  S6 j
  52.         nu = Timing.elapsed()+long;   //更新播放时间" ^' G1 U  j7 p
  53.     }
    & S& e# Y+ O0 p( w3 N3 b( }# J
  54.     return nu;//返回新的播放时间# K3 V7 t3 M, v
  55. }
    8 S& B3 t7 w6 [# v. T0 i" S$ G
  56. function grnn(min, max) {//随机小数
    8 J# a, i7 x0 X; F9 {. g* a
  57.     return  Math.random()*(max-min)+min;/ R. ^; A9 x! A( ]. R
  58. }
    9 `9 j- f2 F, S( v( M
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的" B. K6 `( v4 g" F
  60.     // 获取列车从车库开出的距离: r8 }) \  ]7 T& c2 |  \- R2 G
  61.     let railProgress = train.railProgress();2 p5 ^$ q. P, C* D
  62.     // 获取当前轨道的索引
    6 l: o$ W: k4 X! d9 f, W$ s7 V8 v) \
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);2 z. _0 S% @! }# O
  64.     // 检查当前轨道索引是否有效
    , d% D, b3 @, K. q6 T5 C
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    $ H$ ~9 U. S' `- r: }6 Y
  66.         // 获取当前路径数据对象
    ( r, @9 ~0 Z! {  e, @5 T
  67.         let currentPathData = train.path().get(currentRailIndex);! b' E* y" o9 A3 K' t% g& M! a
  68.         // 获取当前轨道使用的自定义轨道名称# M0 @# [: A% f# a" i2 A# P
  69.         let trackModelKey = currentPathData.rail.getModelKey();% p3 P6 }% R2 |2 d0 l# D
  70.         return trackModelKey;
      n+ \/ V  o- d; @0 R2 X6 H. d
  71.     }; w  z$ \7 @8 C- q
  72.     return null; // 或者是一个默认值; e; ?5 t7 B7 [5 B- r
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错! \! i( J3 C/ F# 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
  D, O) d4 b& M6 ybve声音要方便一些吧,他有可视化可预览的编辑工具

0 a3 T- _# x1 E7 `: B嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
/ ^' U& c9 M+ A2 f! D, `2 S; o* S7 @3 ~8 M4 Q
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ' K5 E3 s' I8 ?& ]2 f
huliawsl 发表于 2024-5-17 21:12
( q0 _3 P! D0 A" Y) c* t相较于此,我还是认为bve格式会更简单
8 g) \; H; I% Y' X. e) O4 w
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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