开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 : {1 b7 C* ^! N( N1 U
( d: }8 x1 l5 Z. z

( f" k% [$ [& h  L+ X+ x4 w最近在研究JS 做了一个简单的逻辑来播放声音5 D; u- G5 {4 O$ U. C
  1. var pit = 1;//初始化音高(速度)
    8 `6 ]" A* u5 c, d) D" b
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    1 \  z, z( D6 U: S
  3. function create(ctx, state, train) {
    - ?- h/ U7 y7 L' B/ E5 C( D; y
  4.     state.number = new Array();& @7 U- e7 M# P. k
  5.     state.soundsspeed = 0;//初始化速度+ ^' ]/ |! L5 U' u. A9 u2 S
  6.     state.speedsub = 0;
    1 H0 E: t, w5 {
  7.     for(let i = 0; i < 100; i++){+ C1 k# K4 ]. l8 S
  8.         state.number[i]=0;//初始化数组
    * R( o/ t! O$ u2 ]$ X
  9.     }# ?/ h, V: ~" w; t7 t- m* p
  10. }
    ' C) m' r) d& x; |0 u( ]
  11. 1 ^- p; S+ t! l* ]9 c1 u7 I
  12. function render(ctx, state, train) {- O+ v+ p5 a  V( L2 p& H
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动' @9 Z" J- j+ w" ^! v
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)- y: t6 ?/ K+ n; U# O6 l
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    + w/ t% Y% v% s: o  ~1 ?
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ! W% {0 l6 r( B0 z. E
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)& E$ z$ B' i0 M4 q4 U
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作8 y. q/ F8 [( u4 W4 C- S9 G5 O
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ) E) Y# C2 H) v: H- t
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启7 n+ a5 S* n4 _9 Z; f
  21.             if(state.speedsub<-1){//如果车辆减速
    * ]( F( A8 e9 h& k
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : u2 o' e4 {, i' ]: G8 O5 u6 s; Y
  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
    + Y* k# V5 ]  H
  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
    $ [  Y0 ]8 S6 ^, p/ t
  25.             }else if(state.speedsub>1){//如果车辆加速
    8 F8 O7 u6 K  G9 Z* W
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    " f7 q% t) D% D  m
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声3 y' Z' w  i& W
  28.             }
    ) p1 V7 @8 v( Z
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声$ W, m& e7 }5 ]5 X" m5 N  f. B
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    2 K( S( h0 F* H4 X4 B( I
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ) c* [$ R$ I0 Z) Z' Q0 K$ Q) }
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右6 D: H  f3 C# c$ h' b) m( R
  33.             }9 z3 S, N3 x$ p+ l( a, m2 c) o
  34.             if(train.speed()*20*3.6>5){0 j2 z5 r' m4 k9 [3 g6 Y
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声5 z: _7 F, c; v
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声2 O1 P+ X/ q4 f- Q3 X* c
  37.             }" A! ]8 A8 ?# Z: B$ @, t) P0 }
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    / I5 a& }! r1 X2 M- ]
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声: P, G) B1 b( N+ i5 v
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ' p9 h, X* ^* x0 |8 ^5 S; V
  41.             }
    1 M$ H# o7 K) l! ]4 w
  42.         }0 Z4 s( f. S! `2 t3 @% s
  43.     }
    % z6 j0 ]9 g2 M- _7 t+ F4 P
  44.     state.soundsspeed = train.speed();//更新速度
    $ H6 B1 {/ _5 C5 ^. K. R% W
  45.     for(let i=0;i<4;i++){! Z2 p( V+ B6 y6 e
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    8 d; \6 p& j, c. }/ A/ d
  47.     }
      x( M8 X2 B/ B3 F8 {/ r. I) D
  48. }/ i' \1 K6 ?. c; N; o6 A
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    8 Q: D" z" i0 E8 T' D# h, @3 m0 o; i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ! {. s- |3 Y0 B' V' q2 Q# j
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放5 S* n; A4 b# a# S8 e
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    % P' m# w% A" ?
  53.     }
    . w! B9 V0 I  T- ?6 e9 z) p
  54.     return nu;//返回新的播放时间* B  D/ R- r$ P" C
  55. }
    3 G- R. n! a+ r; a: Z$ a% ^: j
  56. function grnn(min, max) {//随机小数; s$ ?: h' _  S3 O. ^0 I7 v
  57.     return  Math.random()*(max-min)+min;$ z- r& K0 O6 A
  58. }6 q$ `, \- {) ?0 \( S: \
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的, B6 s( c. |% y( T4 Z& C
  60.     // 获取列车从车库开出的距离
    6 C! z/ f! T/ i/ W: G9 V
  61.     let railProgress = train.railProgress();
    + G# I0 X7 v% C7 }) ~
  62.     // 获取当前轨道的索引' @: L. H! [; K9 E
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);& h7 P* G" X+ g# i1 C* c3 ^
  64.     // 检查当前轨道索引是否有效
    ! p. W9 C$ X5 s6 o
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
      _! i! p; _4 _( \' q* |1 z8 O
  66.         // 获取当前路径数据对象5 C& w- p' ?4 p
  67.         let currentPathData = train.path().get(currentRailIndex);: w" R, L5 {+ o# F% ]) [
  68.         // 获取当前轨道使用的自定义轨道名称
    " u7 r0 u$ _* M# f1 s8 k
  69.         let trackModelKey = currentPathData.rail.getModelKey();/ s; Q( F) h! B/ e& Y( {
  70.         return trackModelKey;9 L- m# j0 b2 q% D* z
  71.     }
    3 W. X1 x6 b' ]
  72.     return null; // 或者是一个默认值
    ) s/ V# B4 j% B
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错! x0 @/ v- _7 h
有事加我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
+ n; k9 C, m% b) a3 }' Obve声音要方便一些吧,他有可视化可预览的编辑工具

' J2 L9 K0 R. H2 U. t3 G! V5 w嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
  }! Z+ y8 _: f! M5 }8 u1 Q* Z5 ?+ D( j& g! A- A
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
6 n9 A" i2 P6 q0 ]2 G9 _
huliawsl 发表于 2024-5-17 21:12/ \7 c' T! [$ h. ]6 _. N+ G
相较于此,我还是认为bve格式会更简单

# O7 e$ x' m' u* F: k🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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