开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 % H1 f7 s0 @5 {- R9 X0 G

7 z; X* p; A3 M) a* E2 K$ [) B+ \5 U8 e( z2 |2 {1 ^
最近在研究JS 做了一个简单的逻辑来播放声音
, |+ p3 U! }1 Y7 D& a
  1. var pit = 1;//初始化音高(速度)* r1 s8 d% {* f, k
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    / Y( ^2 P3 h) o/ N5 }
  3. function create(ctx, state, train) {) O" _8 d1 ]5 [, Q
  4.     state.number = new Array();
    / w8 W. w5 o& f7 |
  5.     state.soundsspeed = 0;//初始化速度# Z! x  Z7 k: _# U& Z' z/ h
  6.     state.speedsub = 0;/ M1 j& H1 |0 k" H
  7.     for(let i = 0; i < 100; i++){. o) R+ ?* H8 n8 n
  8.         state.number[i]=0;//初始化数组. W! X$ Q1 F+ y5 \
  9.     }
    8 R% B5 v' q  M* y% V
  10. }  v4 b9 Q" J; q$ \& z- u5 T
  11. ( W+ F* `3 s0 Z8 G3 b+ G
  12. function render(ctx, state, train) {
    / V+ \5 Q( {# _0 e; }
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动) |3 `7 D- s3 d% U& W$ w5 K
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    6 f, g1 t$ u5 K3 @0 |
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    0 }$ Q$ {) t5 W7 x, a  V( [
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差& A$ d4 |4 l  u) X& ?
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)* b8 ]0 M' w7 J# N" ~4 m
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    2 b8 ^5 i# M6 s8 f5 x4 ]
  19.         for (let i = 0; i < train.trainCars(); i++) {
    : e) D0 v! V6 N1 ~7 S
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    % L' e2 |6 P" @9 s
  21.             if(state.speedsub<-1){//如果车辆减速5 |$ a1 ]! r& x7 s5 `5 \0 v! E
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    , {+ i: f$ k1 H) u' @
  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
    2 c5 M& t& A2 E! V- L8 ?
  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
    & p8 }+ r$ d3 F7 z6 `5 p
  25.             }else if(state.speedsub>1){//如果车辆加速
    7 o1 [8 z% h; D/ ?& f- x) y+ o
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速/ [% d4 f- F6 c4 U
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    6 `9 Q7 w1 F. R
  28.             }7 S1 a+ t/ |: g: K7 N$ ]5 n" G
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声5 W, t5 a, [) I' A  }4 J
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声0 S/ |2 x' d0 l+ ?' i% D
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启9 n9 f; V! w! o; e+ N
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    - J1 E, a/ ~( w8 m' M
  33.             }# u4 y0 t6 q* I1 S
  34.             if(train.speed()*20*3.6>5){% v7 u$ `  f6 [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ; g/ q1 Y& s" t4 Z5 g- a* a6 x- `
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    5 O3 t+ w, F7 P$ C% Q) w- K: o
  37.             }5 H' X0 A. p! n* v( t
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    0 [' q) ?# w7 E( l: g
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声9 t3 r  S0 ^* P* `' {( s/ b2 D
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声" t3 N1 `$ l0 F/ i
  41.             }3 @, u; _" b9 \+ \1 g1 @  y9 i
  42.         }* r2 ?% m& |" W/ X. o
  43.     }
    4 B, p" t7 n9 F- ^/ G& [
  44.     state.soundsspeed = train.speed();//更新速度
    ) K2 ^6 e/ d9 v( n  `' X
  45.     for(let i=0;i<4;i++){
    9 k4 p& r3 `- U' i# W" k* `& w' u
  46.         ctx.setDebugInfo(i+"=",state.number[i]);  l; d2 x; }; ^2 Q2 r8 l3 v
  47.     }1 ^3 o# B, [) _" r( ]# P2 W
  48. }+ I: n) B3 D) q4 c0 M. k/ `5 Q
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    + g, t  n+ P! b' V$ C# |  B
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间3 z% T- q, R( A) ]5 S0 O
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放' m) U7 @+ c1 v$ o
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    . l! m# {( V' P- K' f: A( x
  53.     }% ^  |$ N4 h/ G. R2 D
  54.     return nu;//返回新的播放时间  J' d  O* i3 S* x" R1 ^. K" o
  55. }
    # b( L; z6 \  R' N9 B  _/ E
  56. function grnn(min, max) {//随机小数# L- |0 B9 n$ b' G$ q
  57.     return  Math.random()*(max-min)+min;
      ~( j2 g  G6 @2 s2 E& s: y( K
  58. }
    2 I/ E3 C- c: S% ~
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的4 q! M" _' u6 C, h* m" ?
  60.     // 获取列车从车库开出的距离
    1 o2 @4 q! D3 K% n) [/ |- E
  61.     let railProgress = train.railProgress();
    5 O6 m4 k4 A8 X1 R% U: N
  62.     // 获取当前轨道的索引
    8 s( ^: R% Q) a+ z4 B  F
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 F+ }2 ?8 h* @- ^; }8 y; `0 |
  64.     // 检查当前轨道索引是否有效
    8 z/ C* I  R* a4 a
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    " L3 j5 E' M$ I5 Y! ?% P$ U9 K
  66.         // 获取当前路径数据对象
      Y$ I* Q, I7 _( e* Q! x
  67.         let currentPathData = train.path().get(currentRailIndex);
    + A' w( \7 v8 t1 T9 s9 o  |- q
  68.         // 获取当前轨道使用的自定义轨道名称( g6 D& k5 F6 V% s! Q
  69.         let trackModelKey = currentPathData.rail.getModelKey();5 `, j# j% }& L2 N
  70.         return trackModelKey;6 U6 V" u5 j1 D' e! T
  71.     }9 o5 {: r: j$ L8 V- r- m& y
  72.     return null; // 或者是一个默认值
    8 s% n) N; q( {; [+ @9 f1 {
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
  S7 l0 n$ }$ y, U" L
有事加我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:044 Z% R( c) v8 Q1 L$ ^9 h+ G
bve声音要方便一些吧,他有可视化可预览的编辑工具
/ ~  m  v  Z  V
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
2 G2 w6 B9 Z* J% n0 B1 c+ N. k$ m
% O/ k2 s+ T4 I' h; ~0 v相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 5 t+ R: a7 W& ], L* [% a
huliawsl 发表于 2024-5-17 21:12
; Y! |+ u" n$ \0 v& X1 G相较于此,我还是认为bve格式会更简单
7 W# P7 \5 ~$ w1 `. v; E5 x
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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