开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 9 D$ T5 v/ S% Y+ t
4 ~4 {) K: G3 v& N: D8 G9 u6 g
; k$ E3 Y8 _5 [: B6 O# ~
最近在研究JS 做了一个简单的逻辑来播放声音
! w' \. f% `& O7 D) o- o/ f
  1. var pit = 1;//初始化音高(速度); E1 L  i$ M- [$ f0 V
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ P1 N+ ]5 f* D0 B/ _3 G
  3. function create(ctx, state, train) {6 J; H4 m* G6 Q& M
  4.     state.number = new Array();9 p* C3 z  r! @# v
  5.     state.soundsspeed = 0;//初始化速度: V: K8 z! m# U. c
  6.     state.speedsub = 0;
    ; K! k  P! M/ R7 e; x0 d1 I' R3 ~
  7.     for(let i = 0; i < 100; i++){
    ( z3 g) z3 \9 y3 S
  8.         state.number[i]=0;//初始化数组
    , m; H7 S8 D: A/ ?  @
  9.     }
    / P6 ?5 X& j, T4 {
  10. }. N0 N& Z" ]1 d+ u  K/ U

  11.   w% z+ {! {' E; [
  12. function render(ctx, state, train) {
    6 D; y3 e4 N* Y# ^7 C2 o
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    - I- n3 j2 }/ L
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)9 i" {3 e1 K, Y9 W; r+ @9 @
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    8 G  q- @. S7 W& U4 T
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    . e8 |% L( D( x
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)# a* T5 B0 H/ ?9 e# L) t
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    : l, \/ M, p' P: w1 e
  19.         for (let i = 0; i < train.trainCars(); i++) {
    3 a2 [% G/ x! _# p
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启* O& v* |# o! R) y0 _
  21.             if(state.speedsub<-1){//如果车辆减速" X3 h$ V  c# J: _' I
  22.                 ctx.setDebugInfo("shache",1);//记录刹车4 c$ z5 h, ~, c& |1 Y1 F4 T% Y
  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 {& k  H1 K1 k* e8 d8 _, o& v
  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 b9 k0 q  O0 n% ^0 Q$ q
  25.             }else if(state.speedsub>1){//如果车辆加速
    * W' F) _7 K3 v- T2 q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速' w3 @9 b. D0 I5 ^3 V
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    5 _; G" Y' S: p' f% Y' t& G
  28.             }# ]4 l& M' q6 ?% A/ Q0 ?, n
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    8 e3 Y1 q; n8 Z
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    * S$ o+ m9 }; ~9 x
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    8 t2 G% O0 X, Q1 I3 n
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右& q7 i$ D6 T2 J
  33.             }$ T% W% F7 b2 H" E: U* a- h" p7 T$ [
  34.             if(train.speed()*20*3.6>5){' H2 e* W3 s$ A0 f8 }1 U
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声2 x& u  q3 A7 H8 E. }
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    & c  G% v0 A) M) _& z+ u+ `+ d
  37.             }
    # e1 i7 [! p2 i$ p& A8 n
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){5 e+ f9 z- K' T5 U  Z
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ! t) n5 {+ o' c, M& L) r, g
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    3 w( A$ V7 d) v8 k- p
  41.             }/ {- A- d8 n) r! a9 v
  42.         }& e% l1 z4 J$ f' j  C
  43.     }& N5 \3 s& A/ l3 S9 l/ ]
  44.     state.soundsspeed = train.speed();//更新速度8 z1 g/ P, t, Z7 k# D8 Z- J8 F
  45.     for(let i=0;i<4;i++){8 L" g. e  ^- \, T
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    9 Y! x7 Q- x/ `" \" I
  47.     }$ z  b. S* u5 ^
  48. }9 D2 G( }; L/ H/ e: c# A+ t
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    # G" A5 {5 C+ f" n9 @
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; B7 j8 M; F! b4 `6 c% b
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    " b# s" o" |" K6 |
  52.         nu = Timing.elapsed()+long;   //更新播放时间- y$ g2 w, s1 t# O3 r/ V
  53.     }# W* W# K: H4 D
  54.     return nu;//返回新的播放时间
    . d# @; J; E4 w7 V
  55. }3 D3 H4 \" D  |" o- X) e
  56. function grnn(min, max) {//随机小数
    8 K! ^  W' M+ P. g5 ~+ `8 E( ]
  57.     return  Math.random()*(max-min)+min;" W# }8 G; \, m' h% e0 a7 l! A
  58. }
    $ r: \2 K+ F. q' A; y
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    8 @/ ^2 Z  p! l, H
  60.     // 获取列车从车库开出的距离3 v% b- x# Y. L: }& Y! a; B- n
  61.     let railProgress = train.railProgress();
    ) l! U. C8 v, F( s
  62.     // 获取当前轨道的索引
    + X5 _* _# o! m" Y& u" r
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);. U% u9 j6 ?3 |# P4 H% _# h
  64.     // 检查当前轨道索引是否有效
    9 }8 V- o- d! x- H% G
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    7 j) C) Q7 K5 G+ I1 y" S% J; f
  66.         // 获取当前路径数据对象
    ' V1 R9 L* X2 |5 _( O
  67.         let currentPathData = train.path().get(currentRailIndex);
    2 }8 k3 f/ a$ H/ A
  68.         // 获取当前轨道使用的自定义轨道名称, u' p/ O0 v$ Q+ m  Z; Y2 z! Z/ a4 v
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    0 _5 m) x3 d% i/ H
  70.         return trackModelKey;, N: v3 s# T+ l2 @+ t; P
  71.     }, M$ O+ W$ `7 K5 s+ E
  72.     return null; // 或者是一个默认值
    ) N# Y* l1 K) ^) M- N( Y
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错" b4 v8 |7 O8 e$ Y
有事加我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" c. f2 \' u0 X4 N8 b$ j, @9 A
bve声音要方便一些吧,他有可视化可预览的编辑工具

' a0 ^, }5 e; ^8 G# ~) e嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
# s. H0 i; {: N8 [9 ]$ y5 d- d" _' T% j
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ' y* d* ^3 g& n1 l6 K* A% {7 W
huliawsl 发表于 2024-5-17 21:12
0 `# C% \3 z# I8 J# S, O, p& H. J相较于此,我还是认为bve格式会更简单
- b/ p# K; u0 b. D
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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