开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 $ n0 x& g2 k+ ~+ A  f4 T" F
2 ~6 ^) o. J# {
2 [4 o/ c- _) @, E
最近在研究JS 做了一个简单的逻辑来播放声音
9 A* X2 P/ ]7 d0 B
  1. var pit = 1;//初始化音高(速度)$ `3 L+ y/ {  K  K1 y
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    8 |5 _6 \- S0 V
  3. function create(ctx, state, train) {: }( n7 l4 F7 `4 g
  4.     state.number = new Array();+ ?2 c' D3 s$ `
  5.     state.soundsspeed = 0;//初始化速度0 d% W" I0 @' N
  6.     state.speedsub = 0;2 f3 ~0 N; V; j, H/ t: D8 z
  7.     for(let i = 0; i < 100; i++){
    8 w. ]/ I, e- J) X. B! D7 Q) _& O
  8.         state.number[i]=0;//初始化数组
    4 x* \" m' j# ]( c/ S
  9.     }
    7 k' p" _  O/ J& C
  10. }
    # s2 e0 _4 p- r2 _# j/ X& }9 Y4 D3 y

  11. ; d" ]4 A6 @3 ~4 @
  12. function render(ctx, state, train) {5 x, G( X1 J$ j; h
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动1 o6 ?/ ?4 W* ?1 S
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    4 K  G4 d% e9 J& [, M
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ( X# {% x8 _& L$ x
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差5 S5 m- M6 x2 @: c' p8 F* W5 a. t
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    . @% o# a/ o8 K1 D1 I& `! |
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作4 E" N; B  n/ S4 h
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ; K" x7 Q$ J" f2 p5 H; G! b; m
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    % X5 {$ k+ W* v, G  i4 ?# m
  21.             if(state.speedsub<-1){//如果车辆减速
    5 F! G  l9 d: f& y$ X4 A) t( F  B
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    3 m" k' u1 P0 w& R
  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' b3 {$ ~& d/ |/ ]1 j7 y! }
  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( n9 {( o* T& q  F6 R7 X
  25.             }else if(state.speedsub>1){//如果车辆加速6 J, e- [- B. E: Z2 Q8 V- U
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速  V, F- q" h) a1 D1 _
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声$ [3 F+ ^0 J5 b' {$ U) h2 D
  28.             }4 S9 V5 m  \: m( a
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    7 ?, C6 _/ A3 r2 i9 y9 c
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声: C/ ^( Y5 w! x/ X3 r
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启! ~' Y  i+ G0 ], W# f
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右3 t- Y$ N7 C, ]! J5 t  X. J3 ?3 L
  33.             }; A3 a0 q# f% J6 Q+ j: n
  34.             if(train.speed()*20*3.6>5){
    * h- ^* ?1 d# D9 J1 r& z1 ^1 c
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    , |/ K# b# W) ?4 y+ d* ?: |/ D
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    . E5 ^, `* w  i# ~& v  v" t8 `
  37.             }
    ; I1 |2 [* h) O/ E4 r3 ^
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){" F4 O& `: Y5 {' M
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声2 p/ P$ B7 s/ {' n" P! N
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ( B/ R1 [2 J) r7 Q7 v( O
  41.             }9 ]$ j4 O0 X. ~* ]0 t
  42.         }' D. R6 b" L0 S  [, Q6 P2 m8 e
  43.     }
    9 R0 C' z2 ]! @% {( D7 t+ R
  44.     state.soundsspeed = train.speed();//更新速度
    6 `+ z' z' j1 b! V( H1 l! a  I6 E
  45.     for(let i=0;i<4;i++){
    8 r  {+ k4 B! x; B/ m2 y
  46.         ctx.setDebugInfo(i+"=",state.number[i]);' K& j7 K1 q- G$ h# `" W
  47.     }
    3 ]  W/ j; B, |  s) J
  48. }
    ( h# }9 l% \3 F' [$ y. \8 J
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    6 C, d, [" J, P! m: ^6 w
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间1 }1 U. F) ]; {1 t* {; t
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    9 S/ p$ N  W0 g* s
  52.         nu = Timing.elapsed()+long;   //更新播放时间  l+ S! O* \$ h% m. q& U+ S! K
  53.     }2 \9 v3 x5 m1 \$ f
  54.     return nu;//返回新的播放时间6 Z' D3 L/ m$ b4 t2 F, [1 z
  55. }
    7 a; S9 X) R! @3 I% z" r, _! h
  56. function grnn(min, max) {//随机小数
    7 h- h5 V& A9 A* |6 }
  57.     return  Math.random()*(max-min)+min;/ N  B) J+ k! [3 C' f  A& j* \
  58. }
    & P; [2 Q  a, [5 \( |6 k* @
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    % A! B: W( m7 \: P
  60.     // 获取列车从车库开出的距离* A& {; F2 @" v+ ~) S5 n+ U
  61.     let railProgress = train.railProgress();' n; L& y( t, h* M- P
  62.     // 获取当前轨道的索引
    : t9 j# ~1 |5 M! \* W+ ~0 o
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    . m% ^2 h. W+ S
  64.     // 检查当前轨道索引是否有效
    ! C5 ?7 E& b+ q/ P& M
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {  w4 \0 Q' P: F0 V) g% i0 |1 I) X; y. t
  66.         // 获取当前路径数据对象0 A+ A0 k$ n: `1 Y/ k) U" d7 J8 O4 Y
  67.         let currentPathData = train.path().get(currentRailIndex);  s: D9 v* L- U$ q
  68.         // 获取当前轨道使用的自定义轨道名称
    ( S' n9 U5 {, v4 h. Q* h- p
  69.         let trackModelKey = currentPathData.rail.getModelKey();% @1 l9 r0 y' G! d0 l& C: V
  70.         return trackModelKey;
      n9 F$ ]/ k! z. L9 R6 B, ?
  71.     }
    ' i( O3 A# i% N' O) _
  72.     return null; // 或者是一个默认值/ B9 o9 @& T5 `- ^
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
2 U9 Z' p$ ~  T
有事加我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 \3 E) E" J' H* s& |bve声音要方便一些吧,他有可视化可预览的编辑工具
* J+ l: Q. A4 v' ]  p7 O0 s. y
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 6 p( t( Z4 {) e! k( w# r" N! @
: f5 T. }( C, l0 v# E
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 $ S" a# v0 y# X% S' s7 {& E
huliawsl 发表于 2024-5-17 21:129 L) N# @7 C) R  W8 ]* S9 ^) a
相较于此,我还是认为bve格式会更简单
) \  V2 y+ A3 z, O
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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