开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
/ ~0 K; n3 C+ b$ |% T/ i& o3 R, ^5 F, V

; o7 a! }1 |8 g最近在研究JS 做了一个简单的逻辑来播放声音, x& T; [4 t6 Y, r8 U
  1. var pit = 1;//初始化音高(速度)6 l: L" r) m% z% }4 ~
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]+ k! b% I: d. }' R
  3. function create(ctx, state, train) {2 B5 e# Z1 I1 {4 a
  4.     state.number = new Array();
    5 X7 v0 V$ K/ F! H( X" `
  5.     state.soundsspeed = 0;//初始化速度' M6 T  R7 u& C  p3 W9 M- P  \% \8 Q7 ]
  6.     state.speedsub = 0;
    * B0 i2 y3 B. @' E$ t& q* B
  7.     for(let i = 0; i < 100; i++){
    ! T+ F" Z9 A/ P$ _4 I5 M) O
  8.         state.number[i]=0;//初始化数组1 Q; W6 O6 n) t6 H3 l
  9.     }
    & u' j, l8 P0 G
  10. }
    " ]1 S8 U9 a7 u; s1 p5 G* j

  11. 2 y" [* F3 j: M% M  [  N4 f
  12. function render(ctx, state, train) {
    7 v* t' J: I9 h& O8 ?5 h1 n5 H! f
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    . v8 a3 O8 P$ i) }
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ( [+ V' c* A' _: q
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    % S2 w7 q/ p4 S( C2 J6 B+ x
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差8 N3 |, z6 P4 ^1 z4 z# K: h1 h# X
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)7 a  @6 P# C; ~- |  G7 n9 l8 r
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    ) _; @, T5 k) Z
  19.         for (let i = 0; i < train.trainCars(); i++) {0 C% R7 _  I) O' _" v
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ! V+ @! v* g" E2 ]" M* {$ p9 I! I
  21.             if(state.speedsub<-1){//如果车辆减速
    8 F8 N1 x0 f8 ]1 [
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    7 U+ k6 o# P& T2 ~" s* e. s5 _
  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);//更新返回时间 播放刹车声在转向架15 T! l% H1 V* q6 }
  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  d" S/ m  r0 ?, \) x
  25.             }else if(state.speedsub>1){//如果车辆加速
    ' o7 ?1 X) o6 t5 H" B; Y% o
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    % e; z' m. {3 U9 }
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    , [, a; S2 j! A' x2 k( J9 M
  28.             }
    4 `7 @2 A6 J; x+ I6 H9 \1 t; S
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    / L" `1 H$ l) ^
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    & F1 N% i# D6 w& O& }# P% l
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启8 s/ b) y) h; e, {
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    0 z" x' Q* [) d! X: n
  33.             }
    * C, \; O& g3 ?- e! O6 S
  34.             if(train.speed()*20*3.6>5){
    % l/ e% {" q) d" w& D1 Q
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声; Q9 h! X6 Y4 h) f
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ! U, a+ m) h7 y6 S. h8 ^, \' c2 N
  37.             }8 x, h% B' u/ S4 p0 L7 I* t" h
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){- B; t; b0 p: [$ x
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声* g5 z8 W8 ]5 g: z/ H* R
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声3 @, \. N6 Z% ?! T: }/ z. ?) `
  41.             }
    + a8 w# h. J3 @
  42.         }
    % e- R$ X2 M5 U* y  L3 C
  43.     }
      |7 t! ]5 ~5 H3 U/ v$ T6 B! n
  44.     state.soundsspeed = train.speed();//更新速度% q! j5 Q, l1 @8 ~
  45.     for(let i=0;i<4;i++){* `# s9 U' w' t6 @
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    8 R' ?8 f9 r0 `
  47.     }
    3 ]. t: h$ c. _. e% a
  48. }; J9 e) z0 o9 e& [, b
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间; Y" I6 n- p8 b' x2 w
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间8 c$ {2 ^& w& B. ?
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放0 G5 X  j# X5 k% v7 Y
  52.         nu = Timing.elapsed()+long;   //更新播放时间; i9 N6 [9 o8 B: p2 {  q+ q
  53.     }0 \9 {8 G  ?) Z' _1 t9 X- [! V; \% i
  54.     return nu;//返回新的播放时间
    # }- R1 o+ {% c! P+ G5 c$ G* H3 G, s
  55. }
    4 z& S. m; X# Y: A: K: A3 X6 T* g
  56. function grnn(min, max) {//随机小数8 e. K  t- W; e1 M1 h3 y4 |
  57.     return  Math.random()*(max-min)+min;: {$ ~5 a$ I3 w/ J
  58. }
    + O( b& {: C5 t) `
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的, G! D! ^1 |, f- \1 \4 n
  60.     // 获取列车从车库开出的距离3 P0 b7 Z! z& u6 o7 G0 C1 {
  61.     let railProgress = train.railProgress();
      T& J6 [3 I% g0 M: L- n
  62.     // 获取当前轨道的索引7 ?; ?2 H2 k6 o5 |2 d
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 ^, c; i4 A! q0 {
  64.     // 检查当前轨道索引是否有效
    4 L0 s* v9 S: {" ]5 ?  F4 g2 s8 f$ {
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ) j8 Q' I5 Q. J4 u  N% J
  66.         // 获取当前路径数据对象
    % R6 O, V4 V- ^
  67.         let currentPathData = train.path().get(currentRailIndex);
    * j/ ^' p; d4 G5 S* U& t, e4 y+ M
  68.         // 获取当前轨道使用的自定义轨道名称
    8 A( r2 G( l3 J( a
  69.         let trackModelKey = currentPathData.rail.getModelKey();
      x; U( H7 A- E# H5 e# S, f
  70.         return trackModelKey;8 y# }5 _; O! c
  71.     }) S; k( G1 h8 L
  72.     return null; // 或者是一个默认值* u7 x8 p& h7 J0 {6 u" [7 {
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错# c, c* g: Y% }, T5 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
( |5 @" q1 A0 r$ i: u2 sbve声音要方便一些吧,他有可视化可预览的编辑工具

, w+ T1 q/ \3 Z' [嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
  `1 z( n# ]$ b! J  ?: W0 Q, D: ]
3 K; y4 h& N2 y/ \4 f9 ]相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
, ~( i$ ^* J  l. Y1 `3 s
huliawsl 发表于 2024-5-17 21:12- U. s. {1 v$ G/ w# j" l3 z. j2 p  H
相较于此,我还是认为bve格式会更简单

$ t3 R- N+ P& S; ]🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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