开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 , U& ~. R& J; l' T' J+ ?- r2 k

6 M7 F* V5 y$ B7 x1 \& |, C1 Z; Z: t4 }/ r
最近在研究JS 做了一个简单的逻辑来播放声音* d5 E  A2 v0 p( r+ f/ }0 M! x6 f
  1. var pit = 1;//初始化音高(速度)
    . G/ G9 Y' N: X8 ^/ @
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]# A" b% f" Y4 l' H1 f
  3. function create(ctx, state, train) {
    . h$ L# a0 |' b9 ?( |
  4.     state.number = new Array();
    9 c$ J, v/ \" y$ K; W
  5.     state.soundsspeed = 0;//初始化速度# O% m% _- {4 ~* V5 e! v
  6.     state.speedsub = 0;
    4 s* n& s  K2 N$ [& q# v1 w
  7.     for(let i = 0; i < 100; i++){
      d8 S' s& S/ @0 p' ^. a% l# m
  8.         state.number[i]=0;//初始化数组% a# z7 O* w' W5 H5 B+ K
  9.     }
    . t% \5 r2 a8 f/ s
  10. }
    + |3 c( {4 U# x  t  c0 U

  11. * F" o# g* `& l) Z' J8 I2 u5 M
  12. function render(ctx, state, train) {! B0 S# D: `5 M# F1 W8 y' H4 g2 P
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动* G6 z/ A, _* W% N- G
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
      F) j* n8 S: \9 w# k  n! S
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    $ n( D5 v1 J( M& r% e" D# n2 |
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差* P' f7 _2 {+ K) Y5 ^) j
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)! K' W! R9 l; c0 d
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    6 ^% i: C9 q% @
  19.         for (let i = 0; i < train.trainCars(); i++) {
    8 Z# x: {* L, V7 d0 M6 D
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    - X1 N. C) u: r( p) l
  21.             if(state.speedsub<-1){//如果车辆减速
    " j+ H& S) F9 t, h
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    ! U) H) D- N7 i1 s
  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);//更新返回时间 播放刹车声在转向架17 C$ F1 w" [9 ^5 ?* U- o6 @, [
  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( Z" m1 |$ u! T9 Q+ G1 g2 Z* Y/ C
  25.             }else if(state.speedsub>1){//如果车辆加速: l- x8 r" S+ s
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    : I1 V5 j) }: v# |! g/ r, w
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
      E' h. j2 z* N
  28.             }- W* h4 J) W1 n
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声" y+ B/ D6 P# G
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声0 s) z# \5 W5 A) [! J6 U
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    + d: H+ m! _8 W5 L
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右  i  I. S0 R! Q
  33.             }& q$ ^9 M' ~2 h; `0 D( q
  34.             if(train.speed()*20*3.6>5){6 A/ v. N% L* i* D0 l# |
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声) n' V+ Y# O% N& v( n4 _) s& D! _
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    - R; B; h' z9 s& `  J7 v( C
  37.             }
    1 ~, _% H4 x# M( I# _$ J7 k8 b
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){' \8 \* `1 @5 ~8 q
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声  z/ h' p1 k+ M( ~
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    3 d" m/ x$ J2 v7 M
  41.             }% p; p# @7 x7 g" {# o6 l4 T
  42.         }$ [$ b6 F, V6 H- A/ j' P+ Z
  43.     }
    / f5 S/ e$ z: q; H- Q7 l
  44.     state.soundsspeed = train.speed();//更新速度7 _! u* u9 b1 `4 H
  45.     for(let i=0;i<4;i++){
    6 D2 R" ~% c5 A6 ?9 `6 e5 B) l
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    * R; a' d, o0 Y$ j
  47.     }2 h/ Z& n( s& z4 ~, M
  48. }' y# x9 W' R' G  ^
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    * @1 z9 {" L6 y8 A' ]4 w+ S5 z
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间5 n, f1 A6 _6 g. b# a' L6 a1 ^/ k: C& O
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放+ [3 u% I' X2 N9 I  k! \) K
  52.         nu = Timing.elapsed()+long;   //更新播放时间0 p1 Q8 B. H$ R: E2 G
  53.     }+ q& t" y% F1 m8 L5 M: ?! o
  54.     return nu;//返回新的播放时间
    8 Z, I( W+ c! l2 U
  55. }
    3 n7 N2 A9 _4 U2 V
  56. function grnn(min, max) {//随机小数. p0 D# W% B  K7 ~
  57.     return  Math.random()*(max-min)+min;
    : y+ G+ r0 r$ m5 P- }
  58. }
    ) d8 O1 D- v2 j" p" V' b3 Y
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的0 H; V2 Y4 _; C$ k
  60.     // 获取列车从车库开出的距离
    - r7 N5 z0 o- r0 X- `& T5 B; z
  61.     let railProgress = train.railProgress();
    % [2 q" J8 [( u) a" K
  62.     // 获取当前轨道的索引
    ' F: R+ \# l; j0 u. e6 C: K
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    % A0 u: o+ U1 w3 u; y6 M" B
  64.     // 检查当前轨道索引是否有效
    ) i: K2 m, s7 g/ J7 j5 H% y
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    # @$ J9 P0 R& e. F& \# B
  66.         // 获取当前路径数据对象1 S, u: S3 x3 u; [) P1 Z% B4 v$ _
  67.         let currentPathData = train.path().get(currentRailIndex);
    % y6 O. r" D( D5 L' T) L3 S  g
  68.         // 获取当前轨道使用的自定义轨道名称' x( s& \) e4 \7 ^, U
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    - G7 {! w! D' R
  70.         return trackModelKey;- k* @8 y) M* x% k0 a4 i9 `
  71.     }
    , {! G# }9 l2 T8 g) M1 w
  72.     return null; // 或者是一个默认值
    7 q7 M+ K" i) e
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错& o0 O! z0 Y2 X; N# |2 p6 D
有事加我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
4 b: O4 i8 p: ]1 ^0 [3 d0 dbve声音要方便一些吧,他有可视化可预览的编辑工具

* L& Y+ x# P: L2 e2 I$ Q3 w嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 9 J7 Y- d/ w" o, A, _& W. f: N4 j

) i& G7 L0 D9 J% H相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
+ R- H0 f+ ]8 ?$ _' ^
huliawsl 发表于 2024-5-17 21:12
; \4 i0 [" O  ]相较于此,我还是认为bve格式会更简单

( G* f0 q, c3 C2 U) |🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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