开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
  R9 S2 V  _3 h' A
4 J: A* c6 Z7 |2 k& l" \0 T' D* {$ e2 g6 K8 v, x0 E! O& C5 B, j
最近在研究JS 做了一个简单的逻辑来播放声音4 b" l6 y6 g7 M+ z
  1. var pit = 1;//初始化音高(速度)
    ; i) }1 ?9 _# F
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    . ~8 h  E! i4 V
  3. function create(ctx, state, train) {
    2 E+ _, a4 [& a( k6 s4 Y, {* o
  4.     state.number = new Array();8 H! S" |5 l' x% h6 F) E
  5.     state.soundsspeed = 0;//初始化速度
    1 M2 ]# c! T+ k) s
  6.     state.speedsub = 0;
    % Y- c  h( w" k
  7.     for(let i = 0; i < 100; i++){0 T  R* F( z0 D* `3 ~9 \) d5 C
  8.         state.number[i]=0;//初始化数组
    + Y6 O) B# z& }* _
  9.     }  E9 N! U) r: n9 Q; Q+ z6 k- l
  10. }  q1 o- m% q$ k+ F' a" z

  11. . x# ?' Y+ A8 Y$ E2 q4 u, A
  12. function render(ctx, state, train) {
    & p$ ?7 r6 m+ r' [& L
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动) A7 J* u0 K$ |& m: F
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    2 p3 r. [, q% f! q  C& a
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    9 K& Z% n! f  o. p( [
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差8 m# R; r+ R/ o  E, Z* h7 f" ^
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)- _0 x6 w4 Q1 Y) E* _; I1 A$ d! T
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作; v7 {+ s1 x$ r. X! \* W
  19.         for (let i = 0; i < train.trainCars(); i++) {% `9 n) Q! J( @/ j
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    / a% D& V0 O( K) f
  21.             if(state.speedsub<-1){//如果车辆减速, V( m3 B6 @$ S6 x) h" t! G
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : n! X: A) u4 B; I9 }/ p
  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# g1 x" b5 s! b, I' ~( C! e( K
  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* e7 a% i/ l0 j
  25.             }else if(state.speedsub>1){//如果车辆加速- h7 o* W5 R0 U# i- u4 F4 D
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    , |, _6 ~7 ^1 o5 z3 G
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ t6 R# h8 p+ j! w+ P0 b0 z
  28.             }# {3 z# L# ~+ r( n2 o, p3 H! F+ n- M
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声4 P# v1 O3 u: v5 U, t) y
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    8 j0 _- a4 T, i8 I
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    / h9 J+ J8 T/ u. R0 n' o; v( j
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右( L0 R, E9 @% l) ^# ~% j
  33.             }
      S3 r0 X5 d0 W" q9 U7 W$ J. V6 M
  34.             if(train.speed()*20*3.6>5){
    " Z$ Q+ |) G) u1 \, K
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    . ^  }3 y: Z( A; T
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声  W: p" g7 l1 I0 h) J- \
  37.             }
    8 l3 x8 P3 `5 _" |" A: [( D) C
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ' n+ K2 P3 @2 F5 K2 A1 I' U2 X
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    1 R' J) g$ p3 L6 F7 Q/ e& {( S
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    4 e; w' v+ y4 ^  o3 y6 A3 K$ B# B0 J; z
  41.             }
    , v  q% Z' r* f/ d0 q4 g& {. M0 R0 B
  42.         }
    $ q# R( r: w' E( b9 G
  43.     }& a8 z( Q. H, m+ R* J- w: ^. t
  44.     state.soundsspeed = train.speed();//更新速度' F/ Z$ L% T3 A
  45.     for(let i=0;i<4;i++){$ `: \- p8 |4 Z1 Y( `6 {
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    6 u1 h( ^8 O' X! @- I; D
  47.     }
    ! n9 l/ u+ M9 _
  48. }. k$ g: q3 F& o
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间1 r( E7 a5 T' f. F! a
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ; ?' F3 T4 g. ?2 N6 ~+ v  V5 G
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放  H2 Y9 x* W6 D( T
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    / l5 Q" u* y- @( S' O
  53.     }8 c* o9 x9 ]) k$ z; E3 @2 V
  54.     return nu;//返回新的播放时间  t! P" x& a; S4 l. C4 `  B
  55. }: H/ J0 S4 P: Y6 M- H4 X6 e& G
  56. function grnn(min, max) {//随机小数6 ?$ h- z5 x. F# X/ \* @1 \3 z
  57.     return  Math.random()*(max-min)+min;7 M$ P; o, C& g8 g/ R3 v  T7 i
  58. }
    ! t( D5 m, X1 e4 V
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    . x. G1 H4 z* f) \2 d
  60.     // 获取列车从车库开出的距离
    : Y8 \9 @" R0 l2 s+ z" H
  61.     let railProgress = train.railProgress();
    & P5 {: V6 b  J5 A+ s- r
  62.     // 获取当前轨道的索引  M  D9 c: {* ~1 K" {
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);; y5 o2 p& e0 w3 g6 `- G3 H( H/ [
  64.     // 检查当前轨道索引是否有效
    0 b; q3 ~0 ~( J  L( b5 h& i
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {3 {: q& b  e* U  u4 v  Z; h
  66.         // 获取当前路径数据对象
    $ A7 D% k& w" T" i8 ^
  67.         let currentPathData = train.path().get(currentRailIndex);
    : d# c0 R$ ]  m
  68.         // 获取当前轨道使用的自定义轨道名称
    . {5 F" n' d0 L, c, O" F; q
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    0 t( l2 ]/ I. Q2 v. y! Z* E: K
  70.         return trackModelKey;
    ' Q% Y" ?: }. l& ?$ h
  71.     }! }/ I7 O1 d! q- c) d  l
  72.     return null; // 或者是一个默认值
    . x  g* y. Z3 `4 ]1 J
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错4 d  y/ q  m5 v' n3 l& R2 y
有事加我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% W, F8 Y. ]% m! G& l
bve声音要方便一些吧,他有可视化可预览的编辑工具
( I7 r2 q8 H. H5 v" p
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 : e" ?  z3 `. Q1 {! Y& C& F* o
( k( L4 w7 F7 R( |% g. X) z! ^
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ) P+ b) `1 m: U. R' |( S
huliawsl 发表于 2024-5-17 21:12
3 G0 p1 ^) Z) N. W9 Z相较于此,我还是认为bve格式会更简单
; [9 Z- A1 z- d  x
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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