开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
& {4 V- ]- `+ y5 _8 R" Q( I  s9 v* q* G& S3 @
/ Z( n: K. B, ?3 Y, X* _* z
最近在研究JS 做了一个简单的逻辑来播放声音5 ^4 e2 u7 a( o8 D. B! p0 `
  1. var pit = 1;//初始化音高(速度)
    1 D; L- a* `) z- g% R+ |! q
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    8 @8 g4 \& x: _
  3. function create(ctx, state, train) {- ?6 t) j3 U! y4 j9 H
  4.     state.number = new Array();
    ' ^) R* y& T: p' ^0 X3 Z- T
  5.     state.soundsspeed = 0;//初始化速度* ^. D2 v3 _1 d; ]0 ?
  6.     state.speedsub = 0;1 U1 M: Z8 d) E7 s" T
  7.     for(let i = 0; i < 100; i++){* {. S4 B' O- P6 }" G
  8.         state.number[i]=0;//初始化数组
    % C: `! L! X4 [/ O% d
  9.     }) ^0 m3 `7 g6 ?; W3 z- |
  10. }
    . W& {3 ?% d- t! r
  11. / U" H) a5 t9 g7 t2 t0 S, n
  12. function render(ctx, state, train) {
    % i% R7 ]. ^! G* ]8 ~# n
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ) |' T% J/ b) G- K8 D' X
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)5 \( ~- ^' ^$ g: H9 X6 [& k
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    - E( A# t% J  b. r" o7 c' A
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差1 r) W( [1 i* c. b+ t4 R2 P5 Q
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)  p: G# [1 j- \  Q- w- ]# |
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    " x! \: A% _8 F7 t0 K& J" a: ~
  19.         for (let i = 0; i < train.trainCars(); i++) {
    + p: N! k: ~. _  b% S9 `* ~
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    7 d8 ?1 V0 p+ o- U$ R) s6 V5 S
  21.             if(state.speedsub<-1){//如果车辆减速8 \  U5 @) u) U
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    9 l7 E+ \5 ^# z- b
  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);//更新返回时间 播放刹车声在转向架11 u5 U6 m" j( ]
  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
    & {. [7 ?& [- T& W% o
  25.             }else if(state.speedsub>1){//如果车辆加速
      n" i8 @) X1 C6 F6 {
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速; V( X$ c# N8 \- c
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声+ O3 B+ q! C" B$ [# I" ~/ h% w
  28.             }* d3 ?" T3 U6 _. T) j4 A8 T2 z( I
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    2 [  z$ g( k+ |3 F! U  \
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声' G% M. D* q7 D. i+ w' N
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启( E+ B% y7 `5 G4 ]. J
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右( q" N/ t9 g$ W( R
  33.             }; |8 F6 K3 N: D) J% A. P6 B
  34.             if(train.speed()*20*3.6>5){
    3 G; z& ^5 Y& x0 P# w- \- `
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    & M  t% Q/ U7 N& b: C) b
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声( U9 q" U8 s: Z5 ~
  37.             }
    7 U% R  q! X- U6 j, I0 x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    $ ^0 ^8 \: g7 g' O& h7 ~
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    9 D( V5 m3 j1 ^3 U/ j* c
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声& W& k  k$ [- F5 p+ K
  41.             }
    , @% X4 k- ?$ o! s% j
  42.         }
    % E" n  y6 {8 ^* V: ?0 I
  43.     }
    / t  F' J' r# o
  44.     state.soundsspeed = train.speed();//更新速度
    % k; }. t0 h  n5 n
  45.     for(let i=0;i<4;i++){
    0 i" }, c4 C& M' }4 K. r) z$ W6 [
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    2 X# T: M. ~3 m. N7 ^1 l
  47.     }& k  w' _1 z6 K. o8 p3 }8 L: N
  48. }( w8 Q% p# G9 A9 ~: _8 a
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间/ l8 `3 c: V: W: _, }9 Z" B6 e3 e3 j
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    , z+ ]  |0 _! o! U- b- l
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ! G/ \: A- O2 |2 m& R% a  A
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    7 e2 f2 Z2 h, M, Y2 I
  53.     }
      i$ F$ m9 X; k; b7 |$ ?
  54.     return nu;//返回新的播放时间( }  B% }6 [! f' D% J
  55. }0 Y0 ^1 s9 Y4 ?9 ?8 j$ x) m8 |
  56. function grnn(min, max) {//随机小数
    6 O+ b$ o" t9 j9 t) Y
  57.     return  Math.random()*(max-min)+min;/ B- t% ~- Z+ s  J' m
  58. }
    2 _( J. _9 m3 R" o/ o9 D
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    9 t2 d2 h' [. `( M+ M' u
  60.     // 获取列车从车库开出的距离
    8 K4 D/ [+ a  O) k4 ~1 D4 W
  61.     let railProgress = train.railProgress();
    & [" v1 V: b0 B! X
  62.     // 获取当前轨道的索引
    " G3 a, e* c# `0 P% l1 H
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    2 j% b* b" a' N
  64.     // 检查当前轨道索引是否有效- x5 P) F6 ?6 x; p2 y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {2 c/ o: U& W" z' l: b
  66.         // 获取当前路径数据对象% }1 K1 W& z/ D# `  e" t
  67.         let currentPathData = train.path().get(currentRailIndex);1 z4 B* E# \5 u' |  ~: t! b
  68.         // 获取当前轨道使用的自定义轨道名称8 j9 i* F! Q% i/ N0 d
  69.         let trackModelKey = currentPathData.rail.getModelKey();9 U+ v& j3 |% C" C
  70.         return trackModelKey;
    4 U6 V5 @; G% n5 l; o' P+ u% G
  71.     }/ B6 v& g5 f' `4 z0 K
  72.     return null; // 或者是一个默认值
    * D/ Z9 G# \& R6 Y
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ t; Y) @0 G) u6 b
有事加我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
9 [6 b4 }7 q7 d) C' ~  F4 n  hbve声音要方便一些吧,他有可视化可预览的编辑工具
" @! y4 Z: @/ T2 K/ F
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 / z; b. g6 I4 q4 q8 _7 F
3 q6 x6 ^% m$ o1 i
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
& N" Z6 c6 F0 k
huliawsl 发表于 2024-5-17 21:12
) U9 i2 _% v" F# `相较于此,我还是认为bve格式会更简单
) Z. T: O" [# E- a1 y( S
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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