开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 5 ^$ h9 z# d. A
5 g) u% d7 h" c7 l% X# N

/ D& N1 c* R( J, P7 J最近在研究JS 做了一个简单的逻辑来播放声音
; P  C1 h# n) K: y) A( u# A
  1. var pit = 1;//初始化音高(速度)( W; i: s- ]  r. r
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    8 V8 |. Z$ l# f# n! w+ Y
  3. function create(ctx, state, train) {
    : Z& C5 g  g# j0 \. E# L$ v* J
  4.     state.number = new Array();' c; R' D5 i! R" H$ G
  5.     state.soundsspeed = 0;//初始化速度
    ! I0 K6 u) F9 v/ B( R
  6.     state.speedsub = 0;
    7 |7 ^; s8 d% k- r4 D
  7.     for(let i = 0; i < 100; i++){
      G1 Z1 H8 K8 M
  8.         state.number[i]=0;//初始化数组
    " |7 ^: \% b) s* `  P& r% t
  9.     }
    0 A5 b3 r, K# ]* j. D* `. T" q% n
  10. }
    5 o. |- K/ C. F0 y, n& J
  11. % Q+ G" L! O( w' B
  12. function render(ctx, state, train) {1 R1 n' ]4 T% T+ Z# b
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动& w7 g, Y9 V6 K
  14.     pit = 1 + train.speed() / 40;//更新音高(速度); U( J2 {4 H- U
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    # ^( b7 t/ Y" ^3 _. h2 s: S
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    / U, s- p4 |) Q
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)& a2 ]0 \) T4 H4 L; [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作# Z6 h0 n# a1 K4 K
  19.         for (let i = 0; i < train.trainCars(); i++) {
    4 I; U4 I& J* M$ z$ m; k- n. |
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启: M/ m& l. |* ^( \% ?" U4 ]& W3 J
  21.             if(state.speedsub<-1){//如果车辆减速9 H7 r! o6 t* t& v4 }. o& M
  22.                 ctx.setDebugInfo("shache",1);//记录刹车# F$ L$ ]5 S0 q. ^" \7 X/ {! |; G. S2 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
    3 n5 ~  _) e, s$ O% y+ Z3 P+ n
  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
    - r3 ~9 @% E3 i, D% X8 ~
  25.             }else if(state.speedsub>1){//如果车辆加速
    , a) e- y( ^1 O1 [0 x" c
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速( t6 {$ Y6 v: a* T2 |5 F
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    $ B  L: G) G% c5 N$ B; i, Q1 L
  28.             }
    % _& P2 q+ M8 U
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声1 d2 _# t6 P/ n' z) R# \
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声/ ?& Q3 e4 @" B7 b
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启* }9 R: }# L4 G' f6 t
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右. s/ _; ^% p) }
  33.             }
    3 q+ B6 L3 V  R( p5 {3 R9 X; [: {
  34.             if(train.speed()*20*3.6>5){
    0 D+ V6 S, Y; O' z* {4 `& D
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声5 j3 `2 B! P  q% N* d
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声- Y8 i  y# E/ q6 Z- \& K
  37.             }
    " C2 [1 n- z' C' j. R) F
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){5 c5 ~! P( Y* E9 D8 _! r; O4 a
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ! J! m1 P5 D5 q0 E) j
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ `2 f3 `3 e% M( ~
  41.             }+ M3 F; ]% j2 b1 v3 }8 i
  42.         }
    5 w  s6 Z+ Q- s& p" l; Z
  43.     }
    0 H- X2 u7 S4 C9 A2 @0 x/ [. s- R
  44.     state.soundsspeed = train.speed();//更新速度3 h2 c% a0 o6 q" L/ C% v
  45.     for(let i=0;i<4;i++){9 ~, S0 f, K  `/ q
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    8 T( C+ k6 ?# v: s) r
  47.     }
    6 Z% q  ]. j) }2 A; y& A8 P
  48. }# [" Q. P0 L- ?7 ]
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    * M3 i6 e- g' h4 q
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间6 S! `! M9 i4 N" ?* Z( ~! |
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    # D5 ]% H/ `& E- [1 C) {1 N( Q
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    , J, l! e  _+ r3 w- A
  53.     }
    ) w, t+ v# w% \2 c
  54.     return nu;//返回新的播放时间& V9 U% F4 G9 W5 G; X0 x% U- [
  55. }$ U% ?# |2 }( ?( j+ \1 Y
  56. function grnn(min, max) {//随机小数7 h& I  ~3 m# L2 t
  57.     return  Math.random()*(max-min)+min;
    ( ]) [& l0 \  f4 O, I
  58. }
    2 u) p- f$ o! _5 s+ Z! ]
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ' Q0 D8 z; I, o/ s: v+ P* u" \
  60.     // 获取列车从车库开出的距离' i* N/ q3 r* j5 W9 M
  61.     let railProgress = train.railProgress();
    $ F/ ?; ?) ]! s" g* n& |4 w
  62.     // 获取当前轨道的索引; z& G  T! C6 K  U  `, S) `
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    + |: l$ Q4 x" [: K' F# i) E9 F
  64.     // 检查当前轨道索引是否有效: o: z' a1 M! h* e; ?% S4 }
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {, c% Z# {# }8 Y$ p# Q0 P
  66.         // 获取当前路径数据对象
      g& D# T2 S: F8 I* H6 I6 U7 D
  67.         let currentPathData = train.path().get(currentRailIndex);) e7 C. w# b. O0 J6 U% }
  68.         // 获取当前轨道使用的自定义轨道名称( c; j' A% W( v" |$ I3 U+ |
  69.         let trackModelKey = currentPathData.rail.getModelKey();9 [: `1 w4 v# W) @4 }# L* p& W7 Q
  70.         return trackModelKey;
    ' D( K6 G- F4 G, R
  71.     }
    " f. ^% O) H& a
  72.     return null; // 或者是一个默认值
      q- P. L2 C* H0 O5 S
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错# Q% s- ^4 i& e, j
有事加我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
6 T8 ]% m& g& |: `bve声音要方便一些吧,他有可视化可预览的编辑工具

, R5 ^% j. T9 @嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 $ K2 V' _; R/ Q" K
& Z: }2 E3 k5 p& T7 t
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
/ d7 i* J6 M. N( F1 N0 W
huliawsl 发表于 2024-5-17 21:12
7 |% E* |3 b( Y2 j& f相较于此,我还是认为bve格式会更简单
( r; B* {) j# F8 Z: f- _. K
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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