开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 3 D6 q9 t/ h. o; l
( h# L% a' @4 U6 I# E5 o/ w

  W- l0 \) J. x+ q最近在研究JS 做了一个简单的逻辑来播放声音' x/ Y/ x* c: x# m$ w# [4 ?! y8 k
  1. var pit = 1;//初始化音高(速度)
    9 G* o' P, _8 k7 h3 U
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ {, j* [5 I, E/ J2 e' l$ o4 R
  3. function create(ctx, state, train) {/ g: M! y2 W7 V" w
  4.     state.number = new Array();% r% q( H$ G0 P) A  j5 F6 g
  5.     state.soundsspeed = 0;//初始化速度& K0 I( S3 D8 G# Z! \
  6.     state.speedsub = 0;
    5 w& B1 I9 ^: Z/ o3 k
  7.     for(let i = 0; i < 100; i++){
    & H  t5 N4 ^2 e( ^6 w9 O
  8.         state.number[i]=0;//初始化数组( ~; h  f. F- y% j9 A
  9.     }4 o1 {) K' T- _( L& O! d
  10. }1 ^8 s  y% W6 E; b3 `* @
  11. $ j$ r4 S9 J+ u5 p. t# `: \; j( G" `0 T
  12. function render(ctx, state, train) {
    " i$ D* K! t1 y* W, `
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    2 S- @2 X# k; @  h
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    + x0 F. N/ Z$ j! W
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ) z5 x0 Q  I) p# {4 L
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    : j; j: \& u( F( B; H
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    3 A7 G! i1 y# ], N
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作; }4 x* j; F5 f  V
  19.         for (let i = 0; i < train.trainCars(); i++) {
    1 X- a5 ~' [  ]7 j5 ^* Y: S
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启4 S" [: C) d2 }5 S, G$ b7 F
  21.             if(state.speedsub<-1){//如果车辆减速
    ; e4 |0 m; U  N: S6 t
  22.                 ctx.setDebugInfo("shache",1);//记录刹车7 b5 {3 q& W* b% J
  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' W3 z! e0 x/ j5 }
  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
    ( V/ X2 d* A4 u3 z* Z9 `  O, {) f, ?
  25.             }else if(state.speedsub>1){//如果车辆加速
    5 |7 O/ u( H! C- I  v, ?
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    3 o9 _( x" {0 E- G3 ?5 ]
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声! y, K" h; \7 N8 h! @- N" }
  28.             }
    6 m) T- _/ x# M" K
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ; l. _, _5 c) ?$ `# b* |1 ^$ P
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声2 A' c" i1 R/ {1 r6 a/ [
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    . e# j) z4 p5 j' _" k" s
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ' v, i# `9 X0 O( t$ l% u6 a! j
  33.             }
    6 }- X8 r, \" w1 z% X) N
  34.             if(train.speed()*20*3.6>5){# h, f4 L9 X( w' K
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    # ?. m) N# U+ S' L2 @" n
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声* b, a' I# M  B' J
  37.             }, t$ V* I: `0 R; {) B) |. y, r
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    5 L) I: y; x8 M. Q9 v
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 ]* Y% W/ `: r) C* ^- f, n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声5 C0 T' ^! B9 @$ Z2 W9 D# Y- |
  41.             }
    / F8 i7 ~' e9 y/ i1 Y
  42.         }. T2 P$ z% {( g' |7 ]# D2 g
  43.     }* c, n& l4 m7 |1 C& }! j
  44.     state.soundsspeed = train.speed();//更新速度
    $ D, n9 _% [4 U$ o
  45.     for(let i=0;i<4;i++){8 G3 X1 ^  y1 T2 U  n9 g2 G: }5 t
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    0 `, V6 R. }+ ?* T
  47.     }$ B. d; v' H' Y& H& [" H: T# e( b
  48. }/ d6 h: b" Y  F* D2 c9 G
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ( L# G2 i" e& B; t  ~8 h$ _
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间, B! h0 n8 O* B) @2 r; A# X7 f" w3 G
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放# p0 m+ U* T4 L. J- L* J  u2 k
  52.         nu = Timing.elapsed()+long;   //更新播放时间6 `3 B8 u' C  d8 P
  53.     }
    ( D! p! Q1 E* B/ q$ M
  54.     return nu;//返回新的播放时间
    4 ^+ \8 D" r4 Q  _1 \/ @1 g5 t5 k
  55. }' C7 S" ]* i9 p6 u* U5 s- d* B
  56. function grnn(min, max) {//随机小数7 s+ O, e7 K5 c% `8 e& j) S
  57.     return  Math.random()*(max-min)+min;
    7 P" a  p2 [2 O' I
  58. }
    * @- W/ Q8 O8 W
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的. D# U. y5 A, i; {& e0 B" l& w
  60.     // 获取列车从车库开出的距离
    7 c4 p! R* _& ?/ W: N7 \
  61.     let railProgress = train.railProgress();  t  j( y) c1 \
  62.     // 获取当前轨道的索引8 ]0 ^8 l" N+ [+ U
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);; N" L3 i3 d9 L; u7 P
  64.     // 检查当前轨道索引是否有效
    ; `4 ?7 @- t: M
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    : u& Q. e9 i, s9 z7 [( o% ~
  66.         // 获取当前路径数据对象+ d$ k4 h$ ?; z% d8 f, ~
  67.         let currentPathData = train.path().get(currentRailIndex);
    2 Y. [* f, t& C8 @8 J5 |/ e
  68.         // 获取当前轨道使用的自定义轨道名称1 x" F" }7 s: A( u' s# S
  69.         let trackModelKey = currentPathData.rail.getModelKey();5 ~7 W, r9 d4 f8 g6 }
  70.         return trackModelKey;, A, W1 w3 x- i  @0 q
  71.     }
    # W+ W/ ^8 E3 ^* ~
  72.     return null; // 或者是一个默认值3 A' U. ?2 ]# O% Z, v! @  ^
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错5 J! s+ C5 r4 _1 O0 I  o9 R9 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' |3 F  v5 M0 H9 j9 R. j
bve声音要方便一些吧,他有可视化可预览的编辑工具
- s5 `$ A8 e  K2 I- y7 S
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 / x5 u  c9 n" S: h- r
7 I6 B9 Q: w( Q) y: d  S
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
- D8 ]% E9 w0 Y; D" Y
huliawsl 发表于 2024-5-17 21:12: ?+ N  i% @, i7 d3 I
相较于此,我还是认为bve格式会更简单

3 R1 |  M% u  ^* J( y$ U% d🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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