开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 9 d6 v. U: n6 N3 y/ Y: `* B& @* }- N! w

4 r, c( b9 i5 x
. v6 k  F0 g/ i最近在研究JS 做了一个简单的逻辑来播放声音
, q" Y: x" p" e! r7 @
  1. var pit = 1;//初始化音高(速度)' G' F% I4 g; h7 }  L
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ u: [( f4 b9 W$ x
  3. function create(ctx, state, train) {
    * h0 K: G$ j+ O
  4.     state.number = new Array();4 e# H, {2 B8 |5 Q( H/ ?! J4 J1 q) [
  5.     state.soundsspeed = 0;//初始化速度1 D/ `* c  o% w
  6.     state.speedsub = 0;
    ; c# V. ^/ G7 v+ E  d$ j! C
  7.     for(let i = 0; i < 100; i++){
    3 M9 P2 t- h( e- |6 D
  8.         state.number[i]=0;//初始化数组
    " c4 Z9 S4 v. s! G1 y% c2 R" p
  9.     }- Y  q1 M) T# h& U. m
  10. }( H0 u- j5 h7 {1 h

  11. 5 s  `) i) m: x: p
  12. function render(ctx, state, train) {* A' d# T0 i7 O9 G, E) T3 o7 g
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    , ?4 E  H. E5 A9 L0 x: t: C
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' S8 Q" i7 a3 \0 ~' `
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    1 ^* u1 m& }$ v+ ~. B
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    6 O  j% s* j8 u; j; G5 q+ F: A
  17.     ctx.setDebugInfo("speedsub=",state.speedsub): d6 D2 N  E( h* |1 _
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    + J$ p' ~" N8 o: G" @  W
  19.         for (let i = 0; i < train.trainCars(); i++) {
    * _) k, `0 R2 k! G/ a
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启# R2 {( A/ S0 ]$ a% @! K
  21.             if(state.speedsub<-1){//如果车辆减速2 a% M# ?4 z" `' \# A
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    1 _- k$ v; |4 S0 D2 f. T1 U6 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);//更新返回时间 播放刹车声在转向架1
    . ]0 O  h' C9 `0 {) q
  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
    $ a2 k/ j5 {) z' o1 W8 E  p  |
  25.             }else if(state.speedsub>1){//如果车辆加速4 o2 e% h9 }! h1 {4 [
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速, w; d, @" Y# L4 \2 n
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ! `7 c4 P7 O+ Z* V9 U) \) ^
  28.             }0 s4 L: @8 R9 m! w+ A' R
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声. W+ W  y, u4 j7 R0 C# @2 u) @/ _
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    " m1 W9 T; [2 t+ L
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    ; F! J# x0 L5 `6 |1 M7 k$ ^
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右- q) S" x7 F8 C3 p# c
  33.             }
    - H9 N7 }( M: n8 W0 w, @
  34.             if(train.speed()*20*3.6>5){7 Y! E1 c/ W& `; c% p
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    3 W9 B6 u8 K9 j4 i
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声1 ~" R8 a% F. X6 N
  37.             }
    8 x; F% v" `' w$ H" T" F7 F
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    - W! `6 F2 n/ T1 c# m1 T
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    # k' \( c* x. B( \$ W2 h
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    * z, f% U6 v: o& @* b
  41.             }! z5 f2 |  a. s" Z' n6 ^
  42.         }
    * K* X% z( }+ \7 s/ T
  43.     }
    ! O9 [) J0 Y' R
  44.     state.soundsspeed = train.speed();//更新速度
    ' W# c. K8 d, p9 M. I# e
  45.     for(let i=0;i<4;i++){# T3 p" H8 {% e; X2 }
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    " l/ j7 }3 B  [$ b) ]; G, M' O, J
  47.     }
    " z. q1 I7 v; x) R5 ]3 E
  48. }
    ( S! S' i! @7 y( |
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间+ I% k- p% f7 Q" k! V
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    0 I  F6 K, M" c# r
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放* v0 r7 {4 u5 c. _3 S: q
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    " T: ~+ U( I' m2 z  t' ?
  53.     }
    5 j' z0 A( e$ f0 }
  54.     return nu;//返回新的播放时间' u, P& f* z0 O
  55. }7 \0 J6 K3 R4 {8 X
  56. function grnn(min, max) {//随机小数- N. S# A* E3 Y8 j
  57.     return  Math.random()*(max-min)+min;
    # i/ [. Z% M' x7 a$ v
  58. }+ x2 t7 f0 L6 r; g) b" c
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ; _/ |* d2 f- l9 C: l2 c, m
  60.     // 获取列车从车库开出的距离5 V4 l: t& Y, @) e$ z3 @
  61.     let railProgress = train.railProgress();, h( u, ]) b+ A# @, Y2 P( R! Z
  62.     // 获取当前轨道的索引4 f- x$ N2 c* q
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    4 I# L1 F( H* b' Q% Z
  64.     // 检查当前轨道索引是否有效9 Z& v& V0 y! A" I  A) j/ {0 ^
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    & w$ j8 O# h# f# b
  66.         // 获取当前路径数据对象6 Y. e  z3 \! q# D: N7 F, G, f% F
  67.         let currentPathData = train.path().get(currentRailIndex);% I2 G, x/ v/ {" N' I
  68.         // 获取当前轨道使用的自定义轨道名称
    ' }2 z( i2 b6 ~; _) g/ S9 N  i
  69.         let trackModelKey = currentPathData.rail.getModelKey();1 j% Y( s* P2 ?
  70.         return trackModelKey;" [6 `) C9 e/ e, G
  71.     }1 O6 b& L, G* D+ t% E' u
  72.     return null; // 或者是一个默认值
    # v! s6 M+ u( |! t. l. v1 _+ l
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
6 Y. h* L+ R7 V+ }
有事加我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
: J6 K) U3 G$ Hbve声音要方便一些吧,他有可视化可预览的编辑工具

& n0 B) x; `" w: c! p; n嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
+ f/ t+ a5 L+ b0 T" S# Y) n1 ~* F- H$ ?: f4 V
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 - n6 f0 p0 o7 |% k1 ]3 c% O* l
huliawsl 发表于 2024-5-17 21:12/ S+ K; m, ^8 F1 e& K+ |
相较于此,我还是认为bve格式会更简单
+ S8 O3 j" R/ l7 [
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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