开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
* ?; W9 s/ O' \0 A- f+ n
9 _. ~1 U5 x9 E/ g( V/ Z$ @, I
最近在研究JS 做了一个简单的逻辑来播放声音/ e$ i% C! Y3 |2 X( l1 A
  1. var pit = 1;//初始化音高(速度)# S/ Q" R9 P2 ?% B) ]  E
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]. K: m  A, w! [' Y) G
  3. function create(ctx, state, train) {$ n0 w8 o. n, ~2 P, ?( z7 K
  4.     state.number = new Array();
    + ~  `/ w2 L7 n% w, H& B
  5.     state.soundsspeed = 0;//初始化速度3 z/ B% L" q3 u5 O. i
  6.     state.speedsub = 0;3 X! m; E; W. L
  7.     for(let i = 0; i < 100; i++){  l6 i/ t6 D8 q7 m
  8.         state.number[i]=0;//初始化数组
    3 j- C8 x. [; [
  9.     }
    % V+ x" X& f: _- \! x0 O# }
  10. }  |/ W- {/ X( I0 c1 f- K5 e
  11. " r% A& Z; K; M
  12. function render(ctx, state, train) {
    ! u2 {( ?- I5 [0 P( O1 B
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    . \+ |& x& a% {2 S3 d
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)% G2 N/ H) r! E3 m
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ' x1 p, k3 Z+ u  q: Q5 M0 _& g
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ( g5 ?- w; z) M! q6 f
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ; t( Y( c, j8 S2 H
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作5 M- d5 @+ C& ~; I7 ]
  19.         for (let i = 0; i < train.trainCars(); i++) {
    4 T6 u1 T  v: {* @; L& n
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    # E1 D* t5 n$ `; k
  21.             if(state.speedsub<-1){//如果车辆减速
      e) t" f0 p! V7 v
  22.                 ctx.setDebugInfo("shache",1);//记录刹车/ r5 d8 n* x6 N% [1 @  H, `
  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! Z9 F8 l8 j0 S! ?2 m
  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);//更新返回时间 播放刹车声在转向架28 |# n7 q; o& V" |3 }+ l& ]) ]! c
  25.             }else if(state.speedsub>1){//如果车辆加速. k, h0 ^* D6 O$ K
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    * E+ A9 @0 n) N
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声2 W$ o6 F3 l+ B% E. @- @
  28.             }: P: G4 g7 d* R, f0 I
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声) J' _! m: h  J1 O
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    : D' q$ q& I& K4 c* L0 R0 S
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    - i6 Y3 z. U+ h2 P
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    5 O! S$ d3 m6 l- ^6 G6 S$ l0 Z+ L
  33.             }
    / ~3 j& c5 d  P9 g; ?3 \& w4 G
  34.             if(train.speed()*20*3.6>5){" V6 d' U( {8 H
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声, c8 M3 e! E& x1 x9 U& E3 ~
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    2 j# m! [  O0 B
  37.             }
    2 j9 J2 _' w! D: E9 v2 [/ E$ Y  E4 |% x
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    7 D$ C5 e0 L2 v; I, Y' r" i' y
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    $ h1 V- W7 v+ ~
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    / [1 z% @  L* R' L9 p
  41.             }) x4 g. T9 I7 h: c" ?8 F5 R
  42.         }
    ' P4 ?0 y) G* q6 i! `# |
  43.     }
    ; {: h; f6 j9 \( R/ x0 T# {/ a
  44.     state.soundsspeed = train.speed();//更新速度$ F/ H; G4 R; X9 U
  45.     for(let i=0;i<4;i++){$ ~. G. S9 o6 I+ E6 h
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    % x" Y  J( g- @% \
  47.     }
    . i$ ?+ G; Z% C) t9 e* I
  48. }
    - v& i; x  H9 ^3 N, s1 O; L5 o" k
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    9 X$ ]5 Q0 w4 W
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    7 L! B! h& L: @- D
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! v% R2 @. k3 j/ b* |
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ' a/ @- N1 _1 y2 p0 Z' b8 Z
  53.     }( N% @( K0 B  `
  54.     return nu;//返回新的播放时间3 o, S* R# W& q  u5 S: ~5 ?% F
  55. }
    $ B/ j! f: o& J+ T# ?" m
  56. function grnn(min, max) {//随机小数* m7 D  d* g. t! W3 }
  57.     return  Math.random()*(max-min)+min;, O( v/ o* A5 @2 x* Q; U8 I
  58. }# G8 c; y  Y: R7 L. t. O& H1 g
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的, ~8 ^; V+ I1 s- V3 x
  60.     // 获取列车从车库开出的距离
    0 F2 @6 [. g! C( L+ A
  61.     let railProgress = train.railProgress();
    % ]" O" A6 Z! i6 p* A; r* G
  62.     // 获取当前轨道的索引
    3 x7 ]- [$ [3 {( Q" O; P, n/ s
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);( L+ P. ?1 @, T! d) [" W9 Z
  64.     // 检查当前轨道索引是否有效6 N! N* p3 f1 t8 l
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {  t$ ^1 _$ Z! E" y3 H
  66.         // 获取当前路径数据对象
    : Z: @/ ^* Q% [- k
  67.         let currentPathData = train.path().get(currentRailIndex);9 y) {  r, v8 e* O8 m
  68.         // 获取当前轨道使用的自定义轨道名称
    ' Y! b! L* f+ |& N: z! x/ A
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    & W. j: I, d4 H# l- l
  70.         return trackModelKey;
    4 z$ H4 _& Q- M* x" M7 {) O  p
  71.     }! I' ?0 w0 t! \* e
  72.     return null; // 或者是一个默认值5 t0 }. \1 s& ?, z3 `- p7 \
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
* Y: `2 s4 [- _
有事加我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. Y0 L  |& n$ F/ e+ g- H5 [, ]
bve声音要方便一些吧,他有可视化可预览的编辑工具
8 {& M: T; C# f; q+ F0 b
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 % Q( }! y5 [7 n2 H% h+ b4 }& K
# t! N6 l! S+ {' J4 Y
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 # Y1 T$ P; G# ]- p0 s. n) ~1 [
huliawsl 发表于 2024-5-17 21:12& W; |$ W' H% s9 i) j
相较于此,我还是认为bve格式会更简单

/ j, E' I$ m+ v1 \: J🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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