开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
" Y4 ]1 |: A" s
/ q: P! W& B4 ]: w- j& }! A
( O* i3 d+ [. o; D. Z最近在研究JS 做了一个简单的逻辑来播放声音
" }* r; B: ], x1 o
  1. var pit = 1;//初始化音高(速度)
    ' {) D& p: N6 J% f
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]4 Y/ w: W1 [: f8 ]3 N$ r
  3. function create(ctx, state, train) {
    + i: N: l) |* k( K) b8 D7 n
  4.     state.number = new Array();
    # V6 K+ d3 G# ]
  5.     state.soundsspeed = 0;//初始化速度* O9 P1 i" t4 O: Z& k/ D
  6.     state.speedsub = 0;
    ! x' _! N. v$ H1 A( E
  7.     for(let i = 0; i < 100; i++){
    7 J$ u! y, L/ i
  8.         state.number[i]=0;//初始化数组
    $ m8 Z. \3 L/ O% a0 O
  9.     }
    ) f+ ~2 g( ^# U! A8 e
  10. }
    7 B8 d8 Q8 c. O9 M3 A, a7 P
  11. " C. F% b! Y% y' A
  12. function render(ctx, state, train) {
    1 b4 M8 G. F2 [$ t: @: u
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动; b' w, v4 S- U& a, T
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    1 }$ r2 K: n+ G" |
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    1 Z- X- Q- F9 ]
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差/ ^" _. s; `' V  F. u* V- ^6 t
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ; q3 h5 d# @" r) F- [$ v0 C, \
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作2 }" `* S) a; r! `% K" E* h6 x6 F
  19.         for (let i = 0; i < train.trainCars(); i++) {
    / C5 L  Q0 D/ G( R( y7 i; _
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启+ U5 p/ b1 I, K, S: p
  21.             if(state.speedsub<-1){//如果车辆减速
    + p" ], F% n% l% [
  22.                 ctx.setDebugInfo("shache",1);//记录刹车2 T; }+ F; i5 Q2 z2 v
  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
    3 p- G! q: I" f4 ^7 m1 S3 T4 r1 J
  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) E6 S! M) K5 C
  25.             }else if(state.speedsub>1){//如果车辆加速) C% p, f+ I4 `8 z( ]4 e4 f' v' I& \, {
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速" O- C) t1 r/ g0 p. K
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ f+ ~8 l5 i4 u
  28.             }
    $ h- M+ q3 t1 Y+ ^! {+ {
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    # @- A, K3 c4 R( N- d$ a% K8 t7 B
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    : i! }% f, \6 S3 S
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启* j! B$ \8 _3 s1 x! x$ Y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右' F# n" n. \2 C; Q
  33.             }& j0 Q' Q& y" ?/ h& W% G5 ?
  34.             if(train.speed()*20*3.6>5){
      Z7 n/ i8 b$ q. F% I! k% R
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声. u0 V  b0 O4 [% K8 ]
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声( D2 w/ K) K& s- [7 p8 c
  37.             }
    . R+ H" Z# p, ~2 N; x/ \
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    " D6 k: p7 E! W) x
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    # B4 @8 a, F' P5 R
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
      Z* z' X* ?7 `; K
  41.             }  Q$ `% v: V) H5 X/ b! q4 l
  42.         }
    % R* u" ]* g( x7 F
  43.     }  k  O2 C, J# g- B0 n' y
  44.     state.soundsspeed = train.speed();//更新速度8 \2 [8 l' l. G8 h) O
  45.     for(let i=0;i<4;i++){
    * z7 K6 t- X& C0 ]3 \6 S/ v* i
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    + d) U, h9 @* B5 d
  47.     }% U& O1 T1 o( c/ e2 G4 k
  48. }9 `3 j" G4 y6 T9 a0 B) A* r8 v
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间# n; z$ q4 ^8 @" b1 g
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    * C! x: K: f9 [( t
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ( Z# C6 }; m7 R
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    - R0 f, X) ?; K' }# ?* I1 J* @2 t
  53.     }
    7 {0 X! B$ D1 w5 A0 T4 c: }
  54.     return nu;//返回新的播放时间. x4 Q/ ?, S0 ^: x
  55. }. d4 n' A9 k0 o& E* b9 |
  56. function grnn(min, max) {//随机小数% s/ w' G5 ^3 X
  57.     return  Math.random()*(max-min)+min;
    . ~, b2 Y+ S% h5 m; S3 r! j4 g
  58. }
    : e2 G+ K  v1 R( R' I3 v  \
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    5 u5 l  C2 V- i$ F) }/ K. ]: q
  60.     // 获取列车从车库开出的距离
    2 S9 }1 c. e* P1 y9 ]' C
  61.     let railProgress = train.railProgress();
    # D' w, [0 `, |  ^! o
  62.     // 获取当前轨道的索引
    + j2 Z9 O# e, V3 F9 z( s
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);* \4 M( M* b$ `4 @
  64.     // 检查当前轨道索引是否有效4 V, F1 m% S" ?2 }# }% [. _
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ; Z3 ?6 n* k  ^; {3 ?3 e6 K
  66.         // 获取当前路径数据对象
    + B% A, ]  }; K: j* ?* Y, M
  67.         let currentPathData = train.path().get(currentRailIndex);
    7 Y# O6 x+ J3 w; W' S6 C4 n
  68.         // 获取当前轨道使用的自定义轨道名称$ ?% F! z. N/ o! y! x
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    & X" N$ a4 s( `1 h  O3 U; ~* q
  70.         return trackModelKey;
    % Z$ v8 h* Q+ f4 T1 h4 ^
  71.     }
    $ p, _" J7 W. x0 o
  72.     return null; // 或者是一个默认值
    1 m9 x. Y5 X5 G& @
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
! [0 G" e: }; E: 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:046 ?! c3 u1 e9 n8 \7 I
bve声音要方便一些吧,他有可视化可预览的编辑工具

7 F7 h- M. o% J3 N5 O9 e" ?嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
3 r$ u& X( W' A& M1 b4 x/ \  k* j9 ^' r
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 - _9 i1 T9 T0 O4 d* d  Y$ U: Q+ n
huliawsl 发表于 2024-5-17 21:12
( q2 z2 J) ^2 O( C相较于此,我还是认为bve格式会更简单

+ i8 D9 q) Z- ^4 T) \# {9 k9 N🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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