开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
: A# }1 V" D4 R; b, N4 A5 b
0 i$ M+ T8 t/ ^, O" `* A8 T9 W& ?$ c" M; L8 R5 h" ~2 i
最近在研究JS 做了一个简单的逻辑来播放声音+ q- M. {1 B+ @% l
  1. var pit = 1;//初始化音高(速度)
    ; x) ], {( `! A" L
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]& w' T  z" @: e  g6 w5 d
  3. function create(ctx, state, train) {" x: P- Y4 R3 o8 D: E- B5 O0 d
  4.     state.number = new Array();
    1 R8 B3 Q# Y; q' y
  5.     state.soundsspeed = 0;//初始化速度2 D1 \* u3 Y3 l0 A9 p( g5 V* H* X
  6.     state.speedsub = 0;4 v( m) o1 t( t5 ]* M
  7.     for(let i = 0; i < 100; i++){; R% H* L! a- }) J
  8.         state.number[i]=0;//初始化数组5 H. _* E9 w  u3 Z+ I
  9.     }  g. N3 c+ j" y. g2 q9 U
  10. }& `) T' G( }( b3 q" \4 Z2 J
  11. ( G7 B8 s/ I; X, S; f# ]5 i
  12. function render(ctx, state, train) {
    3 ?- t2 g2 ]6 S8 t) ~& l$ Y
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    6 p, Z2 [4 [; ]+ r! d
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    / Q8 d- _* ^& W- Z+ s
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    * o  \8 _$ j0 P6 I# C4 J7 p4 t
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    2 w' e( l3 Q$ U$ x
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)6 g! y/ D' m  |8 j# n( b5 l
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作* {4 }8 l1 [/ v/ R
  19.         for (let i = 0; i < train.trainCars(); i++) {6 s" [- }6 T; h" I% O% _7 K6 |' D
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    % R9 K% C% h9 b. r5 E+ f0 r0 G9 R  i. F
  21.             if(state.speedsub<-1){//如果车辆减速$ O' L, d  W" S
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    3 B: z( ]  N4 D6 f. S5 ^7 l* h# `
  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! t2 J6 K7 R3 y5 y
  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
    " a$ D# ?& o' Z  Q9 J+ B3 S
  25.             }else if(state.speedsub>1){//如果车辆加速0 q6 v! V$ T/ ?+ Y- `6 e1 K' p! A& ~
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    1 [! ~+ k4 N! E* I5 l) X
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ q% ~, s' {0 T. R( p
  28.             }
    4 }" @( F' C0 Z$ Q% o
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    6 U, X/ e5 Q6 U5 X+ B
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声% u8 u9 I0 P! j  k) h  }
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ! z6 t) a5 n2 z) Y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右& Q+ u6 L  y( `5 U' B/ S
  33.             }6 t, H5 z5 \: c0 L9 w
  34.             if(train.speed()*20*3.6>5){
    7 O  z* G* Z9 L$ o3 j
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声9 M( h1 i& Z2 ^5 ?
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 ^. ^+ _  W, c- P
  37.             }& V7 a6 @1 y- ^1 b: V
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){& l( k" U& B. H3 @. u+ F
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ; Z( m2 w; M4 ]; d
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声  t0 [3 `! Y4 W+ S/ i3 E
  41.             }9 e, h, K7 Y& N6 _* i. x- V; g3 x" [
  42.         }
    0 g. d2 w; R  b) g4 ?
  43.     }
    3 i+ j0 e) `; T( H
  44.     state.soundsspeed = train.speed();//更新速度! a5 X8 r: ?) S! j3 L- C
  45.     for(let i=0;i<4;i++){5 Y: T! l1 N( L3 r1 j
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ) K' n) [& X7 ?( z9 l. C! z4 e* C9 j
  47.     }6 l& b3 M$ b, N* w' Y7 S9 p+ b% F
  48. }
    $ g' M; P3 r/ {/ [' T
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    $ U2 [5 R$ k) X- D6 |
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    & |- Z' d3 [6 P
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放1 W0 t. J" C! F7 |5 h
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ; ~. o, v" i0 n& N$ H# ]: \
  53.     }; h- m" J9 s; E# i, w( j' K
  54.     return nu;//返回新的播放时间
    . {! X" ~7 W7 w
  55. }
    7 N; m% w8 A( a+ N6 A9 f5 `! w
  56. function grnn(min, max) {//随机小数/ C$ F) F5 ]5 w
  57.     return  Math.random()*(max-min)+min;: P8 |6 i9 I( i
  58. }4 E) T( w( ~" r) U
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    : k1 p' _+ F- w4 M
  60.     // 获取列车从车库开出的距离5 o0 U) T# }, A6 b7 G
  61.     let railProgress = train.railProgress();
    ) b' _' f  W" w& S9 q& i
  62.     // 获取当前轨道的索引! {: M) t9 z& T
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    0 {! Y( v( i, Z1 L  Y7 b
  64.     // 检查当前轨道索引是否有效7 N# }4 m, g0 I/ F& x7 F. m/ T
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {$ x  G. Z: [/ [; r
  66.         // 获取当前路径数据对象
    2 H! j3 R, U9 a5 p0 S
  67.         let currentPathData = train.path().get(currentRailIndex);
    ) r0 a7 v, S- ]8 S6 w! W5 p, R0 |
  68.         // 获取当前轨道使用的自定义轨道名称
    , j: @% w. M: X3 v
  69.         let trackModelKey = currentPathData.rail.getModelKey();# u1 c! ?4 Y: X! s1 ?* B$ g( U6 J7 I# R
  70.         return trackModelKey;
    3 z9 Q' U0 a) j6 Q4 t8 x! [
  71.     }9 o. i. ^$ z& G4 C. d% g
  72.     return null; // 或者是一个默认值6 ?0 H+ T( N" `% r3 T7 x9 d9 f  e
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错* y) X0 q. f% K9 B2 D" `7 M( u
有事加我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
2 k+ w8 T7 C0 ~$ f! O8 o: Kbve声音要方便一些吧,他有可视化可预览的编辑工具

1 R1 V6 U3 ?2 G' p7 N嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
1 b! a; f; k. C/ Y* l
+ B  [$ F8 X6 R* z1 a相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 0 f6 H* i" v" l
huliawsl 发表于 2024-5-17 21:12
6 X# v; y& V5 P  @1 g4 Y& ?( S  y相较于此,我还是认为bve格式会更简单
- b2 G, V3 ~& }9 v( h0 A# h
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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