开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
# L# h, `+ u! L$ Y3 {/ x. b
# T) t( k) }. }: A
  X4 B( O- {- j/ |, v) Z最近在研究JS 做了一个简单的逻辑来播放声音7 v# p, ~7 P  p1 R
  1. var pit = 1;//初始化音高(速度)$ y4 B6 n1 J4 {* u0 O! D% Z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]3 Y& B8 g0 y9 i% [# M
  3. function create(ctx, state, train) {
    * C& r. @' `! ~. k
  4.     state.number = new Array();9 W  Z* d; ?4 p& U  T+ _& z( |7 @
  5.     state.soundsspeed = 0;//初始化速度% f- {; H( x1 T+ j& Z
  6.     state.speedsub = 0;+ I1 K' N  f/ `1 F6 ^6 H
  7.     for(let i = 0; i < 100; i++){3 X( l  y9 [; U# y' W
  8.         state.number[i]=0;//初始化数组; _6 n) }$ U8 W: K7 ]$ ^& f
  9.     }& Q) F8 N  A. X/ E* B- q
  10. }
    # v$ H/ T  ]( X* N* ?( r, P

  11. 3 H8 J* v6 P8 l6 F% h" ]
  12. function render(ctx, state, train) {
    ) p. `  U: v5 a& F9 g: ?# k
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    % E* u: R5 u# T- I
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)2 M3 F9 A  j8 ~% x# ~
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    & m7 W) _4 U1 D/ V) M5 L/ b
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差3 H1 n+ t& V: |1 h% S5 s
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    $ l1 X% t" S' J7 O" r5 o7 ?( b
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作2 `% a: `! D3 \4 W; O* z
  19.         for (let i = 0; i < train.trainCars(); i++) {
    $ J: E5 a+ k# A6 A( v( J7 b4 ?# ?
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    4 t. k& d# j  x0 T& t" \# v
  21.             if(state.speedsub<-1){//如果车辆减速
    * w" m3 ]  ~+ l
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    ! m# r8 A$ L" y5 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);//更新返回时间 播放刹车声在转向架14 |- E  T" D! D5 x- r( X' C
  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
    , W4 U7 q. I3 e9 K3 a. }. r
  25.             }else if(state.speedsub>1){//如果车辆加速1 X+ ?9 L2 Q5 {. ~
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    7 B# u5 d. j( v) q- g8 i3 N& S: O
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声4 }* E5 {+ X( Q% b/ S* o. C
  28.             }
    + t) Q7 D' G) M4 U
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ; Z" F! h# d$ r; r( {, \& q, ]
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    5 R; o, J, ]  y" x
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启6 k' A. w/ Z, J4 k* T* d
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    0 c) D8 L. L0 w( k4 b
  33.             }
    ( l4 C- U/ ?) J" G+ h9 ?
  34.             if(train.speed()*20*3.6>5){/ ^+ n' [* X/ }2 q
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声9 B7 [! D1 T5 R. K; N0 b/ `: e
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    9 v* z4 Y* I% x. B/ r
  37.             }
    ) {+ y: A/ ?& g# L  k/ D; N
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){0 `, q8 U( w- @1 H9 I: H  a2 d
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声: N/ A5 B& x8 W  q
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    $ v5 V4 w* k) O) n6 G- h- r; u
  41.             }% ~  G5 z' z7 v* }+ Z  W% L' {# N0 w
  42.         }3 D4 S0 e! A3 W+ C. B" |  u' h/ ~2 z
  43.     }+ l8 q4 ^9 H$ |- e" m: X6 D
  44.     state.soundsspeed = train.speed();//更新速度
    ; x9 a% ]8 [0 i: O% C
  45.     for(let i=0;i<4;i++){
    9 N. x: f% O* v0 V' X
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    / e" R0 \: |6 W8 N5 U5 {
  47.     }
    % Y5 w8 d* d( b% H. i6 q; f
  48. }# w) y) V; L0 L) |4 b+ ^' K
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    # t% A" r& l" o3 e6 Z. p
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    , \3 m5 [# Y* y1 o$ S/ L
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    - E9 D: z# D9 O7 P- c
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    " t' E, ?, D/ a% \* n
  53.     }
    ) g+ S$ B, v# o) C
  54.     return nu;//返回新的播放时间; l+ z5 B/ v! s. a, m
  55. }% {3 }; c0 D) c+ h) @4 [6 W
  56. function grnn(min, max) {//随机小数6 |9 R+ k+ K+ q$ v
  57.     return  Math.random()*(max-min)+min;; ]) q: F3 `0 h8 C- K
  58. }
    ! g6 y9 C4 @$ P, E( e7 |1 f# j
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的2 r, z9 C% t) S9 S; _
  60.     // 获取列车从车库开出的距离# E5 h$ Y. U# g# i4 ~5 Q
  61.     let railProgress = train.railProgress();: |6 v% _  e( ~0 h- G
  62.     // 获取当前轨道的索引, G4 ?  f2 R2 S; ^* `9 N
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);- [1 }+ o; x: p% W
  64.     // 检查当前轨道索引是否有效
    . R+ t# l5 _/ ~7 V, ]8 v% B
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    - c' v) h2 R: o
  66.         // 获取当前路径数据对象
    . L( r* o. P: n/ Y$ E5 o6 O
  67.         let currentPathData = train.path().get(currentRailIndex);
    ; ?2 {, V# M0 M# Q
  68.         // 获取当前轨道使用的自定义轨道名称
    2 h$ [* Z5 D" _$ |4 X) _8 _
  69.         let trackModelKey = currentPathData.rail.getModelKey();
      ?0 ^. ^9 U& {1 y
  70.         return trackModelKey;0 [( I- v- r$ u0 z- Y
  71.     }; e. Z" [( D: E  d
  72.     return null; // 或者是一个默认值
    ! r5 m: z8 K: F# s3 r4 E
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ y5 O% B6 u( Y5 m2 Y3 C/ ]1 @5 g
有事加我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:041 t/ Z6 t# Q1 W: ?# c: @
bve声音要方便一些吧,他有可视化可预览的编辑工具

. z0 l9 Z  K7 e& k& \3 y嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 & f& q: n2 R/ `; n4 w8 W8 `

/ |- g" ^# @; r) H0 Z+ |, |相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
( J) b5 a+ j2 b* s! Z! }+ L
huliawsl 发表于 2024-5-17 21:12$ z/ u3 e9 ~" [7 i  D
相较于此,我还是认为bve格式会更简单

1 A' ^/ O" P$ O# n( H🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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