开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 S1 H" p2 w9 ^4 a1 ?
! h  P6 Y+ R- C: w. @
* O: K/ ~7 T6 \) h5 m2 y最近在研究JS 做了一个简单的逻辑来播放声音1 M  `3 c$ T" [# c
  1. var pit = 1;//初始化音高(速度)3 t& D; \- s( R# z6 T" Y
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    3 m" s# `: p# `  G  r' q
  3. function create(ctx, state, train) {
    4 X, i+ Q2 ^0 y# T5 V- L( m
  4.     state.number = new Array();  y- G3 }" N! ^  U. l( B
  5.     state.soundsspeed = 0;//初始化速度" m6 f* Y+ P) S0 U, I
  6.     state.speedsub = 0;
    ) l3 A! v4 U  ]9 P! \) }
  7.     for(let i = 0; i < 100; i++){
    6 D1 v" A4 m# I% L: Z
  8.         state.number[i]=0;//初始化数组
    7 h1 o- c( E: R/ H
  9.     }; r& ~* N4 v3 G
  10. }* B9 U: C; {/ U# M

  11. 6 w3 ~6 E8 X: o) E  R
  12. function render(ctx, state, train) {' x* ]8 w: E2 l
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动0 W+ ~# I; s& L4 I
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    6 Y; Q6 |! \) C
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    $ r0 B* X/ e% T7 d. X# }
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差& S0 b' u* S* S' ]! \4 r; M4 |" e
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)8 J% Q) p4 R' F8 G3 n
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作1 z8 k' u2 k" @1 r1 r
  19.         for (let i = 0; i < train.trainCars(); i++) {
    # L2 y0 {; C' G0 p4 }) }9 }4 m! U& H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启  R- @* Q0 d1 _6 k% z" r+ l
  21.             if(state.speedsub<-1){//如果车辆减速
    7 L" ^. g# v8 x8 M
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    $ m5 [3 K7 q! j7 A
  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, T8 g! {" I" Q, m' M* k2 b
  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; ~  X& [  @: S' k# o% s! w
  25.             }else if(state.speedsub>1){//如果车辆加速! p6 @- Z# N/ Y/ ^" V# ^: j' k
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速0 b, K: h. K: s8 A
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    1 [0 F+ Y& q9 C9 e
  28.             }$ n% j, G: O* I* b+ _7 ?0 n
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    . [2 W! I6 M8 {# k1 {
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    + p, X# u7 N+ Z" Z- M$ O' V% ^/ q, K
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启! f% A9 g5 t+ H8 V0 s* B7 W  ?  W
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    4 p: D. g9 r8 K! k* c9 o# o. g! K
  33.             }9 s4 }  _1 q, }( }+ o
  34.             if(train.speed()*20*3.6>5){8 n0 H7 A& k4 q/ `+ U" z
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声+ I! E! n2 e9 @; i$ I+ K
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声4 y8 p! J: l* p& n. H
  37.             }% [% z3 z: n  Q9 L/ y1 ~
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){8 H& E; C7 T* K! c; U) h
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声* G5 N0 I7 w% U7 u6 o8 K
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    1 M' S4 s7 L  _, f- ]
  41.             }) \( G* O+ ]7 U5 Y  M0 b( \
  42.         }1 `5 `  N& [3 V8 y9 G" K! G
  43.     }
    9 s  G" D' P3 r3 Z' @) ?- E
  44.     state.soundsspeed = train.speed();//更新速度
    9 J% c# r+ Z* W4 ]
  45.     for(let i=0;i<4;i++){
    ) S" G. x5 {8 \3 d3 Z
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    0 m2 U: F8 \# K: ?  V8 r: `
  47.     }; v. ]7 }- I$ T8 [1 c3 ^1 k/ C6 k' J
  48. }# o, e& I4 f9 o! j% V. c
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    : J# U% f: I; U* O% P
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间! X1 R# C6 [/ [/ U$ ?0 X) J
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! ^2 O3 M; n! Q0 j* S1 @5 q0 @. U
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ; e! c* i) r2 B- @" y6 h
  53.     }( g) u5 D4 M5 {" a& S+ Q6 ]$ s  o
  54.     return nu;//返回新的播放时间
    " p2 U8 C+ V7 n  b! a
  55. }
    ; C- H. F( P0 H9 o9 q
  56. function grnn(min, max) {//随机小数( J( G8 e7 R6 n9 k0 @! C+ U
  57.     return  Math.random()*(max-min)+min;
    4 J# T8 _. `% U3 {: ?: {
  58. }4 N% y# o) g' X
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    $ c( o, t4 ~0 t# b/ o' I
  60.     // 获取列车从车库开出的距离
    4 v- o# u& x7 \4 K
  61.     let railProgress = train.railProgress();
    ' \  F, q3 G; E: u: T
  62.     // 获取当前轨道的索引
    2 g1 o) o, m6 J" o( n( a
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);8 W. ^- p! z$ H* v1 X  m3 @; {* A
  64.     // 检查当前轨道索引是否有效( Q# D; l* e- K2 T
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ) V( u. [9 S9 X/ S; z" q' V" g
  66.         // 获取当前路径数据对象
    ) i$ [! |2 a! B- N9 g
  67.         let currentPathData = train.path().get(currentRailIndex);" ?& z; E/ G6 _
  68.         // 获取当前轨道使用的自定义轨道名称
    & u* \; `& c0 D' A, ^
  69.         let trackModelKey = currentPathData.rail.getModelKey();3 q9 N1 M" m! E8 b0 I! p. N( T4 }
  70.         return trackModelKey;
    0 `/ N1 P4 s* n5 ]  j1 `7 B5 Q
  71.     }
    3 c# }) H/ I5 @' j- w  S) X2 P; N
  72.     return null; // 或者是一个默认值* u+ P* y% _; D3 E
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错0 s/ [( Y& K7 D) R4 p' e8 N
有事加我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
8 m( c6 e4 ?$ T$ d( Hbve声音要方便一些吧,他有可视化可预览的编辑工具

! Q/ F% G) M) n6 [0 M2 T嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
4 f# E8 x# J$ o1 S$ m0 [$ V0 w6 U7 h9 F& r
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
- z& Q, d7 [4 G
huliawsl 发表于 2024-5-17 21:12! t# l* s$ G% c4 y/ A. @8 E# I
相较于此,我还是认为bve格式会更简单

3 h* ?+ u1 q" m$ |' z9 Y🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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