开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 , c$ V# j- j" P! {7 h
) y8 T5 F3 M6 D0 }" l

; d2 _! V2 R; ~6 m1 \最近在研究JS 做了一个简单的逻辑来播放声音" O3 g5 o: J+ ?. P: q' @
  1. var pit = 1;//初始化音高(速度)2 h2 I+ q. ]% x8 B" b5 R) `8 x; P
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    * W, p8 i4 T; v+ ^4 g
  3. function create(ctx, state, train) {' a0 _7 _# W7 q
  4.     state.number = new Array();" ~8 t9 ?8 E  Y5 ?( a
  5.     state.soundsspeed = 0;//初始化速度
    : i& ]/ V3 ?9 M& _( x3 \
  6.     state.speedsub = 0;
    " _+ X; Y: g6 E
  7.     for(let i = 0; i < 100; i++){
    & H$ q4 q4 C) v) _1 T7 H
  8.         state.number[i]=0;//初始化数组
    ! e/ q$ Y: K  ?
  9.     }
    . g# r0 R" R6 m! o' [+ z; ]! p2 L
  10. }
    0 d) g& U2 m+ {! k/ [
  11. , p% O) B7 @/ T: U0 c
  12. function render(ctx, state, train) {1 i! \, L7 G4 l# W* a# Q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动, v6 ]0 E3 h2 X+ `- G  _1 i
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    . k* m% H2 o( D
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ) R+ z; }% B8 L% d; ]) b
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    0 m* @6 B0 d5 P$ s% _; d
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    / k: u# [) A' Y: n# R: I' m
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作* t) o% Q9 S- W. ^0 ^; g
  19.         for (let i = 0; i < train.trainCars(); i++) {
    1 L/ D" x" m' G7 O6 y8 G$ `6 y
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启8 v7 _9 c& Y8 V0 Y) m
  21.             if(state.speedsub<-1){//如果车辆减速
    2 C  w; g# Q7 M$ `9 s- L1 g: _/ K
  22.                 ctx.setDebugInfo("shache",1);//记录刹车& |1 Y7 s7 [5 @3 P1 [
  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);//更新返回时间 播放刹车声在转向架15 |9 O. L$ H. ]
  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: d+ ?; c9 }# F: p7 E3 Y# E
  25.             }else if(state.speedsub>1){//如果车辆加速
    6 `' w1 }: Y# ^- C2 k3 h! c; b" q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    & z$ o- W4 m  q/ V9 Q
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    4 x% C' {7 B. t
  28.             }6 A1 ?8 W5 s+ x* t7 v6 R% _& P
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声* M0 L; ?/ y4 k' B
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声  U# h( R- Y. I0 ~( b- X
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启: f: |- T, R( D  r- }
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    ! T7 b: M2 D  J; v, m# v$ k! R! H
  33.             }2 l0 P! A/ \, h+ U/ A
  34.             if(train.speed()*20*3.6>5){
    : I% x: }: u( n' @: Y1 e
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    8 |; U# m- V: a) A' Q0 f
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声: N! I  L2 `' U' u
  37.             }
    3 F, p7 A4 Q# U# L$ b0 c" n! o- o
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){0 C- u7 Q- h9 z3 Q% x0 K
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声. i: d- B  L3 m; [2 M  L
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声8 S  T7 [/ ^8 y) ~; W; G" w
  41.             }) m0 q6 b& y5 M+ ?
  42.         }
    % `/ |2 ?4 S& `/ J& Y! r- ?
  43.     }" T. t- }, Y! ]
  44.     state.soundsspeed = train.speed();//更新速度
    $ Q+ J$ ~  O( W) e8 G% v
  45.     for(let i=0;i<4;i++){5 q! ]  Z5 Z& E5 z( l' @
  46.         ctx.setDebugInfo(i+"=",state.number[i]);% Z& ]- C" `1 n9 E" t% i% A
  47.     }/ f, A. a! V( k$ K
  48. }1 G8 }& Q. D9 `: ^: n4 M
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ; K1 S: P7 L. L/ ]; t
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间1 W; u0 `+ n( d0 e, X! N# b
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放: b* p/ L5 x" @) i: j, l+ p$ }
  52.         nu = Timing.elapsed()+long;   //更新播放时间, T  I) f" r% b7 c2 l) Q. {
  53.     }
    - l6 ?/ @  t& Q7 S7 m
  54.     return nu;//返回新的播放时间' j2 I( A! I; Q
  55. }
    , [1 F/ s& b  _% }( z# x
  56. function grnn(min, max) {//随机小数7 d2 N/ ~4 _, s( D1 `; W. Z, J0 S+ B0 d
  57.     return  Math.random()*(max-min)+min;# q' [0 h. ?" H+ W" d  g0 |8 \
  58. }
    - b, b% S4 V1 z$ n4 `7 B
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    / G% g) E: v5 p/ F, L
  60.     // 获取列车从车库开出的距离
    6 B' y2 a  }  a6 e- K& q9 l$ [8 I
  61.     let railProgress = train.railProgress();& u6 q3 V0 i$ E% u9 F
  62.     // 获取当前轨道的索引# m) J, m1 Y% g2 ?; Y
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);9 x" K3 F$ y& G: r# H
  64.     // 检查当前轨道索引是否有效
    - s0 I8 r( u+ T$ K9 D- q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {" }8 _# X# o' f6 k, I1 f( r- Z0 {7 W
  66.         // 获取当前路径数据对象, F' t' r$ S  k8 K& s$ b
  67.         let currentPathData = train.path().get(currentRailIndex);( {+ S* J; ?) J
  68.         // 获取当前轨道使用的自定义轨道名称' G( t& z0 ]$ l8 p/ S5 a5 j
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    , Y0 G2 H1 O6 Z4 D9 W- X/ P& @" G
  70.         return trackModelKey;2 t& B* s  ]# I& X1 T( Z
  71.     }
    : g. J/ C" w: t% l" U
  72.     return null; // 或者是一个默认值
    9 J- z! F" _9 |3 [* O6 x
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
5 }! E2 |. n- u+ @
有事加我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
2 p; K* F3 _( g0 u- L1 ?bve声音要方便一些吧,他有可视化可预览的编辑工具
3 e8 t4 k! W0 x  Z* f* n- u
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
/ e$ s  m9 @8 h- {5 N) F5 ^+ Q# }% Q1 p: \, d
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 4 @7 u2 Z: Q2 X" _1 F5 N
huliawsl 发表于 2024-5-17 21:12$ L; }; e% n7 \# K0 P2 X
相较于此,我还是认为bve格式会更简单

/ |) N5 ]. r4 @4 {& \- ~🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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