开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 / }. S: C% V$ z' s. k( V9 o
( X1 D# i7 b; w3 c

; |5 p. o- {4 P! i+ M* {最近在研究JS 做了一个简单的逻辑来播放声音
: y# \  w; r: ~$ S; d1 P
  1. var pit = 1;//初始化音高(速度)* Q/ I" w& T8 q" ^/ m$ r( P' o1 w
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]2 L5 p1 X( E" J5 p+ X& F
  3. function create(ctx, state, train) {
    ! x- u3 G( Z0 z* y
  4.     state.number = new Array();4 @4 o: f& |! U  }
  5.     state.soundsspeed = 0;//初始化速度
    : ^3 w. l( J7 {& |; q
  6.     state.speedsub = 0;
    . [0 Q7 `7 Z4 ~4 i: W2 {8 |; G6 \
  7.     for(let i = 0; i < 100; i++){2 S1 \& g! R& W* |+ F
  8.         state.number[i]=0;//初始化数组
    3 m: R8 \2 x. ?2 ^
  9.     }
    ' o6 _3 }: P) i, x8 W' C
  10. }4 L, ]' q: X0 \, G
  11. ' C9 o) a2 {/ [
  12. function render(ctx, state, train) {- Z* x- d( ?# `4 ?( H5 _
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动$ X4 i5 D5 A% E- k1 U7 I( ^; X6 Y
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)* k6 ]+ O+ ]! Z
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ! ?7 K7 k) u4 X& a) v, g
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差1 u( {% k7 _8 a+ t, d0 N7 U5 T. K
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)% z; t3 R/ `0 `$ P9 Z
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作- z7 Q/ {+ m" C8 H2 S- U2 Q( d
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ! s( Z: X7 R$ l5 u
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    / B' N5 J7 d: g4 _3 [% e
  21.             if(state.speedsub<-1){//如果车辆减速1 V. I$ O$ a7 X3 m8 O
  22.                 ctx.setDebugInfo("shache",1);//记录刹车3 m0 X% h& w2 j! l1 n- x3 @
  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# ?# Q2 o; y9 V' l0 W
  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. R1 F2 H+ R: l2 L8 P
  25.             }else if(state.speedsub>1){//如果车辆加速0 d, `( [, ~2 h1 n
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速) ?1 I2 h' A$ N& a" o3 }
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    + {4 i- k/ d+ C- x* d
  28.             }3 V( Q) T' W8 [7 c2 [0 x
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声0 q/ X1 b" P3 Z% Z6 s, v. H5 ^
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    % o5 B# ?8 W* h) K) J% a! Z6 p
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    , x1 Z& V- X4 Z) Y- z3 \( o4 f
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右8 @$ B8 Y# O7 Y
  33.             }
    8 j. G% U/ v) S0 |1 B, y
  34.             if(train.speed()*20*3.6>5){
    7 o, U+ O7 N$ j1 u( [
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声1 v' }* o% o' C8 S, e8 l& N
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    6 n; t9 T/ W1 e. j7 Q3 E+ C
  37.             }8 n# m: N1 U$ u8 N' C
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){4 ^! \! S* Z2 m7 D- q% n: R% C9 U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声# E3 F6 ~6 F% y$ O3 ]  _! {. X
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声  m& q/ A: E5 l5 z) T% B8 D' H( L
  41.             }
    7 {% B: G1 M+ H0 p# j$ U0 ]! w# H
  42.         }' {1 U+ K* S: i  e$ x
  43.     }! A' t% K2 ~- K& o3 F2 U$ w
  44.     state.soundsspeed = train.speed();//更新速度
    5 W- s4 \( x  `. ~9 v& @0 V, F( a
  45.     for(let i=0;i<4;i++){
    1 V2 J  R$ g! j
  46.         ctx.setDebugInfo(i+"=",state.number[i]);' e- R  }3 Q" v
  47.     }
    0 F8 u( ]- @4 G3 r. ]
  48. }% x. Q) y* X$ y9 o/ A4 O
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间- n% L- S7 y6 e( l- }: ~, @
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 p2 i! m/ T4 `8 D2 o0 s
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放: @3 w" p0 Q! u' Z, x) F) G
  52.         nu = Timing.elapsed()+long;   //更新播放时间( r% ]6 k+ {8 b% l' P  x5 E- H
  53.     }
    % {. h. x  [: p; R
  54.     return nu;//返回新的播放时间
    - c! G5 e) O- ]; Z/ v
  55. }: V. ~# ]* J, h' A  s0 h4 t. k: Y
  56. function grnn(min, max) {//随机小数" J3 `* ^" ?! q8 w  e( m
  57.     return  Math.random()*(max-min)+min;5 D! e) ^7 _6 S1 ^8 o/ L
  58. }
    $ m0 E; ^. j9 e3 V# N
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的6 g- r' g" ~- o! F6 s7 \1 j: L
  60.     // 获取列车从车库开出的距离
    9 U2 T0 l+ A! B5 b( P
  61.     let railProgress = train.railProgress();6 U3 W% c, q  u3 s. q1 Z
  62.     // 获取当前轨道的索引
    $ V  o0 I. a! V1 M$ [+ W
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);( M7 {' O* Q( ?+ r& {. Z3 e
  64.     // 检查当前轨道索引是否有效
    4 D& s0 L2 o5 X# a$ |+ U2 z
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {8 |' a5 l9 i1 i$ J
  66.         // 获取当前路径数据对象
    4 P1 H. V4 s& W6 \- E
  67.         let currentPathData = train.path().get(currentRailIndex);( ^# a: ]0 ^5 j0 D6 q% L) t
  68.         // 获取当前轨道使用的自定义轨道名称
    - y9 P) c1 o2 `8 u4 x
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    ( e5 d0 d' Y6 T1 q+ Q
  70.         return trackModelKey;4 i9 p3 [8 h, c; T  {- y
  71.     }6 y- |2 Q1 Y' u- |/ v& K
  72.     return null; // 或者是一个默认值) ~" a9 _+ j9 a& @( g3 X2 \0 {" @
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
$ m8 J  E* n. [2 `! Q  N
有事加我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
& j, ]! Z4 |+ y* Wbve声音要方便一些吧,他有可视化可预览的编辑工具
/ e1 h. F$ }( _8 r4 v
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 * {, [  t3 n4 o4 `0 j

2 A' ~( Z3 q/ x, @  }6 K  ~5 n相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
* l& H* U/ w3 z3 E/ ^
huliawsl 发表于 2024-5-17 21:12) Y( s; o+ n' B# x
相较于此,我还是认为bve格式会更简单

. g: Y! x) R1 A/ S4 H# M! w🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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