开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
1 u  C( F- Z( z5 ^1 _. m. Y. \- g  u7 o
6 C9 D# N6 @% U; B/ D
最近在研究JS 做了一个简单的逻辑来播放声音
; O: g2 _1 u+ ?. S* _/ @2 [: F+ g
  1. var pit = 1;//初始化音高(速度): r) J5 H2 W& E  \
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    & g! B% K3 h5 c+ }  |3 q) R: |- A
  3. function create(ctx, state, train) {
    ) T% s* N: P8 Z3 E2 s" C
  4.     state.number = new Array();
    7 F# o2 W6 M  D" x  P! x
  5.     state.soundsspeed = 0;//初始化速度
    : X) P! w$ _) r: ~; W
  6.     state.speedsub = 0;: c4 Z9 G$ b4 h9 p: i4 ]. n, A
  7.     for(let i = 0; i < 100; i++){. @7 p' _0 E. b. x% H1 k4 M
  8.         state.number[i]=0;//初始化数组
    . k- A+ ^0 v$ B( ^
  9.     }5 X' k* \) h0 B$ }0 u
  10. }
    " D3 T/ k. ^) d5 X8 S

  11. # R" s& ^- @, e3 o
  12. function render(ctx, state, train) {8 d$ B8 t% |) t# b2 o
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动6 H6 w) ]" t! y1 B; W0 v. M+ ~
  14.     pit = 1 + train.speed() / 40;//更新音高(速度); D* t' J- l7 h
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    6 r  C) p* u3 I, V7 Z7 T
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差9 S/ F3 s% X, q
  17.     ctx.setDebugInfo("speedsub=",state.speedsub). \. L* V2 \5 O# J& \  i" o4 ?
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    - p8 _$ Z% A9 c6 k' l
  19.         for (let i = 0; i < train.trainCars(); i++) {
    8 g$ w6 `  n: h! q5 b) m. N
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    9 ^7 s5 k* b4 p$ S  Z9 b
  21.             if(state.speedsub<-1){//如果车辆减速; V8 v9 [% N) u  w
  22.                 ctx.setDebugInfo("shache",1);//记录刹车8 l5 q) w  Y2 D
  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
    * n+ I1 \5 A3 v+ I: z0 V8 ?6 h( W# {
  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
    9 r5 p6 j: Y# }6 X; n; Q
  25.             }else if(state.speedsub>1){//如果车辆加速3 J$ L1 g' h+ \# Q+ h7 Q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速, _; F6 O' g/ w: T! P  F6 a
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    , R/ P, t; q9 K2 f* k$ S+ E/ D8 F4 N
  28.             }0 w9 Z9 `$ a) t5 O3 g$ s
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声/ y+ ]$ T% a+ g# D# T  k2 V$ D
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    6 y8 v" }0 o# g3 M3 p7 v
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    3 U# c' t$ J; g' u4 e# u& F
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右: U' Z. ^  ]7 e; Q
  33.             }0 d( ^4 T/ t" F" U1 i, U1 F
  34.             if(train.speed()*20*3.6>5){' y* o( v6 m0 U# j0 y
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声: Z" V5 Q% ]* Q: Q$ p! Z
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 t$ V$ c5 O: O
  37.             }
    - I( A% O$ S& H( e
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    5 w; g4 q, ~1 h7 R  B
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    / F6 I3 Y6 }: P
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声6 P- O5 Y+ g5 O1 e
  41.             }" o9 g& S/ s/ H& S- u0 \5 `
  42.         }/ |. R2 _' }3 ^# K
  43.     }5 I( R0 ?* F) }& Z' S
  44.     state.soundsspeed = train.speed();//更新速度- ~0 ?/ g' E) D
  45.     for(let i=0;i<4;i++){$ D7 r5 A; b" U+ H5 w$ I) e+ W
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    9 E3 K' p. _6 `$ e  a
  47.     }
    , U$ W- L7 W/ P' F$ _* T  U
  48. }
    ; X% b6 B' \# k  C$ v% F7 E6 i
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
      e4 g  h. a0 c! D
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间9 S  C9 A3 ?2 D1 a8 K
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放' \% l( p" ]) s" B+ G' T3 S6 }
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    0 J9 W9 ?( K8 N
  53.     }" \' u9 O: ?0 f  I( s" M
  54.     return nu;//返回新的播放时间5 f- w/ O5 i  R- J
  55. }( |$ b. Z# i( u& L8 _
  56. function grnn(min, max) {//随机小数/ a! R$ [7 k2 F3 j7 \# n8 Y/ ?
  57.     return  Math.random()*(max-min)+min;
    : d' a: D* z3 h+ ]: X  Z9 }2 h
  58. }
    8 ?  E" C  ?1 w9 D
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的9 o( x, o( O8 P# `& N, V" {. Q
  60.     // 获取列车从车库开出的距离5 Z! G! `8 F) c3 f
  61.     let railProgress = train.railProgress();& r+ j9 q0 w3 u7 |# d' e
  62.     // 获取当前轨道的索引! O( H1 W; Y& g& k
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    2 ?% X  a7 E+ j9 m
  64.     // 检查当前轨道索引是否有效' M$ C) H$ o2 f1 m; j$ |. Q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {4 U% f% @( I) x$ B4 E+ m+ A
  66.         // 获取当前路径数据对象
    ; G. x; p9 L9 U- \
  67.         let currentPathData = train.path().get(currentRailIndex);- k; \2 m! x& a+ Q8 J5 ?
  68.         // 获取当前轨道使用的自定义轨道名称
    ! x" U8 V. G% a% T* H: M
  69.         let trackModelKey = currentPathData.rail.getModelKey();4 a- O# n6 \6 ~: x* t/ c
  70.         return trackModelKey;  g* ]3 g8 ]4 S3 u6 K) \' |
  71.     }
    9 e# E+ k0 k8 c5 z+ V
  72.     return null; // 或者是一个默认值1 ]9 g4 v8 \6 [& R
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错# D& [1 j6 Y8 c7 O& `6 p
有事加我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
6 e& e( h/ x& A- Sbve声音要方便一些吧,他有可视化可预览的编辑工具
% |' z! L+ l$ A# P' p% q
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 7 `+ ^& Q/ s9 J

8 j& a/ T8 \. z相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
- v$ z. @( i$ Q/ J3 L4 _
huliawsl 发表于 2024-5-17 21:12+ i+ Z. O4 A6 K+ {. T& B
相较于此,我还是认为bve格式会更简单
7 |: U4 P8 w+ t1 ]! A
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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