开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
# b2 R; Z  K, g9 N5 v6 D9 o& E/ P7 W

) K& t2 I8 N$ h, e( ~最近在研究JS 做了一个简单的逻辑来播放声音
, w/ O# H# |4 U- q& `& _" d# `
  1. var pit = 1;//初始化音高(速度)
    ! d7 j, {+ p2 `) ], Q+ A
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]% |( d5 C  |% Y1 ?
  3. function create(ctx, state, train) {  z: u- v& u  U2 a6 J# U' q' J4 }% P/ \
  4.     state.number = new Array();
    6 V- k, \' X) ~4 L
  5.     state.soundsspeed = 0;//初始化速度
    ! ?6 w3 r. r* j! z$ w7 L
  6.     state.speedsub = 0;
    0 X2 o4 q% _7 e* Y5 \2 i4 j
  7.     for(let i = 0; i < 100; i++){
    2 d2 P8 O; Z# n, H% z& J2 z* F5 W9 }
  8.         state.number[i]=0;//初始化数组
    2 D/ u- J" ]# a& {# {" e, m8 p' c9 X
  9.     }" g' e! L, ?- t& ~2 B! X
  10. }
    7 l3 p7 Y( I: n6 z0 i
  11. " C3 D1 ~' Y3 _# \- w: X3 O
  12. function render(ctx, state, train) {
    & L# L5 }) z/ g: T1 z
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    9 k9 ]6 V! u6 K
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)( K) x  N, e$ ~
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    8 g1 {5 [6 ^6 W1 o+ S
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差+ s3 D# o" z. I" b0 k4 O& p
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)  }5 e2 d6 d  @
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作+ J- Q2 X3 C) c  Y5 ^- G
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ; ~# e7 _3 J1 |8 X
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启2 F) d: C1 K! ~0 I' U
  21.             if(state.speedsub<-1){//如果车辆减速
    ) {8 a& t* Q, ~- w; n% g3 {
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    2 r5 r8 Y" k- o. e' o# y1 m% G+ b
  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
      w6 A0 H3 r9 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
    - V- l7 k4 Q2 n6 F1 U( Y( j
  25.             }else if(state.speedsub>1){//如果车辆加速
    ) r; h) M. f' ^
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速! C4 R9 m& u- d. V5 i9 ^! _
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声/ r. t) K# e5 n% h) w* j; e4 }! v
  28.             }% D) p8 A$ l  ]# r
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声- ^* \  y" e3 \# r2 [  t8 [
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    : E2 g  ~5 E# z
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ( A/ _; b# j/ \  C" E
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右0 s1 r4 k# d- b  n# V1 J
  33.             }
    ' x, e3 |6 b- O6 x6 d5 x3 W
  34.             if(train.speed()*20*3.6>5){
    - d( R+ `' C6 u, q! {2 ?
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声  Z) ~1 x% f9 y+ e
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    3 K/ N' q$ Y) o7 F
  37.             }% R" D* i! v, s" F' M$ P, L
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){  x7 c& ^* [+ @* G0 t/ o: C7 ]
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    9 c1 M  y+ }) k' F! S! H
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ! {9 Q% i9 Y3 L8 a; ~
  41.             }/ x3 M0 R' R+ n6 @5 M# B
  42.         }% X# b$ _# U; Y" d% |" R  x2 o# k
  43.     }6 |2 c; ?3 k0 u" b+ L/ h3 ~
  44.     state.soundsspeed = train.speed();//更新速度
    ( ]3 L! X) }" M; L! D
  45.     for(let i=0;i<4;i++){2 ?# F1 l$ W3 ^5 c% d& O# i
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    / n& ]/ L5 z( V) G
  47.     }0 x4 y& m( c( }, B  f7 G
  48. }
    2 V! S  }$ ?7 d) I- L" X
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间) }8 x3 ^/ R4 I6 o& v2 ]# J# E: v
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间+ A& |! U0 e0 }$ y6 a
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放; q1 _" b5 \( M. r. o& g& i
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    0 a7 @" _& z9 m7 e+ ?, g
  53.     }+ ^. [7 Y5 {+ P: w- W( Q3 C* t
  54.     return nu;//返回新的播放时间) P, g3 F( l' z5 o. m
  55. }: v9 [  `9 K# a, Z7 [, n
  56. function grnn(min, max) {//随机小数8 S; T3 O4 c7 W
  57.     return  Math.random()*(max-min)+min;
    1 m4 ?# |4 B+ D$ b# n, c) T
  58. }" N  {; S% V5 k$ f* w6 @
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    $ {" J( m2 n, j7 m, k( {) S* B
  60.     // 获取列车从车库开出的距离. g& l- o6 u9 V% i
  61.     let railProgress = train.railProgress();
    ) a5 A! w, L$ j6 O+ {7 d: P+ i) D
  62.     // 获取当前轨道的索引- T" B& t3 R- q) U8 s: [
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    ( |6 x9 J' G6 T6 @' x- [
  64.     // 检查当前轨道索引是否有效
    ' J* T! v5 g' `( w
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {# J2 A) B  i6 \8 U
  66.         // 获取当前路径数据对象
    : }- t2 u/ m) @0 F
  67.         let currentPathData = train.path().get(currentRailIndex);
    3 N8 @0 X- M/ E% M
  68.         // 获取当前轨道使用的自定义轨道名称
    ' p6 A0 `$ T* B9 N9 Q( P7 L
  69.         let trackModelKey = currentPathData.rail.getModelKey();$ w) K5 i4 A2 c0 o! {9 F
  70.         return trackModelKey;% o; {- p$ l4 s6 i
  71.     }" S/ C$ \* M! {( h2 m
  72.     return null; // 或者是一个默认值% d( A2 K1 \  ^2 [  t3 f7 P
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错$ z8 z( e2 g% f& 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
: G- C: G2 [8 c$ _bve声音要方便一些吧,他有可视化可预览的编辑工具
; T2 s6 F% V$ h
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
  K: P+ C- K1 m2 t+ K- p+ @5 R1 B0 H/ ?$ o- }5 z' U
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
& b/ r) D# o/ D# ?
huliawsl 发表于 2024-5-17 21:12
. T9 u; N+ Z; y' I& w5 j相较于此,我还是认为bve格式会更简单
; o9 U/ L. a, M( M/ V
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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