开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
9 k# l: D$ A$ K: L$ _
! \- |6 m$ w' m$ R: i' d
: A* z/ t) R1 z0 N1 g5 a/ p% X最近在研究JS 做了一个简单的逻辑来播放声音
; m& M( D8 j6 w; y
  1. var pit = 1;//初始化音高(速度)
    0 U/ o3 B3 k+ e/ _: ]
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    - @% C) o  R8 b: n4 O4 I+ z- y* G( v
  3. function create(ctx, state, train) {/ o7 c3 n: l, Y, ]$ H
  4.     state.number = new Array();
    # X" F. ^- g: t) \" k. ]
  5.     state.soundsspeed = 0;//初始化速度
    + e. M3 \' ~, Y. C2 C7 {: q( C  P7 g
  6.     state.speedsub = 0;
    / z1 }# N1 F0 k, ^2 n! w2 I% L
  7.     for(let i = 0; i < 100; i++){! _# E! K, Q2 T  f/ M
  8.         state.number[i]=0;//初始化数组+ k  H. }: V6 a# }7 W
  9.     }& p- d& q0 S4 z: S6 B$ C1 z- P
  10. }
    9 b4 b* h2 s! k& p. |; a4 b

  11. / s; G1 v% v& x' u# H
  12. function render(ctx, state, train) {# L" ~# L$ D, h* ^) U" B
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动8 Z& a" A3 k8 ]$ i
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)) r% c( K) K! Q! J, a( A
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    * `) A3 G# R7 j) J' z& e6 L+ T
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    9 @: T8 G9 R1 L& E
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)1 Y0 l. P1 @( b0 s, z( W! \8 M
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    1 |. z/ R( {8 ?" G0 ^0 z: q
  19.         for (let i = 0; i < train.trainCars(); i++) {# ^& c+ Y" I  }/ n+ @
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! F* t) @7 `; d6 r9 |
  21.             if(state.speedsub<-1){//如果车辆减速
    / o. q" N! t9 _: u" P& _
  22.                 ctx.setDebugInfo("shache",1);//记录刹车; M( L: i2 ]5 }+ q
  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);//更新返回时间 播放刹车声在转向架19 |: |2 e; F! {/ }
  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 I8 D; f- k! [5 x* F5 o% v- @. k
  25.             }else if(state.speedsub>1){//如果车辆加速
    0 [/ T- b. h1 w  ~8 i  `
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速/ @- u8 a/ y8 E/ B& c
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    6 J+ @& y9 J) Z& ?7 f1 C4 Q; C$ L; N
  28.             }7 \; t+ u1 ^& L$ ?
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声5 ]7 O2 H8 y% _8 [* u; q6 S
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ; P; N) ]1 q* g# a6 {
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    # h! x6 c; a$ Y8 ~1 H
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右) z, F* {# `) K& o
  33.             }
    9 c4 e; i& @5 P
  34.             if(train.speed()*20*3.6>5){( J; f3 Z5 o5 e$ d; x) P5 ^
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    , M/ |, d. d3 |" F: l
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声0 n) W$ L3 Z2 n' G2 K
  37.             }) q: s* W2 l! @9 U
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){: ?5 L$ [1 z" P3 m. f! U
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声( s2 ]# ]8 p4 j: v/ |0 _
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    2 ]/ K, Z6 V- A( |' V, l1 }+ C+ [
  41.             }, |3 m: H7 V! e$ G% M
  42.         }) \) Q# V  k0 A. v, S" a
  43.     }+ w0 K* q* ?* |8 H' G2 S" G* l
  44.     state.soundsspeed = train.speed();//更新速度  U7 a9 a4 B& l
  45.     for(let i=0;i<4;i++){
    2 `5 J! X' g& y' N6 l
  46.         ctx.setDebugInfo(i+"=",state.number[i]);! R' p/ g5 \1 p8 c, f
  47.     }
    / x1 M2 B* K8 d7 x. x
  48. }% S! X6 d9 H0 v
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间- S/ u# I( B7 U  h* J+ P1 C) ^2 W# l
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; \6 `6 w. X: Q( f
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    " \3 @8 P$ Y9 n: _
  52.         nu = Timing.elapsed()+long;   //更新播放时间5 t6 j% A3 |5 t% X( l, F$ \, l
  53.     }
    ' h0 m0 Q) J, E7 H
  54.     return nu;//返回新的播放时间
    # ~: w( `3 ^! W6 g
  55. }
    * a( X7 {9 V. c/ H/ T
  56. function grnn(min, max) {//随机小数1 V7 T/ |8 `' g4 L; ?
  57.     return  Math.random()*(max-min)+min;
    / _" C. i: y9 e" J
  58. }
    9 L5 \: I, a9 t( G
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    1 _8 h( `* @0 r- B; j& M/ e1 k
  60.     // 获取列车从车库开出的距离1 o2 `7 p7 L" }. b" ^
  61.     let railProgress = train.railProgress();" k0 r4 \  J: p) F) z4 ^
  62.     // 获取当前轨道的索引+ S5 J% L& E' F5 W! K1 k1 C: k+ S
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);- a! w8 C0 ?/ r, G5 G/ t( A
  64.     // 检查当前轨道索引是否有效
    / l* _" ^2 E% O/ A, l
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {- D' U% u6 x2 k; \$ [
  66.         // 获取当前路径数据对象/ c" z) ^6 a+ v* ^6 p* R6 Z
  67.         let currentPathData = train.path().get(currentRailIndex);/ {: q8 g0 \) i8 `& ~. S) y
  68.         // 获取当前轨道使用的自定义轨道名称5 {$ r: h2 W: ]" p0 E- ~5 P9 h8 k0 [
  69.         let trackModelKey = currentPathData.rail.getModelKey();! ?9 b9 a4 B* i
  70.         return trackModelKey;. e' i1 ?* b& }" r6 |7 O5 A, H
  71.     }' U7 J1 ^6 u& @% _( d5 Z4 x
  72.     return null; // 或者是一个默认值
    2 I3 p  n) M3 H9 e. m1 a
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
: ~1 l  `. W6 p+ ~# z( R
有事加我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
" b. {- ]+ m) S7 ^bve声音要方便一些吧,他有可视化可预览的编辑工具

) K, A8 }4 f8 j) o" T/ @7 Y; V嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 % u2 v: B) C; v2 h3 o) [3 h& P

/ r7 S; G& S4 F) B) N3 l$ H9 l相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 + I6 a" o) G$ u6 w6 ?1 C+ w
huliawsl 发表于 2024-5-17 21:127 V1 I$ h& N+ `' D* T
相较于此,我还是认为bve格式会更简单

  j) o+ ]7 A9 S# |0 q8 Q( V$ d3 Q🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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