开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
9 t+ m6 a7 J' d) t8 o( w
4 ~1 K. M5 g; t1 G
5 d* F3 ?& n8 ~% S) K最近在研究JS 做了一个简单的逻辑来播放声音
9 y! \9 h4 K) \. t* j) f
  1. var pit = 1;//初始化音高(速度)
    1 o9 p+ e% Z2 J7 z: k7 s# o9 k
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]8 ?% S. S7 I* |! }+ Z
  3. function create(ctx, state, train) {
    3 z; N' t8 v& L
  4.     state.number = new Array();, W3 O9 D: ^& `  l$ }6 y) e4 G% S4 n
  5.     state.soundsspeed = 0;//初始化速度
    % f) f# T: m" c5 s8 r: H
  6.     state.speedsub = 0;
    , f  w3 K! h7 G1 |4 T
  7.     for(let i = 0; i < 100; i++){, {8 l8 _( x" V6 x1 Y
  8.         state.number[i]=0;//初始化数组
    ) e, G5 `2 a% q: W/ w
  9.     }& k+ z, X4 X+ l& q
  10. }/ R! h- @* Z  ~2 D. d8 d$ F

  11. . }" X2 e6 r+ v/ ~- L$ @
  12. function render(ctx, state, train) {
    $ j" z) J! t2 G9 s9 K
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动. X+ }6 b1 F* z6 c  g' E/ r
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)# T8 I; R! P& z2 w9 k' K, x
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    $ P9 S8 g+ K, C* }, i% d
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差+ f& G9 u) W4 u- A
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    ! x6 e9 W, d6 F2 D. s8 T
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作2 M. f- @- I  c+ ^* {5 R( u
  19.         for (let i = 0; i < train.trainCars(); i++) {
    8 _; I% P+ S( _2 g/ H3 T9 j& q
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    4 Z7 S4 ~8 A8 ]: \/ ]/ f
  21.             if(state.speedsub<-1){//如果车辆减速
    + I6 w% h  Z; [" J/ p
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    5 B2 ~0 j1 l" j; ?1 K- N
  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);//更新返回时间 播放刹车声在转向架11 S( C3 v+ f$ _( Y4 t4 W" L3 G7 w
  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
    ! y3 O0 d2 O$ A
  25.             }else if(state.speedsub>1){//如果车辆加速
    6 t( T4 _# S. N
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    ; F8 J6 I- [8 P. z6 u. ^& l) r6 t
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    , I$ e1 z3 @6 }4 U3 d
  28.             }9 p- y" i9 ?$ I3 ~" I% g* ]! u" ?4 X
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    4 Q# Q& C5 O- \2 A& o
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声, t# C2 H2 ]* H
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启. G6 `& V2 _7 ]! P4 g2 g9 a. {
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右8 W$ l, Z3 d* y/ g
  33.             }% E: J7 |4 f2 D" N; J
  34.             if(train.speed()*20*3.6>5){
    3 U  A+ t1 j5 p$ b! Z4 E
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    4 d( y3 r) Q$ t) d1 S3 B3 C# K9 c
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    - O( f5 e9 A$ q+ [. D7 W3 P& ], B
  37.             }
    . Z/ A8 |" N: L
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){7 B( r# p; e0 s. e( P# D
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
      G. G5 W% B" x2 |
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声) o& K% I8 ~, \
  41.             }
    # q! E- F& @% v/ w/ ?$ _# |+ o4 i
  42.         }! L' m( M8 p7 ~4 [2 e; [9 l
  43.     }8 o% m3 H9 q4 k% I* l; F9 S
  44.     state.soundsspeed = train.speed();//更新速度3 ~! U; i7 l6 U: M
  45.     for(let i=0;i<4;i++){
    ' x  g7 \6 s0 j) V' w. H
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    / p/ U! d) D" k. t
  47.     }' W3 Q2 A; s$ J! p" l, P
  48. }
    8 d9 T9 y- t- _8 m% T* y' K, ^1 e. L
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间  }" H* ]. g8 Y0 w2 i
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 v, _' q6 S( D; G* E6 j
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    3 T7 ?( m. K, V7 [
  52.         nu = Timing.elapsed()+long;   //更新播放时间2 h6 Q, h0 b! T  T7 S: B/ d
  53.     }' G8 i0 U* j, y! G
  54.     return nu;//返回新的播放时间$ p7 T- k$ b/ z) I1 y! e
  55. }
    8 e" U) Q8 R  a; T
  56. function grnn(min, max) {//随机小数
    0 _4 X: z* W" P; R& O7 |: o4 d
  57.     return  Math.random()*(max-min)+min;# A! W$ ~% A9 p. o
  58. }  k8 V' h. p$ r: e2 j' P
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    " J( |2 a/ H6 Z- U) A
  60.     // 获取列车从车库开出的距离6 g! l0 R; b4 X( u. L' I! k
  61.     let railProgress = train.railProgress();
    . g# _7 l5 ]3 e3 R- r
  62.     // 获取当前轨道的索引- ^3 |' H: I6 w
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);5 u. |1 |: q- u4 }* n& @! n3 E: y: q
  64.     // 检查当前轨道索引是否有效, l; U" s/ x: n; l9 C
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ( [1 u1 |* }8 J& \
  66.         // 获取当前路径数据对象* c, }+ R) J# B3 Z1 W
  67.         let currentPathData = train.path().get(currentRailIndex);
    1 a0 U; m3 _' w, M, q
  68.         // 获取当前轨道使用的自定义轨道名称) i0 i- E: Z  `, a6 N; x2 a1 r
  69.         let trackModelKey = currentPathData.rail.getModelKey();
      l, v! m! I+ p0 `- i$ q, l$ E% T
  70.         return trackModelKey;
    8 ~9 [) D. F( p, {- _% F
  71.     }
    # B7 Z9 I8 j; |* _7 M
  72.     return null; // 或者是一个默认值
    + ]& C& u6 B7 _: X' v2 {
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错  A& N4 d: X0 ?$ s  W/ z  E/ P
有事加我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
( K0 Q' W! |3 T$ V- @bve声音要方便一些吧,他有可视化可预览的编辑工具

; W1 M* Z" o# Z- k) o* m/ I嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 2 e2 C- }. r$ C) `/ w+ Z' e
6 P' C, D6 y  X) Y9 r6 n' |; ~2 A1 ^
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 # k& P+ {/ A6 {* j. \
huliawsl 发表于 2024-5-17 21:12
. j& D3 v7 t' J" U2 W4 D+ n8 u; R相较于此,我还是认为bve格式会更简单

  g5 a  ?' K! `" a9 `🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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