开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 5 z0 c5 M# D4 S

3 B+ R; ?; E9 ?* ~5 `/ E1 |& n) X3 l& m: c0 u
最近在研究JS 做了一个简单的逻辑来播放声音
( L4 @0 S. t/ }7 B8 p8 ]
  1. var pit = 1;//初始化音高(速度)4 v+ R, X! Z# L* Q) S
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]+ [# V$ p( }/ ]- p
  3. function create(ctx, state, train) {
    4 F: m$ L4 y1 `! P* w7 K) R" Q- T
  4.     state.number = new Array();0 G9 X( k  F/ _
  5.     state.soundsspeed = 0;//初始化速度/ |* |$ @/ t" O
  6.     state.speedsub = 0;! C/ R% |6 s8 G1 s3 G# F1 w0 f
  7.     for(let i = 0; i < 100; i++){8 Q7 q" ?+ M( B, B- l! i1 T
  8.         state.number[i]=0;//初始化数组
    6 Z; t  B. T( N9 o5 T$ J. j: l
  9.     }* ?/ H) u% C; p
  10. }
    7 r' j* E, G* Y0 Q( f8 R& J4 ?

  11. 1 b) o/ n5 I! Q2 D( y: T6 N; B
  12. function render(ctx, state, train) {
    2 M5 K6 T: n, W* |% A2 M4 k
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    1 |5 k8 H7 a# I; h) O& B4 T9 H  g
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)$ g; Y8 [" `! B
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    / U# t0 N$ I! Z8 C
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ) ^! y+ g$ T& @$ u' ?
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    . f# _# M" N+ z. v  w8 U- {
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    1 d8 y* s4 Q% m, G# q
  19.         for (let i = 0; i < train.trainCars(); i++) {. C% x7 L! q7 K5 F
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启7 `5 T" m: F0 K" Z& @0 m  |! e
  21.             if(state.speedsub<-1){//如果车辆减速6 ^% M% D- `3 [/ ?, P! `/ I
  22.                 ctx.setDebugInfo("shache",1);//记录刹车: P, _' {7 @# s" v5 H2 I/ K
  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
    $ n& v  `. z; P0 I4 I. Y8 b
  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
    9 W9 e3 a$ B5 V8 w: Y$ k
  25.             }else if(state.speedsub>1){//如果车辆加速: T0 b+ C; R# `/ ?
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速" \. B, N* N7 d3 \! k: H( n3 Z# _
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    * W7 H( p, L& L/ A+ x: f
  28.             }8 y3 G! Z* j/ t5 G1 O" l
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声% _! L) z& T+ ~' n* O6 E- |
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    / e, V: }: p) J7 D
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    4 B* ~* o+ v# o
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右; k% u8 G1 b  e0 D) X1 m
  33.             }
    , T. v6 Q$ a* b. C3 ~! f
  34.             if(train.speed()*20*3.6>5){% d: \6 o5 B, ?, U, z0 d
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声" [, \: @8 O- C2 {8 h9 F2 }
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    , v* E. x# Y, X- L
  37.             }8 V9 q* z( \; E) N4 B4 P9 i6 u/ }4 f( i
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
      t. l7 C, V5 {6 u0 i8 O
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声& o! v6 G- L; b7 q. C  j' Z  u
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ' p6 S+ P& }  Y5 O6 m
  41.             }2 H# t: P$ S" u# _3 t8 @3 A1 _! n
  42.         }
    & a, a7 b1 y" x2 V7 u6 m9 t
  43.     }, d0 y" c2 F  a. i& E
  44.     state.soundsspeed = train.speed();//更新速度4 d) \3 T, v5 u' I
  45.     for(let i=0;i<4;i++){; n9 B9 o' K5 C8 l5 h( u( m) C
  46.         ctx.setDebugInfo(i+"=",state.number[i]);4 g- G! S" R$ N6 K  V+ O* i
  47.     }. b9 z! j; z) U( M. |
  48. }
    ' q* q  J7 {5 W( j; Y- |7 Y
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间  h3 u; J# P7 Q# v
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间" {, H8 k2 N% C$ O( X2 i8 l
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ' g5 e6 G+ w" [; D  l3 y
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    5 S6 q# Q7 ^4 a# ~3 I
  53.     }, Q% A# m, o: c! M5 s
  54.     return nu;//返回新的播放时间
    ; c4 ^+ f7 v, d5 `; ?( C2 K" k
  55. }
    * u! F4 N# D8 d, a7 n
  56. function grnn(min, max) {//随机小数6 w4 R/ D4 H" r1 j: h# B$ B
  57.     return  Math.random()*(max-min)+min;8 U9 Z" M( c1 q; @: s
  58. }
    & c5 U5 i0 o4 G+ V: z
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的4 D( h; z' }# w6 H" d% G; m
  60.     // 获取列车从车库开出的距离" n# P4 `; t+ G0 ]$ n
  61.     let railProgress = train.railProgress();' Q, [% h& L% V  b+ B" O+ n4 @
  62.     // 获取当前轨道的索引0 B4 ^" M4 Y  }1 W: n4 o' |/ I/ `
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    % P$ ]. Z5 G: {3 n/ x1 F3 `
  64.     // 检查当前轨道索引是否有效7 T  W9 n. X9 T3 O
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {8 D# q4 q( h- H5 G8 y' I2 Y
  66.         // 获取当前路径数据对象9 M) h; e  j, {6 O" h3 }0 t3 P
  67.         let currentPathData = train.path().get(currentRailIndex);
    ; L4 V$ L' }) \  O; I: H5 O
  68.         // 获取当前轨道使用的自定义轨道名称$ m+ y5 w/ d7 J. G+ f5 i  L, F
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    + b, R: y9 m1 l# t2 }* b& u
  70.         return trackModelKey;
    # u- x( \" B% a5 X
  71.     }
    ; S' Z" P: H, _4 j  m
  72.     return null; // 或者是一个默认值
    1 W6 }, r# E9 J9 f' V0 v  J
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错8 o5 w/ E2 l) ?) O5 {: T& `
有事加我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
9 U& i9 |: t8 Wbve声音要方便一些吧,他有可视化可预览的编辑工具
1 \9 g$ K6 z% D5 \/ H
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 0 ^1 S, `# ]$ u% d# q) K# X" A) l

! v5 w$ q6 m- l5 q* n相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ; ?! }8 Q0 {' L' h
huliawsl 发表于 2024-5-17 21:12  D0 X* e$ `6 \7 b4 _% Y. p$ K
相较于此,我还是认为bve格式会更简单

2 N+ ^; l! O  n7 `' O🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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