开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 7 i# ]! l3 u$ X" L. C
8 }% J8 R( r8 f) v

+ [, Q% L! N& Q. ^; Q0 l% m0 Q最近在研究JS 做了一个简单的逻辑来播放声音
. U4 Q* ^# d6 y' G% ]) C
  1. var pit = 1;//初始化音高(速度)" L1 n0 @9 P* {* o' g/ V* T
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"], k5 H0 Y# j# f' Q3 _) z4 N2 v8 a
  3. function create(ctx, state, train) {
    ' _) Z6 C/ |% c
  4.     state.number = new Array();
    % ^( a) }% u# \0 u8 k
  5.     state.soundsspeed = 0;//初始化速度9 n# P& ^9 `9 B! b. g" u. y- v- e0 F
  6.     state.speedsub = 0;
    ! X2 O7 E8 n3 N& h) z% v; i
  7.     for(let i = 0; i < 100; i++){/ Z) h, E/ P: y* D
  8.         state.number[i]=0;//初始化数组! c% ~$ M$ ?+ Z
  9.     }
    # G" L, j: @7 [/ C0 B
  10. }
    ) g4 {! o8 z/ i- R9 Y: Y9 E. M# u
  11. # n( e) r( l7 j' w1 s
  12. function render(ctx, state, train) {
    4 v! Z1 ^$ K- M
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动; [9 i6 z0 U# {8 i. s6 R! W
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    1 W1 E6 w/ T* w% _* C
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    & c$ j0 Y6 z) n3 q" q8 e
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ' ^7 Z% d1 @- l! e& }/ u8 Z4 i
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)5 s' I; Z% i% Q5 j; {2 L. _
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作9 P# ~6 G- Z4 t' L( d
  19.         for (let i = 0; i < train.trainCars(); i++) {
    * a8 u6 f1 e) e: g* E* H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    3 u6 G1 ^, H7 y$ u% X
  21.             if(state.speedsub<-1){//如果车辆减速2 B+ G9 Q, G) u0 M+ |5 [
  22.                 ctx.setDebugInfo("shache",1);//记录刹车$ g& B0 ?3 D1 ^# B
  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
      R# _# X7 Y5 f, G0 x, k" p
  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( e2 o9 w9 d: H( K2 O7 K) I
  25.             }else if(state.speedsub>1){//如果车辆加速7 F8 G3 }9 b6 a6 I2 }
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    3 o' @6 H- Q* m4 ]! ?
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    0 H$ V" S# M6 T3 R6 C
  28.             }+ Q4 D( N* A3 M( y* l
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    # w4 ]* g! a  \, I+ W# X
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声: o4 |) A& x/ p1 s
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ! O( f7 h! A& K
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右" a6 M4 w- p4 j5 {4 Y! }
  33.             }
    + W# \$ J6 D+ n) @% o; C/ x
  34.             if(train.speed()*20*3.6>5){3 ~" N8 I) R- \" O& {% v! F
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    : t/ N, a' c( V4 w
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声& _: A& q7 B- l* o2 P) a
  37.             }4 b9 D& M- {! M/ L7 J% u
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){% c, W+ D+ j9 q8 t- _# U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声4 _& Y9 b3 G$ d+ s
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声% m0 q2 V* O0 U- i0 A, i& L
  41.             }
    + `5 `0 D8 p" y* K
  42.         }
    8 Y1 I% c; j5 P/ D2 ]' ?( c' i
  43.     }. @6 D$ Q' ~8 |; B7 N/ [7 \* p
  44.     state.soundsspeed = train.speed();//更新速度
    6 }" i( R& }2 U7 E
  45.     for(let i=0;i<4;i++){
    8 v) ~' I4 X1 P% {& d( ]) k
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    & E% T( R5 S* H4 ~/ d
  47.     }* t$ G2 o! ~9 X
  48. }
    , A1 W) J% O+ K& o/ A  `  J
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    : Z" U/ }0 T2 D0 a
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间* a3 j+ ^$ a# y5 A) b* r, A
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放$ J3 ~( h3 K' N: u
  52.         nu = Timing.elapsed()+long;   //更新播放时间1 a9 }4 i! c) Y8 m
  53.     }
    - B/ O' N& l3 h1 b+ h6 ?# Q% Z$ O9 a
  54.     return nu;//返回新的播放时间; z2 }' ]2 S0 b: _! V
  55. }. ~! }3 P( {2 b* V- K: w3 y" O1 R
  56. function grnn(min, max) {//随机小数# [% i( g0 Y  T2 p& \) s
  57.     return  Math.random()*(max-min)+min;
    ( w* V* n" ~7 n1 I1 \
  58. }
    7 A% \8 [+ p9 C6 w+ D
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的: N1 g/ u/ G7 K9 M1 P
  60.     // 获取列车从车库开出的距离& V* a1 U1 h, x. L$ J: c/ W1 C9 P
  61.     let railProgress = train.railProgress();
    . h$ H) H3 s9 T6 P2 F: j
  62.     // 获取当前轨道的索引2 A7 J% \) F$ [* e3 P
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);4 ~8 r* H1 J' c, ?4 a; U
  64.     // 检查当前轨道索引是否有效/ {$ ]' G$ F0 n, F# S8 ]
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    5 e4 r+ R& `7 ]! U
  66.         // 获取当前路径数据对象
    7 D  r  I) A, Z/ o! h0 [
  67.         let currentPathData = train.path().get(currentRailIndex);
    ) z, y6 T* E% ~$ ]. ~" ]. z
  68.         // 获取当前轨道使用的自定义轨道名称2 W/ N* q3 W9 H! R9 {! W
  69.         let trackModelKey = currentPathData.rail.getModelKey();5 E% W7 j7 g% |- _3 u
  70.         return trackModelKey;& E. J9 ^$ M" q* p* {/ w1 x
  71.     }1 a5 }& T% `, s2 U1 B% b
  72.     return null; // 或者是一个默认值
    . f* s+ P2 ]8 M9 l" i; n
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
) @) B8 T8 ]: d  q
有事加我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
  t) l! M0 o# {9 T9 Ybve声音要方便一些吧,他有可视化可预览的编辑工具
0 [! z; Q8 ^* _- k
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 # i5 K, L; k  }' N7 k

1 @$ c6 t4 A- {* o+ M( [. C  t相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
# s9 s( W8 v3 T# q! }! G3 i
huliawsl 发表于 2024-5-17 21:129 q5 c2 E) ]5 }
相较于此,我还是认为bve格式会更简单

, [: T" b: P/ H5 w, J4 x7 v🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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