开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 9 k8 H. w  F% k/ h3 X3 G, S
0 J1 M8 z+ q0 o6 u# L7 p
0 m" x# ~1 G2 A
最近在研究JS 做了一个简单的逻辑来播放声音
9 S  P- W, `* I$ Z0 u3 ^
  1. var pit = 1;//初始化音高(速度)! c2 v+ l' |6 _
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]& T9 o; S- ]; K
  3. function create(ctx, state, train) {
    $ U- v0 L' N  Z2 _5 z
  4.     state.number = new Array();3 x0 M. M/ O  L5 w
  5.     state.soundsspeed = 0;//初始化速度
    2 G4 e" k: M* O& |( R* Z
  6.     state.speedsub = 0;6 i) K8 i  E- P' h1 z
  7.     for(let i = 0; i < 100; i++){2 P; i; B3 U9 j5 s# s" `, c
  8.         state.number[i]=0;//初始化数组
    * c  i0 M6 v8 m! V$ j& ~; Z! w# j
  9.     }
    : Y- y1 M, _/ |3 U, f
  10. }
    * o' k) R6 i1 I7 m  f2 O
  11.   l  C- n3 r; v/ l' ?; K# ~
  12. function render(ctx, state, train) {0 ~: K/ a, V/ D7 P2 c& d
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    $ |- ?( d+ F1 A; B) j
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    # I4 n2 c# J( b- Y* O0 e/ A
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ' ~& V* x/ ?; y
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差) b5 J, t" Y* y/ {: \
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    2 @- Q' w5 r4 F( [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    7 J1 M! ~* {$ O8 g# ]; ~& P
  19.         for (let i = 0; i < train.trainCars(); i++) {
    6 j. ]; i- U: Y$ u$ c
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    7 P1 B6 o6 s* k  q% L+ m" j
  21.             if(state.speedsub<-1){//如果车辆减速
    & U6 c  @. W( r2 z
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : s. Q6 }( s- V5 K; e
  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
    ) y9 C! p9 P8 U9 a/ l
  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+ H  M+ V6 K. ?" `
  25.             }else if(state.speedsub>1){//如果车辆加速( C6 g. |& y3 M4 T1 o/ {
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速3 O3 l2 y( B% N+ j9 l" [
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ; m, t+ U, ]( W0 q# i% |
  28.             }
    / z6 f8 P, g5 q8 K6 U3 X) u
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    * {8 J1 u: f5 g) y
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    6 U0 `- Y* A$ l6 w
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ; Y3 ]! ^; H3 [" T" y
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    # y$ J, {  X: B$ @; L- q- S7 a' N
  33.             }$ f6 }# O; a# K; @
  34.             if(train.speed()*20*3.6>5){
    ) K$ d3 D5 h7 s9 A- g
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    % D( J7 |1 E6 P# g  H
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声3 m( n7 }8 V0 F# Q. r* g. w
  37.             }: u& u- `, E, F
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){, T% C/ h2 _. f# E
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声% I& z7 d. ]" ?( U1 `
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声) ]1 w" c, z& ]  R% H
  41.             }
    + [, h" |1 ~; s* i3 `: K+ E5 ?9 m
  42.         }/ U9 _+ V0 D' R, m* g+ Q
  43.     }
    # G* t" ]- u8 |  K
  44.     state.soundsspeed = train.speed();//更新速度* K! m+ p' z  d
  45.     for(let i=0;i<4;i++){2 r* J' P- v+ ~5 z$ `/ Q# I; n
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    : ?! D4 G4 k# f0 [# [7 J* ]
  47.     }
    6 F# m! |9 u( L0 v. K( [
  48. }
    - l8 r; f- Q/ K0 y+ ^6 d7 G# N
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间; O% H5 M7 A  E8 ~- B- E$ i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    - ^0 Q0 V* m* t! y7 K
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放8 k0 Z* q0 ~2 `/ b- B
  52.         nu = Timing.elapsed()+long;   //更新播放时间; _% ~7 G  ~% O* ?& O
  53.     }0 p% `# j  a5 F. Q6 o
  54.     return nu;//返回新的播放时间
    ; {+ J6 z$ M9 x: w; }0 P! S( Y
  55. }
    ) J, M8 r8 ?4 X
  56. function grnn(min, max) {//随机小数
    ; |$ m, p6 i: w8 i; [# y
  57.     return  Math.random()*(max-min)+min;
    4 J" m. R  n* y
  58. }. J! `4 K/ _$ T( ^
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    1 A% w. Y6 m% [2 U- y7 ?0 b3 |
  60.     // 获取列车从车库开出的距离% P* K' o/ q$ w8 N' y" A; {/ o8 w. ]
  61.     let railProgress = train.railProgress();
    $ U: a6 c# u7 g1 A8 T
  62.     // 获取当前轨道的索引+ M* K5 @4 O- D( U
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    - l9 e" F; C# y" J# M7 B
  64.     // 检查当前轨道索引是否有效! ^" a. [6 g- g$ k
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    1 W4 q+ A+ u' t; e# J1 P1 ?
  66.         // 获取当前路径数据对象7 h0 J5 I5 f& z3 o" n) B
  67.         let currentPathData = train.path().get(currentRailIndex);
    & p/ h4 e9 P! Y
  68.         // 获取当前轨道使用的自定义轨道名称
    " X6 G7 A% V, [- {4 w. B" T
  69.         let trackModelKey = currentPathData.rail.getModelKey();, ]" f% }( |- ~9 d
  70.         return trackModelKey;8 W3 P. D# c" B
  71.     }. A% X# v8 h4 ?- s- Z
  72.     return null; // 或者是一个默认值
    9 i0 D% ^' P5 o$ u. @2 V
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
7 j+ [' m1 ?- F4 g% ^
有事加我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+ ^7 H" t2 f6 P& H; `
bve声音要方便一些吧,他有可视化可预览的编辑工具

' _2 \  m" R' ^# _嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 . @. T! {* ^0 S& J9 Q" p

0 X  b/ G8 ^6 P& k( V相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
% q& \& V. X9 ~1 z9 b( U
huliawsl 发表于 2024-5-17 21:12
0 y: c( W) i. _1 J" @# G3 \5 V* y7 G8 R相较于此,我还是认为bve格式会更简单

' P: ]$ P' y) G" o+ S/ _' C🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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