开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
9 Y' w- X+ j% M6 i: [4 q0 ^! K' F
3 f8 {- a  m! o6 K' h7 ]7 Z  {  r) a  Z% H; g/ g6 V% f
最近在研究JS 做了一个简单的逻辑来播放声音% N1 c+ d" X& j: R9 I' G
  1. var pit = 1;//初始化音高(速度)6 Y" B. x& J% p& `) `/ T( l7 E; m
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]. H. v# a+ P5 L2 e- ]
  3. function create(ctx, state, train) {
    8 ~' y) v9 o0 A: O6 B! f
  4.     state.number = new Array();
    . z! ^, M8 U$ A8 C9 T# {! z9 E  F
  5.     state.soundsspeed = 0;//初始化速度
      M- x8 b, ^& X- p9 M* \
  6.     state.speedsub = 0;
    ' g& [  _2 ]4 G% V% u
  7.     for(let i = 0; i < 100; i++){
    4 v$ K# `& J$ ~9 \- b
  8.         state.number[i]=0;//初始化数组
    0 o1 I/ |$ s7 h! `
  9.     }
    0 M2 `% J2 ]9 T- o- G) B% W$ ^* C( U
  10. }
    4 ?9 i0 k* Q1 M; @9 K

  11. ! L. q/ L5 p  S8 W7 k; l
  12. function render(ctx, state, train) {
    # M7 L; ?" `1 T0 a
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动" Z4 W9 i. c" m8 `# v, B2 l2 B2 J
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    3 S( X  p; j! S! l  I1 q
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ! @, e& e; l$ Y& @
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差: N! t( O/ E% y+ }6 F
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    6 u, W8 q; F& j: K  \4 ^. r
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作* ?! O0 ]3 D( W
  19.         for (let i = 0; i < train.trainCars(); i++) {% \+ o  {6 f  G: A% ^
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ! V( C' N! `  ?. I4 @
  21.             if(state.speedsub<-1){//如果车辆减速0 d: `0 K+ H, S: ~! [6 B# a
  22.                 ctx.setDebugInfo("shache",1);//记录刹车& f' b. j; O$ S) S
  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
    " Q; H$ I4 f7 g0 s+ 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
    & ?) M3 s8 Z' `& d) F4 p+ X3 Q# z
  25.             }else if(state.speedsub>1){//如果车辆加速& K0 i, N# {5 i% |! c
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速) F6 w2 `6 k' N. e) h) b
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声$ r9 |/ l9 z( ?. k% F$ R/ {
  28.             }- E1 A3 f: i* D7 ?& B3 f/ _8 _
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声4 z. d& V7 b) ^" {1 [7 K' _
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声8 I, m- [- S) g  e$ ]4 g$ T
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
      ~; r' v  Q8 B5 J
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ) I, g8 D5 @5 M0 v+ g: u
  33.             }7 Q0 c# _1 z) U2 Z  t5 C! n  J
  34.             if(train.speed()*20*3.6>5){% s# s6 a3 ~( q6 M2 s( A7 z
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声/ F0 I3 X+ Y5 ?4 |! d$ y
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ( Q8 h0 K3 e( i! J" ~' s
  37.             }/ P3 L' V% m% h* |  @* j: B$ G
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
      T/ n) n$ s$ `
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声3 b4 P$ u( B1 P. v) u
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ' u. V9 h; \- H% ~) p
  41.             }
    8 v/ v: x( e" N- c) j$ q
  42.         }  U# s# u, u! m$ t
  43.     }
    0 h; l5 `: R2 c
  44.     state.soundsspeed = train.speed();//更新速度" J+ x+ M" V" q4 `8 B1 h
  45.     for(let i=0;i<4;i++){
    ' K; {3 Y7 H! ^& \
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    % {) D- \0 b! a3 \* Y6 k$ z
  47.     }
    " z7 Y2 S& C% j6 ?4 P! k
  48. }! D" ~9 p9 {) ~4 |* ~9 |  U( a: ~3 [% s
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    : W6 I5 R4 p* Y* m. W$ I
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间2 e# {9 u1 U; o" B
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放8 A& P, p9 ^1 U, w% t/ k* l
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    - }* |0 x8 ^7 G; Z! T
  53.     }1 s( D7 p* S" w% d7 E7 w
  54.     return nu;//返回新的播放时间/ G/ x9 Q2 Q2 s5 Q! @4 S; A: }
  55. }
    1 P6 x! Z9 j7 P5 v, E! x3 D
  56. function grnn(min, max) {//随机小数
    1 r" y5 W" {6 P9 ]* B7 s
  57.     return  Math.random()*(max-min)+min;! m8 ~6 [4 j. D9 t& X+ E
  58. }6 [: t! U) i0 V& J3 j( l% r# d$ @4 C' j
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    % `* ^" h2 @3 k! t" d7 X
  60.     // 获取列车从车库开出的距离7 c; F% e8 Q% ~5 X+ [3 ]" r6 J
  61.     let railProgress = train.railProgress();
    5 C' w3 m  w# n/ E; ~" h
  62.     // 获取当前轨道的索引
    # Q+ [" g# y* c7 `% n6 m" e5 d
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);" a/ q* c4 [( k+ ^" K
  64.     // 检查当前轨道索引是否有效0 J, d! A" |0 @& J# d
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    5 m4 @* g' v2 t  C4 r/ B$ B
  66.         // 获取当前路径数据对象
      y1 H. y9 `/ l. h7 M7 \
  67.         let currentPathData = train.path().get(currentRailIndex);- C* q3 h# j" @  B* V
  68.         // 获取当前轨道使用的自定义轨道名称# [0 R/ r* q; \0 Q) W$ V4 i
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    & J$ c- w$ f4 U; H/ [
  70.         return trackModelKey;7 K% O, Z( L/ F+ T" S, T- N! b/ b1 B
  71.     }9 C$ h2 E& _3 C9 P- c8 t; W
  72.     return null; // 或者是一个默认值0 I$ }7 ]9 H& C4 ]0 C
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错6 O+ y  U+ D/ ^1 f4 A" a& ]
有事加我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
/ s. M* f8 x0 X/ w( Nbve声音要方便一些吧,他有可视化可预览的编辑工具
- X+ k/ z7 i' P& g5 y& v# r! r
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ( o: }* G2 c! O; U  w. ]& k- ]; _

: @# O8 M+ l8 l2 d' j; p) x2 o相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 # p" \" [# `0 G* b  D7 l% `2 i( _
huliawsl 发表于 2024-5-17 21:12
3 X$ z* f1 G/ X2 N/ [1 N4 L相较于此,我还是认为bve格式会更简单
" a( Z3 i0 U: R5 X: E4 \1 P1 i
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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