开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 - [! @$ G  a  I+ U6 s5 D% t) p

5 s# E  m4 F1 t$ y  O9 \3 M  r9 x! e8 i* M% o
最近在研究JS 做了一个简单的逻辑来播放声音
& U0 N, `. A4 B! K% Y* u
  1. var pit = 1;//初始化音高(速度)
    2 ~  r# K! M/ F, _3 X4 z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    : E$ A9 j& t2 m* t: N
  3. function create(ctx, state, train) {! w1 X# p! A  k# }9 R
  4.     state.number = new Array();
    4 U2 T5 `/ ?+ a) R" {3 Z
  5.     state.soundsspeed = 0;//初始化速度% w! E1 y  z- v- H5 o
  6.     state.speedsub = 0;
      q& }! n7 e4 o% ?+ {/ l
  7.     for(let i = 0; i < 100; i++){
    8 z7 }+ _& q. O- p& \9 r
  8.         state.number[i]=0;//初始化数组
    & E* L# N* u) E% \4 g
  9.     }
    1 h" e4 [. @; x$ P% F( d
  10. }
    + B* S' l6 M# @! o

  11.   \7 M, b$ `( p4 W. ~
  12. function render(ctx, state, train) {. g# V+ d2 Z7 U" E6 w( `" q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动' r$ U- ~8 y2 K( K
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    # K8 ?0 b; _# v% \+ \
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    6 u! \" b! }6 q! x+ |" P
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    3 |) [7 s& Z3 _
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)3 O" ?( n4 G6 {2 R9 R. o
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作+ L. |6 @( \# ]% W( L6 O
  19.         for (let i = 0; i < train.trainCars(); i++) {6 B0 D, g' s! H, q7 e5 Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ' K% @1 h/ H  L+ H- U0 }
  21.             if(state.speedsub<-1){//如果车辆减速
    : p' l" D8 n$ V' ^
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    % x  Q5 X0 g0 ~& 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
    ' x& s4 E' I3 @: t8 \# {5 G$ C: s
  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! J  x5 P: N6 b; {5 E
  25.             }else if(state.speedsub>1){//如果车辆加速
    # \, N! {8 k' y2 g" @
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速' z2 o$ f( H  b; f) s' I) Z0 X; h
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    / b+ o9 W9 ?+ H. T$ C* |
  28.             }/ L) N' b4 w! Q
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ) j% K+ l9 q$ m2 u( S, Q
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    * D5 |7 }  i7 C" d! M
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    1 V% J9 n6 R( f, A* X) L
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    7 p: d5 T! ?! N, Q( ]. {0 I1 X- \
  33.             }
    ( U' ^; q- w/ y+ y
  34.             if(train.speed()*20*3.6>5){
    - ]! E3 a/ [. r, o7 T! K' y- D
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声2 B6 o+ A1 {* v2 \' E9 T! a9 Y
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声+ d( Z+ V0 g) R. M. q0 i2 f# j! E
  37.             }
    + r8 I* [. ]3 [% z5 r* G7 ]
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){  l4 g# E) T% z' T3 ?, l
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声$ a% |3 r6 j3 e: n5 v& n0 M
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声) N' e/ n; V: X& O
  41.             }. u( H) s3 e7 Y/ n2 ^4 k% ~- u
  42.         }
    * Q2 \% j; x1 C% u1 f2 P, a
  43.     }
    1 E2 Y5 R; M( X' P
  44.     state.soundsspeed = train.speed();//更新速度
    8 ]6 j; t+ h/ \) w1 w
  45.     for(let i=0;i<4;i++){
    3 i! S; D- o7 w
  46.         ctx.setDebugInfo(i+"=",state.number[i]);1 B0 d8 u/ e: n9 ~, A: u
  47.     }' G+ I6 ], A1 D$ f
  48. }5 k8 r$ d1 _3 o* J. e% e
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间3 t2 c. M" N/ `; P$ [
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ) c" C$ V; D( @4 Z/ \) o
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! d7 U( a# Z2 m: Q
  52.         nu = Timing.elapsed()+long;   //更新播放时间% O0 `+ d4 ]2 [- F2 ]3 Q
  53.     }  ]1 u, Y6 ~% d8 h% s
  54.     return nu;//返回新的播放时间
    ' _! o9 `) x- i8 k- G
  55. }) f2 {4 X& P$ U& w8 w
  56. function grnn(min, max) {//随机小数
    6 W# o$ w. r7 [6 |2 _. R
  57.     return  Math.random()*(max-min)+min;" o3 _2 a4 H7 E% ]
  58. }) B: [! R5 k9 p& G- ^
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ! y& m2 J/ Q7 u( B' m
  60.     // 获取列车从车库开出的距离
    $ h7 W$ T# ~. Y. O9 p2 L( g; H. X
  61.     let railProgress = train.railProgress();
    ; f4 y' z  @3 p8 M! C; ?. G
  62.     // 获取当前轨道的索引7 p9 c2 g( o$ q( g+ k3 s" o
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    : H7 i/ b/ q' W0 m6 z8 m7 X
  64.     // 检查当前轨道索引是否有效
    , [) f3 N! y! V7 c6 ]8 [+ G
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ' r; m+ }7 N! D6 K9 s$ w
  66.         // 获取当前路径数据对象
    2 _( g, H3 Z0 B  k* a; i
  67.         let currentPathData = train.path().get(currentRailIndex);
    ' B& @  ?8 W8 s3 ?
  68.         // 获取当前轨道使用的自定义轨道名称
    , L' s! h) _' S6 _
  69.         let trackModelKey = currentPathData.rail.getModelKey();6 @7 _/ O' i! B3 B
  70.         return trackModelKey;* A0 V6 |' J2 v
  71.     }
    / C( Z" h1 h6 q8 H" \! a
  72.     return null; // 或者是一个默认值7 [& I7 z& I! v2 `8 v' h  x
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错8 I5 K* |+ \; w; `
有事加我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( a' K, u* V7 D/ ~
bve声音要方便一些吧,他有可视化可预览的编辑工具
3 f! v2 H2 O& t- `3 E! v; I
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
" [# C& i* b/ e  z
, R/ [/ ~9 ^" D1 K2 \相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ( h; Z! Z: G6 d$ A2 h; Y8 A# X
huliawsl 发表于 2024-5-17 21:12
3 s( ^' x- k6 J! ^* r5 q相较于此,我还是认为bve格式会更简单

$ O) c! j  a4 Z& C# j1 O  A🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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