开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 3 o8 u- H2 E2 v: y. u% ]
1 e; J2 m+ n. g& K5 S
8 c" |$ l5 D& ~
最近在研究JS 做了一个简单的逻辑来播放声音
& t7 N3 E. v3 `$ P6 K/ p2 S1 @
  1. var pit = 1;//初始化音高(速度)" H3 [) i# v( q
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]8 H" F5 q$ L# R4 Q  V2 q0 w  C4 p9 `
  3. function create(ctx, state, train) {
    ; ^4 e. u: V, v. g# d! W, @
  4.     state.number = new Array();, c; [: a/ U% V* u) m! u. O1 c
  5.     state.soundsspeed = 0;//初始化速度* x6 a- x# G3 [; w
  6.     state.speedsub = 0;' E) p* k  T& E' v
  7.     for(let i = 0; i < 100; i++){
    1 F0 {, h6 W! X- H& C- o, a
  8.         state.number[i]=0;//初始化数组5 K3 _8 y# T' e) K4 P: O: ]
  9.     }
    : t4 a7 N. |5 o/ |+ b. Y1 d
  10. }
    7 A1 c7 c4 i5 k$ B3 r9 l* y. E. z
  11. ; t0 Z( b9 g$ I  u4 O. F- P
  12. function render(ctx, state, train) {
    6 L* v- R5 L6 H' @4 t$ X$ c
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动# o6 c  g* c$ w3 }
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ! f$ `" M, Q) b  ]
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    7 v9 f- T# E( [+ m0 C; h
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差. U1 b) X2 D* K& D
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)# Y, V/ n1 d9 r/ `% W' ?
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    % _/ z- |: a7 E
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ! [2 d5 L! Q$ {6 ]8 Y' V
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启' G  W! O& q" T2 m) s, ~% [" r
  21.             if(state.speedsub<-1){//如果车辆减速
    3 A9 Z1 Z! z/ h, r% b
  22.                 ctx.setDebugInfo("shache",1);//记录刹车, a& U0 J9 Y6 T, P2 t7 W% V( c0 u' M
  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
    . X8 M, p" o4 M* o% d% e! M0 p
  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
    " a% Z2 s! T! G" @: H% h+ |- D4 p
  25.             }else if(state.speedsub>1){//如果车辆加速. G' |! w5 [# [! ~. w
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速. R2 ]5 h0 z! ~/ y
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声2 s. a6 F- m/ Y+ V2 i' ^
  28.             }
    ) w$ a3 |9 V, G$ k0 ~' T$ p
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声+ X4 P- L+ ^8 x; c0 F. G7 x# c8 J
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    + X: D2 b% ]0 z; m% v/ U% ?
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启1 y2 _! i4 y1 }& `$ V- X& s+ x
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右5 [& L/ |( f. y" G
  33.             }! K- b1 w. k7 s7 m5 d
  34.             if(train.speed()*20*3.6>5){9 i9 R& w6 ~4 E* C& W- f
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声0 Y9 q7 g2 u# ~8 O( w
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 {: S8 |. P: P( k$ m& h/ z
  37.             }
    $ [# i3 d; u( h" M2 |  G1 @
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){) ]9 E  v: {$ J) W
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    7 j0 X0 ^( t, Z. O; R
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声9 T& F) @6 U6 ?% k4 x& t6 ^- f- X
  41.             }. c. g4 ~3 l2 l' z: C
  42.         }8 N% W' c* C, w
  43.     }" p6 h& y5 R+ J2 ?( E, d
  44.     state.soundsspeed = train.speed();//更新速度
    : d. B/ g. p* M* J
  45.     for(let i=0;i<4;i++){
    6 g( _1 Y$ Q. T* v/ \  s
  46.         ctx.setDebugInfo(i+"=",state.number[i]);5 S: B! P2 y8 r* ]. I
  47.     }$ d: d; {) L  Y1 J
  48. }
    $ I, A" K; i1 R, C4 |, S$ T( W2 X
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    . E; ~- o' B; R" `9 W5 }
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ( J  r: H& e+ o' `3 i7 \4 X
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    / S, [, q7 w$ i( X
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    . @& z9 s9 t7 I( J  O4 U
  53.     }7 G9 p# ]3 N3 W1 x% K( c! J+ l; t/ v
  54.     return nu;//返回新的播放时间9 a* O0 [  `  Z, x
  55. }8 ^3 l  q# P* K+ e/ Z$ g
  56. function grnn(min, max) {//随机小数7 v' \9 @* S/ d* L3 d/ F
  57.     return  Math.random()*(max-min)+min;
    - y# d' u0 v  c/ Q+ R
  58. }
    ; ^+ f" K1 J. \
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ) T! ]" J9 d0 z4 n" w: j" V
  60.     // 获取列车从车库开出的距离
    ' @# p. p4 C1 }( r3 r' T: t8 C
  61.     let railProgress = train.railProgress();# ^. Q! \7 u$ H/ n
  62.     // 获取当前轨道的索引
    ( {1 y) P# i, g2 ?2 ?
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);. @& t$ q3 X6 E: e
  64.     // 检查当前轨道索引是否有效
      [2 C2 D$ x2 E2 m$ y$ ?. Y( a
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    , W7 c( w2 N1 I
  66.         // 获取当前路径数据对象
    4 V" D4 }0 ], m9 X. b0 m' M- D
  67.         let currentPathData = train.path().get(currentRailIndex);3 Z( c5 n' b4 r0 `9 e- n
  68.         // 获取当前轨道使用的自定义轨道名称
    ' i' w( H( S3 Q" \, C/ F
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    5 j1 D( c. D; [. ~/ t
  70.         return trackModelKey;
    8 J0 o0 [% ~" I! j+ ?
  71.     }) g2 J- _/ c3 ~! S6 c' c: y8 ]/ \
  72.     return null; // 或者是一个默认值
    8 z% Z) M1 z: I- ?, A) k7 Q1 M
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错, R! C/ H, b$ H+ ~' c0 k# H
有事加我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. g* ~4 t+ y7 Y: l# n
bve声音要方便一些吧,他有可视化可预览的编辑工具
9 o( t: l" h% J. ]% ?" {+ W# v9 {: Z
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
, A/ b- Q$ _2 m* M+ X3 Y4 }; }; K- |; T+ E2 f- U0 {$ n. B
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
7 A( b( V& K; u6 a" \; U6 i  T
huliawsl 发表于 2024-5-17 21:12
7 S( G, R" r" X/ L' d0 ?相较于此,我还是认为bve格式会更简单
4 E% j, ]& X; t$ s0 I- d
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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