开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 ; \" t, a- w4 O8 {4 b3 t; V0 W' i

* e' y. z7 f- w- Y/ E; @! e
# v' B" s- ]! U0 \/ x8 C6 ~+ f) G最近在研究JS 做了一个简单的逻辑来播放声音- b3 R& g' T' k/ W: p& t
  1. var pit = 1;//初始化音高(速度)
    2 _) a9 W5 Q9 u# A  I* M% f0 \( s
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    5 Q8 s2 M5 f; n; E; g! c$ ]
  3. function create(ctx, state, train) {
    1 u4 G: ?' o1 W, W7 _
  4.     state.number = new Array();6 G9 M: W: L  X' @" l
  5.     state.soundsspeed = 0;//初始化速度
    5 V) K3 S4 Y) `4 M& x! f
  6.     state.speedsub = 0;
      z0 a) `/ V; _$ H  z
  7.     for(let i = 0; i < 100; i++){, F9 p- l* n) _5 x6 v: E0 Y0 D, k
  8.         state.number[i]=0;//初始化数组' d: [  ?. H; Q" u5 S8 {( }" m
  9.     }8 p/ `% ?$ Q3 Z7 Y3 ]$ K
  10. }
    * I: U4 l" j6 |+ H/ _* L0 u
  11. 1 a9 B7 }/ w5 ]7 [8 L) M1 r7 a
  12. function render(ctx, state, train) {
    ! G- w2 w7 |. ?* n. i: O
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    + ]% j+ s+ `' d/ I1 }6 k7 h) T4 ?4 D
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)) n6 d) Q1 s3 \& a
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    7 B; F2 x6 @; l2 [, G! h2 h0 @
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    3 B+ C+ V0 V: ?, }2 y6 f
  17.     ctx.setDebugInfo("speedsub=",state.speedsub). G* C+ j! ~' N1 _. E
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    : |4 b+ E6 K# K/ p
  19.         for (let i = 0; i < train.trainCars(); i++) {
    - {3 Z. b, `7 h' H; B+ ^8 L) X
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启* E8 B% ?& F+ [7 K4 i8 l
  21.             if(state.speedsub<-1){//如果车辆减速6 R( n7 I- g) `& W
  22.                 ctx.setDebugInfo("shache",1);//记录刹车8 T5 a/ N- |" H# o) z0 {
  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
    - n0 U, l* T6 i  |6 d
  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
    % w2 G; ?! F9 u1 f/ {( }
  25.             }else if(state.speedsub>1){//如果车辆加速
    $ v, K1 i& [$ f  m" q( ?
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    % ]& q+ V2 y) n
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    8 S7 U8 \; d: I3 b0 W/ U! \  I3 V
  28.             }* U' g7 L1 ?  ^4 M5 b, m4 z
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    % @$ j8 `8 P1 t8 k% c) Z6 G. ?
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    , E+ B/ Y* f: a9 z/ y6 @
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启3 r6 T  h  B  j3 \! W1 p
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右4 ^! x5 ?, I" O% f; \) k
  33.             }' {0 Z+ z$ P. A4 O
  34.             if(train.speed()*20*3.6>5){
    % T! [/ E' U* q' K# T9 ~( @
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声! b5 |# G! B* M. Z+ a2 G, _
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声% K; h, d# T: z/ g" S- s
  37.             }) A. H* ^- b& ]) o
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){% F% V* [% e; G# K+ i6 S
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声/ }) T) A. s( F+ e( H
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声4 @, U5 j, B) B
  41.             }; Z8 ^) a( m( s2 O/ }% ~  F
  42.         }
    3 h# b7 Z; j, h& l( h- [
  43.     }
      V( N& L. u/ e; g! [0 u9 T
  44.     state.soundsspeed = train.speed();//更新速度! D  [  r$ g9 p- `
  45.     for(let i=0;i<4;i++){/ K# r* A$ S5 {5 d. e4 x5 G: L$ I
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    + e* Z( k2 g8 s! i
  47.     }  `8 ~! A0 c  m3 K7 ~
  48. }: p8 |+ Q$ V8 I8 q1 ]* K9 ^( s
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间7 j' y9 S0 x8 x
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ; ]2 `  P& {2 R* R: g8 c2 l
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放# D* s- E) X" T) s% V  [
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    : f$ e; V: j: D2 m4 [
  53.     }
    - F8 _4 b5 ?0 ~% x" I6 r! s3 w
  54.     return nu;//返回新的播放时间8 }: G' P7 \/ X
  55. }
    ) I$ b$ Q+ J4 B3 d6 @# c" ]" W+ c
  56. function grnn(min, max) {//随机小数2 h# C( F2 T( `& h
  57.     return  Math.random()*(max-min)+min;
    ) T9 R- f: o& ]9 j: a
  58. }- t8 V1 m# r# O5 y3 Y8 N
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的8 t! ?2 H; I2 |5 Q4 B8 M
  60.     // 获取列车从车库开出的距离. _4 Y7 q' a. ?. T# ?: p
  61.     let railProgress = train.railProgress();- D( x' M: _: b; B
  62.     // 获取当前轨道的索引5 J+ K' V, {2 A0 E, f8 B# O" N- ?
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);; H: f( M0 f+ x6 S( X
  64.     // 检查当前轨道索引是否有效
    ) N8 H1 F. D  n$ x
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    9 i) i. q, Y( R/ h% b
  66.         // 获取当前路径数据对象6 N, [- s! ^% e3 J3 ~  E
  67.         let currentPathData = train.path().get(currentRailIndex);5 c' C4 ^7 f. \* s
  68.         // 获取当前轨道使用的自定义轨道名称& \, t8 t# v  |
  69.         let trackModelKey = currentPathData.rail.getModelKey();2 |* b( D: r1 M6 g
  70.         return trackModelKey;
    * x" a: l! F' c! L# q$ N2 C6 J
  71.     }
    - i0 z9 p8 S# N- Y/ _) v1 o* t
  72.     return null; // 或者是一个默认值
    * S8 L* ^# T& M! Q
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
  @* e( T9 [. [3 B2 C! ~7 x3 o
有事加我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/ w2 _! g3 I6 y2 E. u
bve声音要方便一些吧,他有可视化可预览的编辑工具

: Q( R* c0 O/ `8 l: u# i  W% R  M嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 3 Z+ }9 r8 T3 B( _4 O9 n
1 C' x0 Y: i& n  j9 W7 K
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
# G9 z1 u9 C' }4 i$ A" i
huliawsl 发表于 2024-5-17 21:127 g/ k& j* l6 A  C, b. l" G1 b
相较于此,我还是认为bve格式会更简单
+ g- H8 X1 T; @; r  M' P' A
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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