开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
. l' E4 z2 g# b/ O6 ]* u, g- M
. q7 N: ?+ t$ K0 E) K
  o  X1 F4 y  r7 C" f+ s最近在研究JS 做了一个简单的逻辑来播放声音0 a+ g- U5 S/ B( v2 R$ T6 J
  1. var pit = 1;//初始化音高(速度)
    9 r# G( P& \$ q4 O
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]- v. x+ \! F! Q! [/ @( e, {# t: I% y
  3. function create(ctx, state, train) {
    0 F6 p4 \) Y6 m% G) s$ E$ [+ }
  4.     state.number = new Array();0 M; g! |& a5 N/ K7 m
  5.     state.soundsspeed = 0;//初始化速度
    7 x) U- u& t4 ?2 e7 u4 ~
  6.     state.speedsub = 0;
    0 ]( E8 d! Z  Y1 T
  7.     for(let i = 0; i < 100; i++){
    - m. D" |1 y* H+ P
  8.         state.number[i]=0;//初始化数组
    % I) j: R5 L7 I" l9 I2 i& ^
  9.     }- D. m! w+ A+ M$ ?) G4 |: ]2 g
  10. }
    # D2 T3 k( H" |7 @1 d1 ?' C( o

  11. 7 f; d: {+ t" Z
  12. function render(ctx, state, train) {
    9 r5 `$ f$ J3 N, h' h, l
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动5 M4 D) i+ Q8 D; M, ^( M5 Y; [
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)1 o! l$ g/ }7 F  c
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    4 F5 l! \6 X4 J' C. @5 Q* C# J) g
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差: ]: x6 T+ W8 Q& W; X6 A
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)& h0 r) g9 v/ h0 \( A; J6 Q
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    . d% Y& M# U( x5 ^4 b# H
  19.         for (let i = 0; i < train.trainCars(); i++) {
    , Z# [9 u6 @$ _7 s0 C% `, s
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! _/ E5 M; O+ s6 z
  21.             if(state.speedsub<-1){//如果车辆减速
    # L! e3 `3 p# i7 J, a* ]8 H
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    9 |5 w9 C; u; ?! {/ f" x
  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
    4 p2 D; _  F  S+ V. C3 Z% A, g
  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. o5 M5 ~3 @5 I: \  @
  25.             }else if(state.speedsub>1){//如果车辆加速
    : U8 A3 `/ L0 I# p0 `$ k. j
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    9 I, p  W$ r$ c& z
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    # z6 T$ z6 Q+ g
  28.             }# A, l" R* d" ^" z0 g
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声5 w4 d: g8 S2 R
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ( ^. L5 ^. K! C2 C8 P& o
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启- P1 g. [- B$ Z; s0 I# Q# l: y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    1 K/ S9 @. w& D- f! W( m
  33.             }7 T  Y' w$ f5 Q# C7 D; k8 U9 o
  34.             if(train.speed()*20*3.6>5){# M. N5 u- d; E0 |, z
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    6 B* G% C; V! X: x' V
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声. r- F, \0 q/ N. R2 f
  37.             }
    2 Y; D9 E/ n5 v) e1 c  L
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    + r; G( b+ J+ `0 u3 U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声. D& u, @" D! Z0 ^' @
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声) T0 l5 \3 n, g/ K! [
  41.             }$ P; S6 |; z0 D0 O% @* ^' q
  42.         }
    3 k1 B5 T7 @3 ?  F9 H. u3 n
  43.     }2 T& }& J4 _0 A2 u7 x% c
  44.     state.soundsspeed = train.speed();//更新速度& d$ b" c! f3 L$ T1 u  Q' m
  45.     for(let i=0;i<4;i++){
      K  K" h/ W! `3 o& s) y: `) V2 g
  46.         ctx.setDebugInfo(i+"=",state.number[i]);) V7 \$ c- D  S& r: @
  47.     }8 V8 n7 z# _! Z# y5 G1 w
  48. }
    + K8 j: ]% W6 r! d/ Q
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    3 y% B2 _% H7 p: m# e, g! N7 f- B
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间7 d3 o, i2 x/ v& j, p8 E
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放; ~4 m3 D" s! @1 u; {5 e
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    1 u- d  r4 y8 Q* D
  53.     }
    % ^0 n$ e- e2 c8 o6 p; u
  54.     return nu;//返回新的播放时间, Q% ]/ P: k2 Q  _3 \' y0 X
  55. }
    2 ?, d: h/ X# C! c
  56. function grnn(min, max) {//随机小数
    1 \5 T( j# C9 v/ N6 S6 {
  57.     return  Math.random()*(max-min)+min;$ D; M' V0 @6 k+ n9 k
  58. }( r4 U: n* n+ f/ W/ r, _& `
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的+ ~9 T& l7 y6 e% D5 T' C
  60.     // 获取列车从车库开出的距离9 I! @& u. s: J) `
  61.     let railProgress = train.railProgress();
    ! e! V) V; U# x- y
  62.     // 获取当前轨道的索引( x- y$ t# E% W3 j8 g
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);6 L0 G& [% H3 Q8 T6 C5 E0 u
  64.     // 检查当前轨道索引是否有效
    ) _0 B* B' ~- _8 v9 p; g' U% y8 _& q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {+ \. k4 Q2 E4 U# W2 x% c
  66.         // 获取当前路径数据对象3 I- F) F+ t) N& n; {* h: q. M: D
  67.         let currentPathData = train.path().get(currentRailIndex);
    7 A$ v* U& \, B* P' E& S* Z
  68.         // 获取当前轨道使用的自定义轨道名称
    : |6 ?+ p" W- C$ [% A
  69.         let trackModelKey = currentPathData.rail.getModelKey();8 J0 `2 b4 R0 _; _6 a/ G
  70.         return trackModelKey;
      c7 \% |" z( ]
  71.     }
    # V. ]7 l0 ~/ S' e
  72.     return null; // 或者是一个默认值5 J  W' y: @+ J5 m; f9 S0 ]
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
2 m) X$ B( a1 F; A) {! `: K6 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& D+ E9 c! o" ~# L, g! L, x
bve声音要方便一些吧,他有可视化可预览的编辑工具
, x* _' v2 k7 j9 }! K" q
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
) S0 a% y; z5 j( N) f/ h9 I$ w
. U1 Y& R6 \# Z& w) R# t相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ( F1 A" E2 g! b( j
huliawsl 发表于 2024-5-17 21:12
* V9 k- u) C) [/ C% J相较于此,我还是认为bve格式会更简单
0 M' T& E. u$ Y) m3 b6 T7 W
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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