开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
0 o; P$ }8 }; a7 `- Z, j% @
/ A! B# |/ W0 M5 B! ?: n2 C
+ b) a6 p4 ~+ U" |% _' d最近在研究JS 做了一个简单的逻辑来播放声音/ b2 U4 G, V9 s) e; b2 t) n  @
  1. var pit = 1;//初始化音高(速度)& n  Z0 j. q. S( j7 |' k" L% m* H- |# G7 P
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]3 ]# K% e$ m* I% z6 m( E7 K: z# N
  3. function create(ctx, state, train) {
    7 x9 J0 m% T8 ^8 C# I3 [
  4.     state.number = new Array();
    , x' ^3 z9 H- z$ s) q
  5.     state.soundsspeed = 0;//初始化速度, W; ?) J/ u0 S7 v; t
  6.     state.speedsub = 0;# L4 ~1 L3 ]8 r+ _0 B1 t) X
  7.     for(let i = 0; i < 100; i++){& D$ ~6 c: t# y
  8.         state.number[i]=0;//初始化数组
    ) j  B  D  }) h! \8 s
  9.     }
    5 Q' C" K3 o& y6 K8 m
  10. }
    % E. j1 W8 N( R: l% n' V3 r+ R

  11. 4 U8 z+ _( l* }9 T' ^8 t" m
  12. function render(ctx, state, train) {3 T* b6 C9 J5 l
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    , t2 i* D2 W3 J5 D) c- ]
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    4 Q3 p  ]  ]6 \; F
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    1 d/ m3 d$ G$ g
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差# Q/ {- B9 w) v+ `! w* k' L
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    1 A0 V) j8 l3 ]  X0 u7 _
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    6 v2 ^( \( h% ]8 o+ h- I
  19.         for (let i = 0; i < train.trainCars(); i++) {8 ~6 s% l, X) E& Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启- l& y% |$ H: M- ?. ~/ B
  21.             if(state.speedsub<-1){//如果车辆减速  Y4 _( q9 V3 ~) k, c
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    * N' e2 ~+ Q) I
  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);//更新返回时间 播放刹车声在转向架14 q5 ?7 p' E9 i3 U
  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
    - b4 @8 B6 Y( `, |
  25.             }else if(state.speedsub>1){//如果车辆加速5 _2 U- w- q  M. ?  p0 m
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    , P& u9 O, x& z3 a# U$ M
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声3 X( x) b7 h* X" `1 h% A
  28.             }
    ' c2 ^& A3 F7 f; k* _- K) P
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声3 |0 T/ y+ J$ u) ?' f2 y
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声  r; a9 f! y2 s
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    & s1 q) m) _6 [# l5 q
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右5 W9 w) B- |* L
  33.             }
    ' H: m) C( x7 F0 ]; R3 h
  34.             if(train.speed()*20*3.6>5){
    4 ]) D5 c1 k, M( s7 |& |
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声3 W$ a# J  b. @$ g! X+ x8 k, f
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声( M' h  V. L) `. }
  37.             }6 Q! H" s) l0 d' ?$ A. M. [% @
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){* e+ W2 E' v$ ]9 {/ B4 G2 y
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    5 m6 ]8 A/ |! E3 l& y, w
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    , V" f9 T6 ^: f' R
  41.             }
    0 b, B5 w# R3 a
  42.         }
    * T. N0 p2 [2 b$ a1 g0 B4 r
  43.     }
    2 ~6 t! H; h1 D! G3 h) {* x6 P
  44.     state.soundsspeed = train.speed();//更新速度/ x5 V' U3 O! P4 a" E  U! S
  45.     for(let i=0;i<4;i++){
    % x$ S" @9 \& |% A4 c
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    + B( {6 M# f. r0 C3 L' d
  47.     }0 O% k: L" `$ Y. h  c
  48. }
    , v: T4 B" p+ M& x6 F$ M' @- z% {8 ^
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    $ K5 F8 q1 `: u6 U( S+ ^; U& u
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    " N' a2 y) L0 }9 b) f% G
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    , ~( `. K8 d8 c0 _6 @- g+ |& w
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    # x2 V' ^: S, o5 M$ U. \0 v1 r
  53.     }6 q% a+ R6 s/ C6 E/ F' h, X" ]
  54.     return nu;//返回新的播放时间) \. K' C1 i4 N
  55. }
    % E4 Z( ^9 V; Y) b, J& N2 {2 _2 C
  56. function grnn(min, max) {//随机小数
    8 U, l( y% K) m$ X0 g6 b& @) k
  57.     return  Math.random()*(max-min)+min;
    ( e/ P  V3 X7 J# m5 G* f
  58. }  n/ L2 f( s5 I" A/ I) F
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    7 ^7 Y) I  ~5 V& E
  60.     // 获取列车从车库开出的距离8 k- g- d' y" C* d8 S$ O
  61.     let railProgress = train.railProgress();
    / x# s  j- e( X1 ?
  62.     // 获取当前轨道的索引2 c. k6 q. w! K* b9 P3 @0 u5 J( F
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);6 E. C9 ^$ e- m+ y6 b, [/ j
  64.     // 检查当前轨道索引是否有效0 y" h7 \- ^9 y* u
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    0 K2 v; K4 L3 P
  66.         // 获取当前路径数据对象
    3 m1 j+ x/ o1 Z( e( j
  67.         let currentPathData = train.path().get(currentRailIndex);* n% `4 S8 L- H, P6 i
  68.         // 获取当前轨道使用的自定义轨道名称2 E0 b' O* T  k& |
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    . t4 `( h& {; ^, v, E' X& D- A* K2 \) ]
  70.         return trackModelKey;/ @3 E5 [) G- y7 E5 {9 b3 h
  71.     }8 o3 S/ @* u9 t6 E2 k) Q
  72.     return null; // 或者是一个默认值
    0 x0 N3 l- N# _" y" ?: E. ^+ ?7 A) }
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错. [% e0 M8 `6 B" M6 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
8 u. y- u. I& t- u- Zbve声音要方便一些吧,他有可视化可预览的编辑工具

2 J6 ]& ?- I8 t6 ^& ^8 b嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
  y0 _1 Y4 A6 L; G0 f( g2 c8 p7 G' c4 U( [2 a% {6 E
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
5 ]: q4 e/ d8 z& M
huliawsl 发表于 2024-5-17 21:128 S! w" L: s- y7 J5 {* |( i3 x
相较于此,我还是认为bve格式会更简单

3 R# v' W' [' n4 ?: q( |🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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