开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
( ~( e7 M8 T" n8 R2 l$ G# a+ Y$ E$ U/ b3 j

& t2 `0 [# C) n3 m% ^# b  ?最近在研究JS 做了一个简单的逻辑来播放声音5 X, a( ]: s+ M' [' B* b' l  s
  1. var pit = 1;//初始化音高(速度)
    4 w  @' ~+ U2 A: G3 N1 N7 z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]; P' _1 Z9 S5 Z% s+ D: q" F& O
  3. function create(ctx, state, train) {8 h( z0 \9 k6 e9 x/ X
  4.     state.number = new Array();/ i$ b% f3 {- O! m9 D
  5.     state.soundsspeed = 0;//初始化速度
    ( u, q+ o. K) f$ h/ {1 w  ~' z
  6.     state.speedsub = 0;
    . j. t8 H* X- ~$ A- h5 B
  7.     for(let i = 0; i < 100; i++){
    8 L3 p2 @* r8 p1 }
  8.         state.number[i]=0;//初始化数组& ?! X5 m# ?4 p
  9.     }$ ?1 m! _7 y; y3 ?1 ~# a1 Q: @' C
  10. }
    . b7 A3 S) X% f' k+ n
  11. ; j- H0 r. }: K% V" j5 ]
  12. function render(ctx, state, train) {
    % W- x: N- Q! K( F0 i6 p8 U2 f% L
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动1 j& ^( f$ @- }" L4 H3 g8 [
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)7 c$ K; V; Z1 c" h0 H
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    7 b$ Q$ [% c0 e3 a/ @' k7 H
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    - X5 q4 P$ i0 U
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    $ U4 Q: u5 q3 O! @; [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作& Z/ H' e3 l9 M4 \  j" a
  19.         for (let i = 0; i < train.trainCars(); i++) {& U3 y+ }9 n6 ~- `
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    5 b2 `; E& e+ q0 p9 d
  21.             if(state.speedsub<-1){//如果车辆减速
    # d$ a' M2 z# K9 u8 w; M* I+ [
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    4 c4 d- T! q/ T# \7 A# p
  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; E# C, K& x  J- v# q
  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: y) p7 a3 T3 ?; Y
  25.             }else if(state.speedsub>1){//如果车辆加速
    ' |$ e. J' K- V3 a8 v
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    4 Q" ]: B& i" B% ~! X" z2 C
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    8 j: U, {0 T6 F  L: Y" O" N, X
  28.             }2 ^  f6 V$ V0 `
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声& s! Y( m- A- E
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    . K& n/ R, N+ y0 G" |
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启+ Z" ^" U; X" M& N  f6 g
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右, p# L4 A) A: U: C& p
  33.             }
    * p, _0 O, g4 ?
  34.             if(train.speed()*20*3.6>5){
    7 O) f. F% L6 }! `: J
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ) V" ]: n! @! M: O! I6 g/ t
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声# ?2 N7 x: l( C1 V
  37.             }
    4 f7 C, j1 ~( Q: e: M7 C6 V# Y
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    3 U/ u( X# `$ n1 t
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ; t1 [5 O6 f5 \$ b3 w
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    * k% {+ ^: H2 A5 l  C
  41.             }$ f' K  |- Q3 U7 H1 m
  42.         }$ `; \& ^& \0 C: q+ I8 k
  43.     }' ^8 V& }% Q2 s
  44.     state.soundsspeed = train.speed();//更新速度
    ! l' b: t3 ?* A
  45.     for(let i=0;i<4;i++){. w8 Z& R. |( q0 z5 K) d" \
  46.         ctx.setDebugInfo(i+"=",state.number[i]);% @. Q( ]- f) l5 Y% j* J  s
  47.     }! ~) q0 d5 Q0 V; b( ^3 `& v* }
  48. }  s7 i9 J2 A0 b1 a: i+ c
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ' T7 @0 F8 O# t3 R
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 k9 f  q1 a- E
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
      ^. @$ B7 B5 u* u
  52.         nu = Timing.elapsed()+long;   //更新播放时间+ H" k" j% x5 y, C: V( \# z  a$ f
  53.     }
    ! f, B8 k6 q! o& r& u( N
  54.     return nu;//返回新的播放时间( |9 h# Z% F3 C  a
  55. }
    ! K0 i, W8 X- v; }, h" s' I
  56. function grnn(min, max) {//随机小数
    1 j& Y$ o- q5 N5 V
  57.     return  Math.random()*(max-min)+min;
    . F8 N0 q8 X( y8 z* k
  58. }
    $ P5 H# Y: g7 S8 i7 e
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ; ^7 c2 t+ |/ U! |
  60.     // 获取列车从车库开出的距离2 J8 D2 h( Y# n. D) y. x
  61.     let railProgress = train.railProgress();+ x' X* u' V& Q; u9 T: b
  62.     // 获取当前轨道的索引' x" c; c0 t& S' Q$ Z  v* G3 U
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);! n) u) f: U. ?! j! ?# g0 g6 P, V
  64.     // 检查当前轨道索引是否有效  O1 e* C4 K) s( p  C! O" ^
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {; n& ?" r+ |( K5 }
  66.         // 获取当前路径数据对象! o, j2 d) O- {; G2 ]6 E3 |
  67.         let currentPathData = train.path().get(currentRailIndex);
    $ @$ ~8 E- @$ ?, |8 ^
  68.         // 获取当前轨道使用的自定义轨道名称
    . Y( F3 u$ I- J  U
  69.         let trackModelKey = currentPathData.rail.getModelKey();7 G" N# e$ d1 ~2 D6 q
  70.         return trackModelKey;9 e6 T, N' a' n1 \. e3 c6 H" K* b/ r
  71.     }% M" s& V# Q6 _9 K, l' Z- b; c- N
  72.     return null; // 或者是一个默认值, _- {) Y% G4 I( k) Z$ C$ Z# P- q
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ ?( _8 m. b" C
有事加我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$ W% v/ R# n/ V  H/ b
bve声音要方便一些吧,他有可视化可预览的编辑工具
& Q- g6 {6 p& d8 C- J3 l
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 & c. j& ~! D7 J0 t$ D
/ \8 o0 W0 B4 f6 Y
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
1 x6 t1 g( m. \! w' s3 F3 L
huliawsl 发表于 2024-5-17 21:12
: O' S9 ?1 `9 i& E/ P相较于此,我还是认为bve格式会更简单

. r: o! N& F; [- c, Y2 ?+ t8 Q🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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