开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
5 Z* g% d+ w8 V# {
; h$ \& Y8 o4 P; V
. C/ H* c' j  o! o( _; u$ q最近在研究JS 做了一个简单的逻辑来播放声音
9 r, U) d0 l& n1 L( W
  1. var pit = 1;//初始化音高(速度)/ t1 w- T/ N4 W- s6 N) Y# S; T
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
      d% P& O2 n4 @1 I4 F6 I
  3. function create(ctx, state, train) {
    7 p, {7 i: Q% E
  4.     state.number = new Array();
    ' i5 y$ l9 n* H1 V; \1 k- }, ~
  5.     state.soundsspeed = 0;//初始化速度
    ( L7 e; ?/ i* i1 w. k  d
  6.     state.speedsub = 0;- R  s# A5 w. q' M
  7.     for(let i = 0; i < 100; i++){
    1 o0 X# U" e4 X' x5 o2 l# I
  8.         state.number[i]=0;//初始化数组
    " m5 h# F% j, w8 m" C$ B
  9.     }# e4 O4 Z! j* j% e  ^
  10. }
    / j0 @8 l& p9 d. O

  11. " J  M5 V3 D/ n" _" _. _: {' l5 X9 e
  12. function render(ctx, state, train) {
    , b" i; c0 o+ r' v! ^7 p
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    / T/ h& i4 P. [6 }3 p2 l+ L
  14.     pit = 1 + train.speed() / 40;//更新音高(速度); `7 j* ^8 b+ ^) S% ^* v, x
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    8 K) m# z; i3 w6 K: n( ~
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    " T; m% R/ C/ Z( M+ J7 a
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)" S! V4 d) m5 F! \
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作7 ~7 O6 z( m# L$ f0 {3 [+ b
  19.         for (let i = 0; i < train.trainCars(); i++) {
    : D, G: P, P* N7 c
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启: C+ G' D2 N: T+ P! ^6 x# l, S2 i1 z
  21.             if(state.speedsub<-1){//如果车辆减速
    & B4 Q5 w( r+ |! p0 X& J
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    9 H( y9 y% D9 U9 w# i; k* `
  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+ Z* E# E5 o$ [  ]7 B+ t8 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
    2 r# d( r! A5 i; p  t
  25.             }else if(state.speedsub>1){//如果车辆加速
    ; X3 S) T* ~) f) I- G! ]. x
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速4 u" G- x: O4 G* `2 P& E% x2 e
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    2 v9 Z! F: T( ~6 n  V4 h3 o
  28.             }
    1 G2 X9 \% r! }- e
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声6 A! h+ {+ F+ H; c: A# t
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    / t- B) i8 o# Z% ^+ B: H$ o9 J. W
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启( k: m& D( M3 y$ r; B
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ' g3 H, T4 ]- p5 R8 n9 C# |
  33.             }8 V/ K5 n. a6 E1 s9 a, O8 o1 G. ^
  34.             if(train.speed()*20*3.6>5){# K$ F1 Y  B. [8 F
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    9 x0 V% m7 J- U* q' |
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声- E& j/ [* f- n; J; c
  37.             }4 N2 d9 R& b" _! [( C
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){: O2 L6 u4 ~8 R6 \
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ; n+ w8 l$ B1 X$ ^& i  n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ' V0 D1 b1 v5 K4 E: V
  41.             }
    3 k: k4 V2 A2 }+ j8 D: D1 Y
  42.         }
    $ |  q# w% M4 e' C2 F: d6 z
  43.     }7 Y+ D- ?* Z4 c
  44.     state.soundsspeed = train.speed();//更新速度
    ! b: }+ F+ z6 S. `2 T7 k
  45.     for(let i=0;i<4;i++){) \2 {7 g& P7 _( k- V
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    - h  S8 U  U- K
  47.     }/ ~: N8 h8 a3 x+ q( u, C
  48. }
    7 ]* \; j# f9 F* ?! m
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间& d# T# T& M6 w
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间6 B! w9 H7 \- s) g
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    * l' O6 s3 K% ?0 u" p8 M8 K
  52.         nu = Timing.elapsed()+long;   //更新播放时间. U( T8 I; Y! b* u
  53.     }
    8 ?! X8 f) A! b$ q- J
  54.     return nu;//返回新的播放时间  w' T4 ~) p$ L! @  W6 y. G
  55. }6 ~& i* {$ D8 p. F- M
  56. function grnn(min, max) {//随机小数
    - i5 D$ _- [) s4 A: B
  57.     return  Math.random()*(max-min)+min;3 w* s  j2 `' ?' a
  58. }
    : d4 r0 R3 P9 E6 i
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的7 l4 [0 P! [8 j& {: P7 b1 k7 e# `. x  b
  60.     // 获取列车从车库开出的距离
    . A# q1 H& `% T7 ^- i
  61.     let railProgress = train.railProgress();7 Z+ e3 B7 ?+ B/ a/ H7 k4 e
  62.     // 获取当前轨道的索引
    + F3 v! h9 y; g  O3 `
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    / q( [% v5 I: \4 V
  64.     // 检查当前轨道索引是否有效- S7 D5 m$ F4 f2 _
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    3 [/ q$ h! k, ?' d$ i& i
  66.         // 获取当前路径数据对象
    5 D1 M5 Y4 c. n; W
  67.         let currentPathData = train.path().get(currentRailIndex);7 k- S9 i- G$ r6 A  R3 A
  68.         // 获取当前轨道使用的自定义轨道名称  w4 x8 Q& y) f: U( E
  69.         let trackModelKey = currentPathData.rail.getModelKey();* P" }- |7 G0 y
  70.         return trackModelKey;
    9 V4 i: G5 \/ c
  71.     }; D! X: J( Y" \, z+ y
  72.     return null; // 或者是一个默认值: W" H8 D* O7 n6 y% ?
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ L5 m1 n2 T. g  ], W  Z' {
有事加我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
) K* v& {" R. [: ?9 f9 g- tbve声音要方便一些吧,他有可视化可预览的编辑工具

+ F. ~0 h5 j8 ~% w嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
" U7 s( t% c  |+ m7 _& A; P  W4 n, _% U2 J: e( K7 x
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 2 V) K" s" D- N4 F. h2 K
huliawsl 发表于 2024-5-17 21:12' ?" y; M% g; `6 O. j
相较于此,我还是认为bve格式会更简单

7 F- O/ @1 G& r! @8 a🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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