开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
# I" N) }6 e3 w! `; d+ L3 C
  ]+ Y" m  b; j0 E# Y' P2 R2 E' @" e5 t% M( c# j
最近在研究JS 做了一个简单的逻辑来播放声音. w" S7 H3 w. g' c( h1 K
  1. var pit = 1;//初始化音高(速度)
    1 `$ |8 f1 e% H
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]- ]1 r- B1 g. |+ y- f
  3. function create(ctx, state, train) {
    8 n& k- V5 W5 g  e' K1 l2 O
  4.     state.number = new Array();
    3 }8 Y* A- |! g
  5.     state.soundsspeed = 0;//初始化速度
    # `; w1 n7 j1 t3 E) u$ z1 l) [& q
  6.     state.speedsub = 0;
    " \" k5 M6 r- V7 A/ F4 Y
  7.     for(let i = 0; i < 100; i++){
    6 N' y5 \1 Y* a' f
  8.         state.number[i]=0;//初始化数组) J% ?1 E$ G, I4 @1 @$ k& m
  9.     }/ u4 t- Z5 J1 l: m
  10. }9 g# r' E* s# }* U4 ~6 l  }% S

  11. 3 U3 L; x" ?2 F' Z
  12. function render(ctx, state, train) {
    6 ^' m' Q4 u: S, V$ `
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动* e0 W! U9 ~% N" W1 \& U
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)2 l; a: M/ w# B6 D" l& J
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    ; W. Y2 \( L2 U" I. i. m+ H5 o
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差: k* u7 T" p* p" d1 |
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)( X. d3 {/ U& v$ [+ U4 ]6 ~9 P
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    9 c: P3 v5 x. @/ O9 A: ?- f& B- k/ |
  19.         for (let i = 0; i < train.trainCars(); i++) {" `* T( i, h6 w5 ]- @* L3 d, x2 M6 W
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    1 H, ^6 u  ~  x
  21.             if(state.speedsub<-1){//如果车辆减速. ?8 R  P; v; h" ~
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    9 X6 r7 N2 N  D; F9 p
  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);//更新返回时间 播放刹车声在转向架17 W# a( h: Z- A- F5 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
    " b. E6 v6 ]" ^& G6 z2 p9 c
  25.             }else if(state.speedsub>1){//如果车辆加速
    + n, P( B. W5 ~% @" K, l) X
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    - s. v2 Z/ i5 v, e8 L8 O
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    " p( n# T; @# z- F- b
  28.             }
    1 O- n: D2 ^5 U% Y. K6 c* S- R0 U) ~
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声' |' b6 r* R. N6 ?1 o. F$ U- E
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    ) T" @+ |" ?. |% U
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启- A( p4 Z+ u8 }# x7 q
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右+ x4 d) a2 _  n  J4 B/ ^
  33.             }* H( B( u+ k: G
  34.             if(train.speed()*20*3.6>5){
    8 e  a  o9 d. Y$ z) _
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ) ~3 g7 O9 a$ c& o2 K& ~5 i
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    % x5 c; N8 h' M1 T# }
  37.             }3 R" c" S* R5 r4 @. o
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){* @* @+ e: G" |* I$ p
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ) a7 u* K: A7 U4 a
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声* M5 U$ @* R' i7 `9 @( r: s7 O, j3 v
  41.             }
    - z0 H6 f" N. L( |- W0 A0 B  g  C
  42.         }) N1 K7 c! |9 v0 x1 I
  43.     }
    * d. G% r7 G6 N6 W" E( s1 X
  44.     state.soundsspeed = train.speed();//更新速度
    & k7 k! {+ d  F9 |- _
  45.     for(let i=0;i<4;i++){8 o7 R* t; h. N. x) i( `
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    % P: p5 g/ L6 ^5 y* d2 A, [
  47.     }
    ' X+ j0 E$ ], k( L
  48. }
    0 A1 @" i  A1 A' F/ s9 y5 X! z; q8 ]2 U
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间% S: Q# A  h& s
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间; `2 Y( j, {  F& k' v9 V' N! q& A
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放" e4 b4 u3 _) v  S, z
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ( w; D0 r3 x0 h# F& f7 V0 E
  53.     }
    . Q& U) z) j- x: r% M1 `$ L
  54.     return nu;//返回新的播放时间7 B$ w0 ]2 E* ~+ R5 Q$ ]
  55. }
    ' ?# ^' F( m2 o8 j
  56. function grnn(min, max) {//随机小数
    9 |, u! C0 b- Z9 Q0 T
  57.     return  Math.random()*(max-min)+min;# g* P$ J7 ?: B
  58. }
    5 `- e* Y, [; ]0 t
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的$ g, n( G, x8 v; i$ Z
  60.     // 获取列车从车库开出的距离. i) |( i/ R# c  s2 b0 C7 N
  61.     let railProgress = train.railProgress();6 v* k4 a. {( L) Y7 R- L+ s
  62.     // 获取当前轨道的索引
    # m9 I! Z. X& {0 l# F( X' [
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    # Y& |/ z; b# i5 \$ k
  64.     // 检查当前轨道索引是否有效
    ; k# g& A) B* B, f
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {! p6 N: b; p2 B) i+ _" d# O. U' m
  66.         // 获取当前路径数据对象) o5 v# C& X1 B6 `+ K
  67.         let currentPathData = train.path().get(currentRailIndex);
    1 e1 V  Y" L% z+ R$ y6 ?
  68.         // 获取当前轨道使用的自定义轨道名称% R2 m1 F+ b% `' y
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    3 ]" T: X; @4 o4 e
  70.         return trackModelKey;
    6 E: w; D8 Q1 R8 F
  71.     }
    0 b: a: D( {7 _( d
  72.     return null; // 或者是一个默认值
    6 Y# v  j# ~: y3 h
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错1 Z& U. e) g2 A8 H8 G/ B6 Z
有事加我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- A1 {( ?" [' N3 ^
bve声音要方便一些吧,他有可视化可预览的编辑工具
0 F/ N, R# ]* J
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
6 ?$ v5 S) s  K+ |& J7 ?
  H. K3 f( C6 [相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 $ w3 S/ U( N" H5 n; T
huliawsl 发表于 2024-5-17 21:12
- k4 j7 o% b. `3 V0 M' r相较于此,我还是认为bve格式会更简单

$ l9 A8 }  J% N' s+ K🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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