开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
& s, Z7 G) R0 N% h- b' R/ [6 A; |' V& \' j
( [/ {2 x3 [; W! r8 D
最近在研究JS 做了一个简单的逻辑来播放声音
8 c5 o' F( g7 X/ R1 E' |; k
  1. var pit = 1;//初始化音高(速度), C2 x/ S6 s# m; }1 M+ d" r
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    + ^3 J( s, p/ x* i3 x& o) [
  3. function create(ctx, state, train) {" ^: u2 s1 q1 S( [) o: N+ r. p
  4.     state.number = new Array();6 F3 F7 E& O/ A
  5.     state.soundsspeed = 0;//初始化速度
    : A' ]& G) |! [, [- Y
  6.     state.speedsub = 0;
    % ], Z3 k1 v, Q  k
  7.     for(let i = 0; i < 100; i++){  \/ z1 Y+ n# l, @  f# j; ~4 M
  8.         state.number[i]=0;//初始化数组
    8 S* r0 d' _  }
  9.     }0 b$ q/ F9 j) ~. r- Q' C
  10. }
    2 e# n. r) N+ o( f" k3 ~
  11. $ {4 S- Y4 R9 v! J  ^0 I
  12. function render(ctx, state, train) {! O) e$ Z' P" R% o! ~
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动: Y0 M4 D: {7 v) C& u# c7 _
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    2 i( H6 t8 ^/ L
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    , S# D& S' P$ N5 J
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差6 B% u1 B4 ?5 G; B5 q
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ! S* e; ^. F* q3 p/ Y
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    0 a2 Q4 k  r; ?5 [
  19.         for (let i = 0; i < train.trainCars(); i++) {
    . E, |+ e- ?+ I' c, b5 Q0 }5 s
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启# m* \! F% w; ]3 `& M2 ]6 N7 M0 X
  21.             if(state.speedsub<-1){//如果车辆减速, H8 Z0 _, |! {9 j( s  W+ {
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    $ B2 l( p) f% S  Q  B, U( S1 L- W6 F% _  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! R  [$ [! }1 n3 P' K# I8 v9 K
  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
    % l( R$ _. Y' v# a
  25.             }else if(state.speedsub>1){//如果车辆加速
    1 O6 [- \& T- B
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    / M8 h4 Q( |# r* c
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ( p7 t. [) x! m+ _8 ~( u/ Y" I/ ]
  28.             }7 T; f/ k/ o! ]8 ?6 {
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ; X% W8 k% O# c- `! K5 I1 x5 o* e
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    # }4 I/ ?! B* v4 {8 y  ?
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ' X% G/ c3 i( a. ~  z
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右6 }9 h9 ^3 R7 p# S: _: a  j
  33.             }
    4 V# u9 _5 ]- l$ ^
  34.             if(train.speed()*20*3.6>5){+ h. B/ J4 Z+ g& N# A# q  t
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声) p' z" b9 g8 V3 u3 q# {( j
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    1 S6 P& _5 v6 l6 `' }
  37.             }9 |" L$ ?$ C5 W% v
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    9 t  ~% H" ]. `) ?1 p6 n- z& i
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 t- N9 }$ v( m3 n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声- ?4 `, N+ {3 o% c* D! f: s
  41.             }
    ) s! m' S% R% c+ c+ c7 n% w6 Z( r
  42.         }7 k8 M: H$ g; S5 D# K1 Q, |+ _
  43.     }" W3 i/ a  f& `5 A/ f% N. o
  44.     state.soundsspeed = train.speed();//更新速度
    , n/ p9 P  K0 n! C1 {
  45.     for(let i=0;i<4;i++){. r& f7 g, ^! ~. s
  46.         ctx.setDebugInfo(i+"=",state.number[i]);) a" ?/ y5 k- f/ K: I
  47.     }5 O+ r* k/ d# X( f4 p! A. G$ N0 O
  48. }
    9 R, k& Y) X' C
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    9 R  z/ H- \, H; P
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间5 B7 p4 X: g6 k9 G9 b! `8 K# Y
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放& T4 g3 E! a' q9 P
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    3 K% W* V# _4 ?" X6 `
  53.     }/ X% m, o2 n9 T& h* C
  54.     return nu;//返回新的播放时间
    # ~  Z& I. y. u6 Y  N$ ?
  55. }/ c/ \. @- T$ z/ u: ~& _! y# n
  56. function grnn(min, max) {//随机小数
    3 \1 z3 A, l0 A1 I6 H
  57.     return  Math.random()*(max-min)+min;
    / W# X8 W2 G. c3 }
  58. }& a! }5 a; a5 i# T5 K0 n
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的6 I- M0 L- V3 j/ Q2 q3 S: b: s
  60.     // 获取列车从车库开出的距离
    ( D1 g7 V1 S' z- [1 O: j
  61.     let railProgress = train.railProgress();8 r0 T  K) c4 `( O
  62.     // 获取当前轨道的索引
    5 d) a8 p4 B! r; E; `8 N; ]
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    - M6 G% v% e; L7 j
  64.     // 检查当前轨道索引是否有效9 `  o; q2 c8 |6 W* i+ y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    3 y2 }, }5 r, d! A! Q
  66.         // 获取当前路径数据对象
    5 z. n# [( {. E
  67.         let currentPathData = train.path().get(currentRailIndex);( W9 B# U7 c0 u2 u% l
  68.         // 获取当前轨道使用的自定义轨道名称  U' ]- G1 Y) X9 }$ t' X
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    ) L6 w. Z  O2 Q% Q
  70.         return trackModelKey;) A% e# I. N6 F! l% Y# h
  71.     }
      i/ s6 E9 J5 t
  72.     return null; // 或者是一个默认值
    " |8 F1 q9 x- f* M
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
2 Z# N6 R5 A, E. n1 ?" 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
4 Z/ x5 ^- u$ I3 s7 @( Ybve声音要方便一些吧,他有可视化可预览的编辑工具
& a9 K* K$ V/ d; [4 \: J: b, G% i
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ( Y" {0 d+ Z/ |' e. r2 p" ?
: R' d* p0 x/ U1 |6 q2 t
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 : W0 L% h* B% t$ ^) G  a
huliawsl 发表于 2024-5-17 21:12/ K' J/ w! Q$ F' Y+ s
相较于此,我还是认为bve格式会更简单

1 D4 c. u) g% ]8 ^4 L. A$ A! J🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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