开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 . \* c* t" r1 I$ ~0 w4 D
  @/ g9 o8 B' [( h

' U4 q) c# }! S2 R8 y最近在研究JS 做了一个简单的逻辑来播放声音
  x3 m9 i* b1 W" {  R
  1. var pit = 1;//初始化音高(速度)
      r$ z4 O$ T+ Q$ ?. Q
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    9 L+ M1 ^) B- M( `) v! @1 c! @
  3. function create(ctx, state, train) {
    " `6 N  _0 i5 v8 A* _. M6 ~
  4.     state.number = new Array();1 l5 k3 |. h" p( w' A
  5.     state.soundsspeed = 0;//初始化速度
    & M) D, z- S3 N. L) }. ?
  6.     state.speedsub = 0;% I* [, q3 u1 s  Q! V2 B0 B, Z
  7.     for(let i = 0; i < 100; i++){
    4 o- l) Q$ p0 p" T8 [1 W
  8.         state.number[i]=0;//初始化数组2 G1 q8 A  A3 X, N1 e1 @
  9.     }$ L6 ]+ n8 q2 r  ^$ v* |
  10. }
    ; h2 E6 x2 k3 k! J, E6 Z
  11. ! V0 P$ @. @% V: b5 J
  12. function render(ctx, state, train) {
    # n3 U4 ]9 D! ~% n
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    / Z: s+ \4 v0 }, X# ]; U
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)& w) r4 t% Z$ g# ?9 w* m
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    : U, C( {7 Z) a* {8 z5 A0 F
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    7 M" F+ F( @+ N) U! C
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    2 s: m) q0 o- t
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作& `" I5 y+ x) q4 t! N
  19.         for (let i = 0; i < train.trainCars(); i++) {
    - v  G: B$ m- |, r3 y3 M, Q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启; Z+ u! P7 M0 d( g7 g! ?/ d$ o7 B
  21.             if(state.speedsub<-1){//如果车辆减速
    6 n* g9 k! g& [2 x' N/ z9 A/ W
  22.                 ctx.setDebugInfo("shache",1);//记录刹车/ D+ d% D. E4 y* w) w  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
    6 l2 b9 Y0 W& G- Q7 ]% N
  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, T9 `% N* y, ~" A, G" r9 q
  25.             }else if(state.speedsub>1){//如果车辆加速: y5 v" v7 N! H2 j
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    / }6 m+ W9 G$ N2 o# `% a/ \
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    7 ~# q7 B/ k3 m* H/ Q
  28.             }
    - C. m5 s! n7 C' H6 x2 X8 K. j
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声/ u' i2 z2 [2 W" q2 H: h/ W2 b
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声' T; t& R* t9 _7 g) c
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启6 |3 w( D! A& [$ Y/ c! b% j8 L( J' d
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右. Z. m  [2 ~! J' _
  33.             }3 Q1 W+ [( i* w4 B; `& N
  34.             if(train.speed()*20*3.6>5){
    * a: U4 ^) z  s3 q3 r) j. S
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    : w8 S7 e& E. e0 G
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    + t7 A) G. l1 f6 ?3 M- r% }
  37.             }
    ( ?9 A2 h( U5 q: N) _9 C0 H
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    : z9 Z& Z1 P$ P0 I
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声7 g" H! h1 Q/ v4 |/ M; i* g
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ) }* l8 Y+ j' }* E  b
  41.             }1 E8 `$ D7 k$ J5 g
  42.         }
    6 T9 q' t- q6 I! N6 q. o
  43.     }* r) q" `& F# E# d5 ^
  44.     state.soundsspeed = train.speed();//更新速度
    8 U2 m4 i( J" ]+ F) j
  45.     for(let i=0;i<4;i++){
    % e, P+ G' ?& m+ Y) G
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    0 Z0 U5 k* V2 ^$ r7 @6 U
  47.     }( n$ }  M$ p) Y5 }' D! `
  48. }
    ! g1 S" B6 J' }4 W4 N( Z/ p
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
      d9 s) |+ s, Z7 r& ]$ Y
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间0 P% X4 M7 h, Q; U
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    9 R7 i4 t- N7 V& t' d* ^+ P0 a
  52.         nu = Timing.elapsed()+long;   //更新播放时间* O! ]# o0 Q5 s* A6 u/ E) e. D1 O( I4 O
  53.     }
    3 i( {2 c9 J5 W
  54.     return nu;//返回新的播放时间
    # z) I5 [' }+ t7 i. P
  55. }
    : C) P, L( v8 U* C$ ~: J
  56. function grnn(min, max) {//随机小数+ s' u; [! R- x+ y
  57.     return  Math.random()*(max-min)+min;1 b* \  K6 q3 R  G! w
  58. }
    5 E, R5 r9 ~2 v" `
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的0 D3 I% N6 }1 j% @: W3 Z
  60.     // 获取列车从车库开出的距离7 `3 M" O, x9 v5 b% Y
  61.     let railProgress = train.railProgress();
    ; V. P0 N! `# W+ ?+ a' A& a) T# f
  62.     // 获取当前轨道的索引
    0 N3 t, V1 s$ F$ t6 l  ?) }" ?
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    . s3 y% U" t7 l% G* b. p' P
  64.     // 检查当前轨道索引是否有效0 T: ?2 |- ~6 S2 n* y" F( F
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    * l7 q5 ^& G0 @$ h- Q* I( R
  66.         // 获取当前路径数据对象6 B3 W  n2 Q$ @- z/ k0 c
  67.         let currentPathData = train.path().get(currentRailIndex);, h: Z& D3 V$ ]$ C  X7 L9 F
  68.         // 获取当前轨道使用的自定义轨道名称" s/ V  j' K+ h  J. x( L
  69.         let trackModelKey = currentPathData.rail.getModelKey();( s8 u$ C5 @. y1 K  D$ Z5 P; W; _
  70.         return trackModelKey;+ b7 v) P; L1 q/ O) }% D+ E
  71.     }
      U/ n9 C& Z) v- k3 V
  72.     return null; // 或者是一个默认值
    9 ]; b- m" p  l- |7 ?
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错, b+ c& N7 [* e8 C' _1 [/ l' [3 Q
有事加我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
: B3 }. j4 f# T. Z+ s# Qbve声音要方便一些吧,他有可视化可预览的编辑工具
3 }' x. f- N1 G# g. X% g" G
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 & s8 J( A6 \" r, P

$ t+ X: L* e  _$ d0 B0 q2 T0 o相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 4 h- B! [: I' r0 ~
huliawsl 发表于 2024-5-17 21:12/ D1 H0 N2 ?8 T8 m/ }" h
相较于此,我还是认为bve格式会更简单

  `* B- X/ D0 b  b2 t🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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