开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
: P9 @0 k& G+ U# O+ o3 U$ w, l6 p$ C, q1 R0 }# F- e3 w
9 `" z$ x( Q6 \+ n. a: t
最近在研究JS 做了一个简单的逻辑来播放声音8 _; Z6 d7 P! H9 R9 ~, n
  1. var pit = 1;//初始化音高(速度)& k) r. F3 a  s. N. }* z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]$ i- [2 |7 o1 p
  3. function create(ctx, state, train) {, P7 ?  U$ N- N( ^4 U# g
  4.     state.number = new Array();
    6 ?4 i# U6 S6 p% v' `
  5.     state.soundsspeed = 0;//初始化速度
    . ~% R2 _& p- }" E2 t8 s
  6.     state.speedsub = 0;7 A9 [1 T) o1 z' `/ o
  7.     for(let i = 0; i < 100; i++){) C; }: m  v7 B' P; G
  8.         state.number[i]=0;//初始化数组
    ! Z1 o. T, ^/ V5 s9 |" \
  9.     }
    % c" O7 B: ]  J# [% s5 Z) o
  10. }4 s$ k% C3 D0 \" x* u6 G1 I

  11. ' T( a1 k3 m; a
  12. function render(ctx, state, train) {
    # G6 z( ]3 v6 L0 ^1 v
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    1 I0 ]  h* T1 g/ d1 a
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ( o7 s+ u3 r$ M) [
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    8 @4 c! F) U" r
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    2 i( l2 H7 v6 _3 D
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)+ j8 }" W0 [+ z( M; ?) t3 C
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    6 v! M& X% \- @" U
  19.         for (let i = 0; i < train.trainCars(); i++) {
    + i6 _" @, `4 M3 V/ B* Z# B% C
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    & o' [& j8 p5 {+ H# G3 k2 U6 }
  21.             if(state.speedsub<-1){//如果车辆减速
    % j* u+ O% `% X  u' H. \
  22.                 ctx.setDebugInfo("shache",1);//记录刹车9 w6 m) N# k& U. h/ c  _+ R  s9 v
  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
    ( ^1 o+ Q% K1 n3 G4 I
  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
    1 l( ^0 j: x! a6 r& S- a
  25.             }else if(state.speedsub>1){//如果车辆加速
    ) E1 K" R! p+ W4 ~
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 _' ]: T' L3 O+ W
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声! h2 u' }4 \9 _0 Y
  28.             }
    & C+ E! A/ D5 @! Z5 }
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    / b$ S3 F0 Q1 [8 `% W- D
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    + u  u% i4 l7 V. p
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    5 T! V% J( a, |$ }
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    0 n8 M5 R6 g# ~+ L7 Q( b% y* Z, @
  33.             }: p) f. @3 g$ g" r7 `
  34.             if(train.speed()*20*3.6>5){; ~7 S9 A: w4 I- B, X8 \  M# O
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声* m1 m9 {, \! a6 a6 j( r) [( I
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声9 o- t$ Y% m" @" O3 C# n
  37.             }
    , N8 C0 ^. K* g. ^# g* N
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){+ t. v/ }3 C0 `. v
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    7 Z$ x# t# J( g
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    9 I+ Q' _+ h& L
  41.             }, G/ k' j; c0 d$ h. G! g+ _' K
  42.         }
    & D5 z) k2 @4 W' j- C" K6 p9 H5 i
  43.     }
      D& x6 P. `* {$ q- B/ x" C& m
  44.     state.soundsspeed = train.speed();//更新速度
    . r5 y; Y; o: A/ u% C. w+ d
  45.     for(let i=0;i<4;i++){. O1 L/ U8 j+ H" R7 U  d4 E7 X
  46.         ctx.setDebugInfo(i+"=",state.number[i]);$ ]9 d8 ?, t3 O6 }$ O0 p7 w, W
  47.     }
    # Q* P" ]7 |; n! J. h$ @
  48. }
    5 S$ ?+ m2 R0 t  V
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间$ ^9 _  t6 |: F& C. V) p! k: d1 Y4 `0 l
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间: p, ?. a4 P2 R
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放8 _6 l; X. A& a: w
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    # Y  ^6 L0 E+ d! S) d6 u
  53.     }
    + `; n4 j  a3 w3 @. |$ T+ U5 Z0 n% i& s
  54.     return nu;//返回新的播放时间8 J2 E2 N1 e# |4 a& N$ O2 Z
  55. }
    ( P' D/ ]3 m1 g/ j! S8 X
  56. function grnn(min, max) {//随机小数
    9 O5 h) |8 C+ P- E5 L
  57.     return  Math.random()*(max-min)+min;: D  x- b  }' C2 B9 O: f# N
  58. }. y% N4 v7 @+ J
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    6 o# Q3 {* i+ W- [
  60.     // 获取列车从车库开出的距离" Y; B% x- e0 T8 ]/ h4 M8 l
  61.     let railProgress = train.railProgress();/ x5 L" p/ ~; e1 g  Z
  62.     // 获取当前轨道的索引
    2 C& f) X& P# c5 N* m% ]7 P2 \
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    ; j% a$ N( u! V
  64.     // 检查当前轨道索引是否有效
    2 P0 J' q* ~$ r- J% h
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {: s5 ?/ Y+ e: X  }$ g
  66.         // 获取当前路径数据对象2 y5 e) t( j) p
  67.         let currentPathData = train.path().get(currentRailIndex);
    ! }9 M: A; @* y( J4 @1 C3 ]
  68.         // 获取当前轨道使用的自定义轨道名称
    , ?3 P# A: y; Z2 h4 Y4 _& s2 r
  69.         let trackModelKey = currentPathData.rail.getModelKey();( J( @5 g( ?5 F. q
  70.         return trackModelKey;: Q" N2 _2 g; i8 i2 H1 `
  71.     }" z; [, X5 _! f, l( m
  72.     return null; // 或者是一个默认值) M% R8 \8 o  n7 N# y6 V
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
6 x: A2 Y6 A! o: d# I  y5 K
有事加我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  M1 u2 E  U9 X) X: a
bve声音要方便一些吧,他有可视化可预览的编辑工具
2 G* J* w. H2 }- g
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ' e0 @! a# q! _: N7 U; m
- Y+ y" y: }( |. W3 j
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 % z) U1 ^4 x" i" Q& b1 Y" `
huliawsl 发表于 2024-5-17 21:12
. d8 K- @: c; C5 b* R9 L: q5 ?8 j相较于此,我还是认为bve格式会更简单

- H* A6 ?$ o" p$ M6 R🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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