开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
. a8 ]/ u' m! R+ s3 C2 |9 S
, G& a& N' v9 ?7 l/ p
# T/ o+ \# k( b# h, ]) \最近在研究JS 做了一个简单的逻辑来播放声音2 h' }* S% n- v- Y. G& l" o
  1. var pit = 1;//初始化音高(速度)# p" c' Y/ G+ o8 S
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    0 C; @( S+ y! j) a8 U
  3. function create(ctx, state, train) {! O" `! d9 u) {0 |# f) B& ^9 g2 O
  4.     state.number = new Array();
    * e6 H( ]$ T& q( O( ~
  5.     state.soundsspeed = 0;//初始化速度
    * a0 L, M% b7 `* I
  6.     state.speedsub = 0;
    / r; {; D" X* o; y& V$ ~; _* p  H# d
  7.     for(let i = 0; i < 100; i++){
    9 y- k* S+ G) p) R+ g3 I
  8.         state.number[i]=0;//初始化数组* {2 t5 `6 k: ?4 l5 ?
  9.     }
    + k1 r6 {. o  m% R; {( H  S
  10. }
    - g4 ?! s% L: h
  11. # {1 f# y  N! W  V7 X; ~
  12. function render(ctx, state, train) {& m. [2 S$ j# z
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动5 m4 h3 K6 D( v+ e# U
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    6 h: Z+ d  `( b$ @* N
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
      [0 B; P9 z4 g# ?4 B# {5 J9 Q/ |
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差  O% B( s5 c7 g% i# O
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)* p7 P9 |7 J% R3 X4 Z/ L/ N
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作6 o4 C2 b4 Z; O) }3 r
  19.         for (let i = 0; i < train.trainCars(); i++) {
    # d# m6 K: x" }$ T- o( k- X- u& m
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    : m! Q- V" m2 j$ h' ]' _! i3 ?$ o
  21.             if(state.speedsub<-1){//如果车辆减速
    0 R5 G3 v; b3 S
  22.                 ctx.setDebugInfo("shache",1);//记录刹车; }5 _! m% A. b
  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$ U4 t+ ~# \) U. ]$ z
  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
    6 k7 q7 E5 F0 k- R1 e
  25.             }else if(state.speedsub>1){//如果车辆加速, A& i' t; c( E/ f3 ]. f7 h9 a4 c* v
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    0 F5 b  X! ]1 Z
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    5 n8 E3 M5 v' W/ V4 E( y: Z; h
  28.             }
    9 J: T8 _3 B0 `. v
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    + Y# k) w8 `, i$ \4 B& Y
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声. H# y+ r1 |: e/ T! D3 U; w# I
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ! h2 j( t# S6 P9 N9 y0 j2 R  {
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    * c* e5 L; `. M" ?
  33.             }
    / ~# D8 a/ q, f: `8 {1 n
  34.             if(train.speed()*20*3.6>5){
    1 \2 U8 ^" T* h, c* ?) @
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    0 n3 N7 W* x+ P* `
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    & Z3 ~# }% ^. R) _$ j- R
  37.             }
    & n! Q7 r- d' t$ @6 |  o( K
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){* \' E* l/ i* G7 Q0 C
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声; p6 V, m3 A) x6 V5 w
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声" p. r, X% Y; q- y1 j* T# }1 T
  41.             }
    # ]" Y5 c, x: S) F9 V
  42.         }4 Q; Z+ k4 q  |8 {, @: W
  43.     }
    . d3 I* w% q4 [
  44.     state.soundsspeed = train.speed();//更新速度7 p0 E% x! L9 W1 g+ i. _3 o
  45.     for(let i=0;i<4;i++){" a/ E3 ^* B4 r! K4 N
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    , a. G% s' m& c3 h; y
  47.     }
    ( C9 L1 q7 [0 L6 E  O1 A" b" `
  48. }: V- Q7 l8 U& P) \3 `" {
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间! Q& W6 Y2 `7 S7 x8 D
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间1 {$ y# N7 [' _$ G
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! K) g) K: i, s: D4 x7 c8 G+ A
  52.         nu = Timing.elapsed()+long;   //更新播放时间. N3 K! m; h8 a, S+ g5 ?! p6 o
  53.     }
    3 k4 C" |7 n: `% B# Q* s8 Q% t( b, i+ f
  54.     return nu;//返回新的播放时间& ?6 v/ Q, S: u2 v/ N4 T
  55. }
    $ `) \1 c3 v5 z0 v8 F5 k
  56. function grnn(min, max) {//随机小数" }: p* Q" `2 z% M7 |# c
  57.     return  Math.random()*(max-min)+min;) W+ |) {. p( x& h( u; t  s
  58. }
    1 q' ^% r' ?; B
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的1 q& S3 y: u- v& G9 P8 _
  60.     // 获取列车从车库开出的距离( T% p" L5 m$ {% V" O
  61.     let railProgress = train.railProgress();
    / J# v) j' m& S4 p
  62.     // 获取当前轨道的索引
    1 X- ]7 r5 }9 ~7 P, D
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
      u! f3 w7 y9 w  f# Y# g- F
  64.     // 检查当前轨道索引是否有效! R4 ?+ Y, m. _+ h" F
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {, i6 o8 c8 a2 p  q9 Q9 x1 F
  66.         // 获取当前路径数据对象
      d  q+ s" {7 T$ K, A
  67.         let currentPathData = train.path().get(currentRailIndex);
    ( c0 d( Q" P4 b' e- f$ f) z
  68.         // 获取当前轨道使用的自定义轨道名称& H3 A( I# ^  K3 L+ ?0 l# f
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    . J: _, h8 Q4 x& o5 P
  70.         return trackModelKey;& G& ^# k- f+ s, V  x
  71.     }- T5 ~* z6 ?1 N9 d, G: E
  72.     return null; // 或者是一个默认值
    $ @; I: s8 }+ z  k) k. ^
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
" ^! Q. M% X; P% ?0 g
有事加我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# g' N5 g- O5 v' l" t) H
bve声音要方便一些吧,他有可视化可预览的编辑工具
' s2 i2 O- }9 m% R  x
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
2 g, D* @- {( O1 ?3 N
, ^, H, M9 N) _6 h4 m4 E相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ' N1 Q  V- h& I. V9 c* h
huliawsl 发表于 2024-5-17 21:12
. `7 O9 A$ j! N! C相较于此,我还是认为bve格式会更简单
1 q: l) e" B: g! Z. u, ~" E9 r
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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