开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
) h' r5 U# t# ^2 j8 _* {- |: x. e/ ?$ Z  O1 [: D% n# \: `

$ m# s* f& D4 p2 K: i最近在研究JS 做了一个简单的逻辑来播放声音
9 G+ E8 p/ N( b" ~0 z, p
  1. var pit = 1;//初始化音高(速度)0 b9 a8 w3 `' X* `
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ' h* G' J3 D3 E: N/ U
  3. function create(ctx, state, train) {
    9 z  r) T. B( D
  4.     state.number = new Array();4 l4 n* d1 U7 [. i' g/ k3 t
  5.     state.soundsspeed = 0;//初始化速度9 r* c6 @0 Y; e  P- D
  6.     state.speedsub = 0;( O. R+ d$ y/ L6 d" Q8 u
  7.     for(let i = 0; i < 100; i++){4 ]; q  G8 |' P3 n; `$ I3 m& h$ _8 F
  8.         state.number[i]=0;//初始化数组% i/ o5 \2 K; \" x/ A; n
  9.     }5 X3 y. p: \5 D* @; U/ W8 w: E
  10. }
    ' h( R& k' _+ \' d- I; b  X
  11. 1 Z- q2 J* r8 e' X/ |$ C/ [
  12. function render(ctx, state, train) {3 S2 R$ j% K& E, w3 S+ |. F
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    , `2 e4 [$ L) k4 f3 b
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' o- f6 s, `. g/ m# W
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    & [8 Q1 c3 {' U! q# D
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ' |0 E: u$ t' Z
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    1 L% q, Y7 T7 a+ K; }9 m0 [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作# K5 v4 q5 w( V3 U  J" Y! W2 P7 s3 ?
  19.         for (let i = 0; i < train.trainCars(); i++) {8 Z) I7 @$ g. i3 g
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    5 G4 e6 H  v0 }+ |1 B
  21.             if(state.speedsub<-1){//如果车辆减速2 x4 U# z: m+ j7 a) C! v
  22.                 ctx.setDebugInfo("shache",1);//记录刹车% q4 E& p. X/ Y* V+ g5 g! s: ^5 w
  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
    " L. \9 i9 w; x4 g4 I% ]6 T4 w
  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
    . \) e6 ?9 Y( t  T/ u! k9 W7 W' P
  25.             }else if(state.speedsub>1){//如果车辆加速3 m( [$ l: r5 W8 \2 G  V( E
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    / f6 Z5 h3 ~6 U+ \
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    $ k; M( V$ z* ]1 V& r- x: s
  28.             }
    4 F# |1 f# Q2 H
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    8 r% ~/ C1 x# L: u: s4 [. d* m
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    - S) M+ [2 k$ ^4 U9 H6 x( ~$ b
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    1 o7 q. B7 t2 d3 a
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    . T+ `& l" _/ _0 }2 T7 [0 g& u' J* s
  33.             }
    - o. J( G/ f9 K  g5 |8 H' ^. y6 b4 K
  34.             if(train.speed()*20*3.6>5){) ?6 [9 ]3 W" S: O( h2 r* ^+ z
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    " I  r+ J" d7 e
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声: Y& m* }, s. F& ]8 Y9 }
  37.             }9 f  i3 |* _4 S! j" f
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){& L3 A/ Z% F6 T4 x/ Q) |
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ! V, l5 s: j' O% R  [
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    * h+ Y7 U5 _* q- p8 B; b; \
  41.             }7 ?' q( K* G8 T/ V
  42.         }1 ^; E3 w* \9 n3 h% u& A; a
  43.     }
    7 K" J2 S2 H; g. X0 F# [
  44.     state.soundsspeed = train.speed();//更新速度
    % q* I4 }, l& O6 t# e
  45.     for(let i=0;i<4;i++){# {, a1 I0 `+ m8 H7 s
  46.         ctx.setDebugInfo(i+"=",state.number[i]);% N& G9 R5 w0 ~1 V/ d8 ]
  47.     }' k& ^% w( |" E- x9 L0 C
  48. }, Y( b- f* X) |6 P+ _' M
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ; \  r( {- j: |1 d
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    5 V% w  Z  Z$ M; h, U0 x
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    . l9 [( h6 `! w' H' G" ]: ~7 \
  52.         nu = Timing.elapsed()+long;   //更新播放时间+ c% q* x9 r2 {( H2 z
  53.     }) r0 X3 C  v5 }: a2 I
  54.     return nu;//返回新的播放时间
    4 I, P/ F. |, T5 I+ ^
  55. }! o' e* G9 f) m6 Y# G4 M4 Z. M) ~
  56. function grnn(min, max) {//随机小数- S$ b9 Q! i7 O9 J
  57.     return  Math.random()*(max-min)+min;4 e; _$ Q3 ]* o# s6 O6 O
  58. }
      L8 F- J# e& [+ ~
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ) |' e) b" L% {- h& F! {
  60.     // 获取列车从车库开出的距离
    9 X# R3 d2 p8 Y$ j+ n
  61.     let railProgress = train.railProgress();8 Y0 e. W! j3 q7 l& v' f9 Z
  62.     // 获取当前轨道的索引) Y- Z" G* [' V  w( t- H1 ^' e8 m
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    & ^; C) M; Y/ R$ J' W/ m
  64.     // 检查当前轨道索引是否有效/ o  L, K. [, p+ X
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {- O5 J% D% ]7 Z/ ~  @! h
  66.         // 获取当前路径数据对象
    8 f: ?) M9 \8 p, U, `' G
  67.         let currentPathData = train.path().get(currentRailIndex);
    $ l" ?3 M/ ?" O8 W7 f
  68.         // 获取当前轨道使用的自定义轨道名称6 H4 D3 X/ }; G7 F8 c; m2 _
  69.         let trackModelKey = currentPathData.rail.getModelKey();  X# ^  l+ Q/ J9 H0 j
  70.         return trackModelKey;0 W" d  x& _0 W( v
  71.     }6 _: o' K- `% C( N
  72.     return null; // 或者是一个默认值
    . t! g9 \1 \, R: K
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
- y: P3 ?; p) X
有事加我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; X! b/ P0 O+ J7 m- L
bve声音要方便一些吧,他有可视化可预览的编辑工具
$ v+ n, h; y1 ^7 E
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
$ w1 O. F; ]5 _' b! O6 K8 i7 k! d- u. D! O& ]; E! z
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ; [- {/ K* D/ x
huliawsl 发表于 2024-5-17 21:125 j$ m7 R+ ]7 S5 {
相较于此,我还是认为bve格式会更简单

- Y7 N# o) v+ |7 c! p, Y5 K🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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