开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
) B7 L8 a0 Y& `
# [+ F0 e2 c! r7 r# {4 `" o: I& {( W/ K# Y! i3 {8 }- A
最近在研究JS 做了一个简单的逻辑来播放声音
1 c  x8 f9 D. b. H; f" }* N, l
  1. var pit = 1;//初始化音高(速度)
    . {' D0 `( J7 \$ g+ R1 p, b/ d
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ' ?9 i5 F! f+ |9 n% v+ b! B
  3. function create(ctx, state, train) {$ n* z$ p! W9 N; l" Q5 ]
  4.     state.number = new Array();
    4 J& p/ e; p4 g& B
  5.     state.soundsspeed = 0;//初始化速度
    " Y- f) C$ }9 @
  6.     state.speedsub = 0;
    0 u0 f3 @+ [+ |
  7.     for(let i = 0; i < 100; i++){+ d: h2 W8 Q' f0 ?
  8.         state.number[i]=0;//初始化数组. V) v+ J( I& t) B7 c) H
  9.     }- y- p" E& n, J# t7 N
  10. }$ d# f2 N3 ]# t- K! ~& H' {9 d

  11. 3 N" @9 d7 \& e" Q
  12. function render(ctx, state, train) {
    , I8 e8 S: q  ~( _+ E+ T/ v
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动$ b, w9 X7 s  W: M4 s
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    8 m) o: l+ c$ k4 b* a  I
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    6 q1 N- z0 Y6 i" U  C- \
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ' E  P  J9 ]5 U+ n3 r/ M3 u/ g! T
  17.     ctx.setDebugInfo("speedsub=",state.speedsub), O& }: I5 A- m  n/ @
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作8 q/ x7 ]2 o# Q- W9 b7 V2 Y  o
  19.         for (let i = 0; i < train.trainCars(); i++) {
      U) F& I4 M  q/ u3 t
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    . r  T) T3 \$ G0 W. ~  [
  21.             if(state.speedsub<-1){//如果车辆减速
    ) {- u9 C+ ~# o  M/ J
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    " k9 J: o) n( ]( [" t' Y8 a" 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);//更新返回时间 播放刹车声在转向架1
    2 x: k1 B3 L1 Q: n- [' B
  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
    , l: _8 k: K! d+ L
  25.             }else if(state.speedsub>1){//如果车辆加速
    4 s- Z% D1 n4 p1 |
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    - ]$ I+ e! g% E- U. W; N
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    / q" V, V4 r* A+ k
  28.             }7 Y0 B+ ], \+ m6 e* }  t
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声9 E4 Y8 p6 |7 t0 }1 n+ `
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声1 F' a" ~0 Z: [8 F/ s
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启0 B: ]6 e7 ^6 q7 ~& g) ?5 K0 Z
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右0 M$ _: ?) v$ m
  33.             }" g" S% S+ q+ c9 Q3 P" g% }
  34.             if(train.speed()*20*3.6>5){
    # @. H! ?& ]4 {. S
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    # ]3 f: t% m% Q# u4 ~( K# C2 d/ p
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    , O' b" q- m  V( \% q. g
  37.             }) q+ X# }7 b" |& k( Q$ y6 l
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    " A3 T, R$ T0 O# `/ I# c
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    3 d* l$ l' _! G; Z
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    % r! f2 m# N( p
  41.             }! H3 r6 H* C6 O: O1 ?% c
  42.         }
    ! E; [7 y3 ?4 ^; Z1 U
  43.     }6 l5 H7 u$ x1 a% C
  44.     state.soundsspeed = train.speed();//更新速度
    ; U6 b+ x3 v0 w3 E3 v- }3 m6 @
  45.     for(let i=0;i<4;i++){
    9 A8 G$ n) ^6 n% P/ k( C9 @
  46.         ctx.setDebugInfo(i+"=",state.number[i]);2 [( b; }. n4 v. E. A
  47.     }
    ) w, B% p4 z" {/ M
  48. }! h& p0 X2 |1 u$ @
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    8 _$ ?4 A: A4 {/ b0 y/ V: u
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间3 E# c! p/ n# G4 I4 N; J! X
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放7 Q3 y1 ~) K8 F+ v! [0 e5 ~
  52.         nu = Timing.elapsed()+long;   //更新播放时间- O3 j9 a+ M9 Z! u, F" @# n3 R; n3 X. W
  53.     }
    4 ^3 |1 ?3 ~" i6 \1 T
  54.     return nu;//返回新的播放时间7 L5 Q- @0 ^, e. m4 X
  55. }
    ; J% S/ W$ e" O- c7 b6 g
  56. function grnn(min, max) {//随机小数" S. X- R% u" k% |
  57.     return  Math.random()*(max-min)+min;! x$ w5 K% M7 @* [9 t) y5 I
  58. }
    " l" j- f' A/ I" a  r5 x: I" n
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的8 L# w3 R% o9 q, M9 r
  60.     // 获取列车从车库开出的距离/ m( p+ U6 Y( \3 B( Z! L
  61.     let railProgress = train.railProgress();9 P& c( R0 B7 i% Q! |$ r& E* x
  62.     // 获取当前轨道的索引
    $ F) `, E& m! s9 z
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);6 L6 v! |  y/ B9 F
  64.     // 检查当前轨道索引是否有效: H3 g; S8 ?: y6 t& i  c
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ( S% Q2 [! F% n. \) J' K8 ]
  66.         // 获取当前路径数据对象
    ; D3 {* Q* M% K& |1 Q/ m$ X
  67.         let currentPathData = train.path().get(currentRailIndex);
    2 [! p+ g) u5 [, Z4 }% z# Z
  68.         // 获取当前轨道使用的自定义轨道名称) ^0 N7 l, Y) N6 U( T
  69.         let trackModelKey = currentPathData.rail.getModelKey();0 ?8 C: T. \$ g  y) _; Y0 E
  70.         return trackModelKey;
    # H* @8 h- q% s/ e; k
  71.     }
    7 ~* ^/ f7 p+ p+ a6 w7 c- g
  72.     return null; // 或者是一个默认值+ V) R) o3 F. ~* n4 P/ Y
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
' y; U+ ]4 G+ u1 o. V: ^
有事加我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: f' i8 m6 R" e/ ^+ p
bve声音要方便一些吧,他有可视化可预览的编辑工具

7 ~% m& R/ r, f- d2 z2 H嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 # Z- I8 C. s5 v( L( }4 i# o

* x% |' t9 }; V" F' w  L# l相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 1 [( @3 r9 W2 ~+ d7 u1 q9 w- P: s
huliawsl 发表于 2024-5-17 21:12& p# I& y) d3 P- O4 {
相较于此,我还是认为bve格式会更简单

. D. n6 C, H  y# Z+ ]0 G" v) Q& x% w🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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