开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
* p" v$ E. e7 @8 ]( `! A6 M' ?+ g) c+ {; _

$ B# [# Y! h1 |7 C" c8 ~0 w最近在研究JS 做了一个简单的逻辑来播放声音
6 `/ ~* I( \; R  q/ s- I
  1. var pit = 1;//初始化音高(速度)
    . S/ i# N& w$ |# B# b
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]  q4 C$ C. F* `
  3. function create(ctx, state, train) {
    7 l. X5 ?# W+ j! k
  4.     state.number = new Array();* j. |; _1 r. a( F
  5.     state.soundsspeed = 0;//初始化速度$ Z! M, u$ M' m; [) ^+ c- L
  6.     state.speedsub = 0;# F+ h. I( K4 x, {- N
  7.     for(let i = 0; i < 100; i++){
    ( e: |$ b5 s$ i' w
  8.         state.number[i]=0;//初始化数组6 R8 G# ?7 o/ p* c6 f
  9.     }
    ! ~, K2 h1 a2 T; v" _5 P
  10. }
    $ P1 Y' ~0 b# D( V* k: c* ?

  11. * n4 W9 W9 P" I3 S) p
  12. function render(ctx, state, train) {
    , z; H# K( C" n  O8 I3 \( R
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动. V# x4 w& F( a( S. O- L& y- x
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)9 M3 D' y" g5 A2 w' ^* \) }. g7 t
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    * h* z0 S1 w& d; w! x5 W+ _
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
      s2 T4 I0 T& a0 I" U( p0 j
  17.     ctx.setDebugInfo("speedsub=",state.speedsub). p  `$ ]# Z* ]6 f) e% q
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作9 }# G9 N, _% p* W( J& V
  19.         for (let i = 0; i < train.trainCars(); i++) {
    3 [' I  `' M* O& W6 E8 _- o( ^  L
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启3 r0 A5 I8 p# G3 z% O) V; Y
  21.             if(state.speedsub<-1){//如果车辆减速- H! n0 [$ p. j. H) z- r
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    , _- m7 e. x- h3 L
  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
    " ?4 p+ L% n( m' O* m
  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
    $ u% Y8 m# T: {
  25.             }else if(state.speedsub>1){//如果车辆加速" I* Y6 X, m. V. ~' e. Z/ {
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 p, I; Q" I) x# v2 x
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声3 F/ F8 `2 [% ?, k1 r/ H- z, t! }, w
  28.             }
    & u& y, {1 M! C# H! a5 a
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声; s+ R+ k% L4 H9 r& J
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声% G+ \2 @: W' |+ }2 Q! p% W
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启4 a! R- }5 c( |* C5 k' V, ^
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右; l* \9 f9 @0 |
  33.             }
    $ p$ `( ]; u& K" q8 ]* x; r6 K
  34.             if(train.speed()*20*3.6>5){: g2 X. _; k9 W3 ]; u; E
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    , h' J9 K6 N+ `6 A9 O$ a, b
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声! j2 t9 a% J$ @' S3 ~
  37.             }
    8 \7 n2 ?* Y, N* u' F
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){8 s( H/ D3 g  {: ?/ u. |
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    . G" x0 q) k& L( K
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声/ y6 L% t! o4 Y4 i2 k. i
  41.             }
      z- O: u7 ?9 y, r- Z2 C
  42.         }
    . P, q0 `9 R- q( b( k
  43.     }
      J) f7 @9 `7 z3 Y
  44.     state.soundsspeed = train.speed();//更新速度
    % _. J9 I, P' x
  45.     for(let i=0;i<4;i++){' l* Q3 y) l, k1 ?* E8 D
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    5 ]+ @3 j4 Z! k* u
  47.     }& B( v& O4 m# ?- B1 `: |: i
  48. }% t, j& {- ^6 ~& d
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间% s! z! `# k3 e* E/ u
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    9 T/ N+ t, S/ }, Q! V9 m
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ; {$ s( z8 F4 c. Z: b: p
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ' k$ w, o' B' ]7 I
  53.     }; M. p4 l# F" Z9 y0 A6 [
  54.     return nu;//返回新的播放时间1 R$ ^% E- g" \1 s
  55. }2 \3 F+ m0 B( c& b/ _
  56. function grnn(min, max) {//随机小数" Y6 i0 F: F. d
  57.     return  Math.random()*(max-min)+min;, z3 ^3 ?( T4 Z5 d8 b
  58. }' u8 f+ n+ c, d" q' H
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    . e6 k% Q3 S+ k
  60.     // 获取列车从车库开出的距离8 {& T/ T! X/ T
  61.     let railProgress = train.railProgress();
    # X% `- i5 n4 \, u. L2 S
  62.     // 获取当前轨道的索引
    + A5 [( ^" E' D8 K3 y
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);. b, f% }( N4 @5 k/ Y( P2 p: W
  64.     // 检查当前轨道索引是否有效, q( ~9 j# K) F, b
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    # V3 g3 `/ o: E" B0 L
  66.         // 获取当前路径数据对象
    8 k  f7 R, _  Q, o/ Q2 ~. M; v
  67.         let currentPathData = train.path().get(currentRailIndex);
    8 n* Q; N- ?0 n. Z4 ]+ _# a
  68.         // 获取当前轨道使用的自定义轨道名称+ s' I. k  m; @2 D& O
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    9 R& `' [) f  x3 M+ y, f/ S
  70.         return trackModelKey;/ e  w3 k+ m& o  z: }- f& o1 F
  71.     }
    ! o4 S4 }: m# y8 Z: V
  72.     return null; // 或者是一个默认值: v4 S0 l- x. T' U9 X  x/ S
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错1 ^3 f6 y5 H7 }2 j9 C+ P9 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
# ^0 u( [3 |2 Y9 qbve声音要方便一些吧,他有可视化可预览的编辑工具

8 O% J: u2 w4 [* @嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
6 h2 e/ H" V2 G) S9 ~2 B( M1 Z. o
9 W6 M# P( N1 J# F' a) \+ X' ?相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
1 ~) v0 p8 N7 k! Z/ T
huliawsl 发表于 2024-5-17 21:12
9 Y, {3 H' m! u' p1 l" X) p( }0 G- n相较于此,我还是认为bve格式会更简单
" S) \: c7 Z8 a
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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