开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 0 s  x8 |/ ]+ B. ?# z
$ L% W/ D* [0 m) M+ X% ]

& W0 u3 q9 [  I6 N& J2 A最近在研究JS 做了一个简单的逻辑来播放声音! C5 ^0 f; Q5 ?
  1. var pit = 1;//初始化音高(速度)# X0 s4 `3 ]5 Q- b0 C
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]% k- a2 r- a7 K1 u
  3. function create(ctx, state, train) {2 `+ ~# w" o/ d: K# w8 A+ R& M7 e: A& Y
  4.     state.number = new Array();3 }; T" `' d7 y" p3 f3 D
  5.     state.soundsspeed = 0;//初始化速度+ S8 i# o2 R- l- c6 g3 q
  6.     state.speedsub = 0;
    ) o+ b5 Q) }# m: D6 @/ }
  7.     for(let i = 0; i < 100; i++){
    , i9 w% _2 k& D
  8.         state.number[i]=0;//初始化数组
    & S  C5 D6 E3 Z  o( `
  9.     }0 E) t! g$ Y, z
  10. }6 ]& Z" r' v) [% ?: A5 r' G
  11.   D* t& i. v# a/ I6 [
  12. function render(ctx, state, train) {
    & c6 k4 w; B1 T) E& D' f; Z
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动$ K  R) x+ ]& v2 B+ j8 J3 Z
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ; t0 @$ J+ @0 x5 h  f
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    ( c# ^* ?/ [/ b4 @3 T  F
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差! t) c9 K* X: R, y  Q4 a
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)7 M# A' o, G; D7 [& t6 d
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    % ^3 N+ {' v# n4 _6 N# u
  19.         for (let i = 0; i < train.trainCars(); i++) {
    - h. e* S& ^; h) J/ c! h
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    ! S3 b% j8 e7 E3 g8 W1 G
  21.             if(state.speedsub<-1){//如果车辆减速
    2 _: m6 E4 r; z  M/ p
  22.                 ctx.setDebugInfo("shache",1);//记录刹车6 l1 x3 i& [$ X! w$ {* B7 ]
  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
    3 O8 [# }9 p: u( K6 R( B
  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
    9 ]# {6 v& }4 N% |1 n. a
  25.             }else if(state.speedsub>1){//如果车辆加速% O+ S1 |4 v5 P% A* ?$ |: A
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    & s* f2 ]. a7 o
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    $ I) @' D; H. N) v5 N. I
  28.             }
    0 h/ p6 t/ Q1 P
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    0 e" N+ Q- L" z, d# J1 D! ]" s
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    % A5 q# V; W0 ?
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启4 c6 ~# s$ w5 W( H
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    & c( g0 X& |) G- W& Q/ n/ ~
  33.             }
      v5 N& Q  ?2 |& X# J
  34.             if(train.speed()*20*3.6>5){
    6 U! q4 h" t6 V- y8 s: Y5 R& i
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声! T& l2 d- h8 c' l
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声0 Q5 E9 x6 \( @& C) K/ c0 m0 W  I
  37.             }
    ! F  v* \5 u5 X! w' w+ L! ]
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){& ]; q/ t/ A/ k' ^) h
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声8 H6 \6 K+ |! N2 I4 i& U6 ^: @
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声0 u8 b) ^0 ]7 d; ?' r) a: x4 |  G( V
  41.             }2 o# [  U( H( _
  42.         }$ O' s0 E! G# D9 ^6 n
  43.     }
    5 F7 _$ L  n, j3 f8 v. M
  44.     state.soundsspeed = train.speed();//更新速度
    # }6 t' U4 J# I4 p7 }
  45.     for(let i=0;i<4;i++){
    5 R" R& T% R2 m) R! S6 k2 Y
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    ) D: s, p6 u5 d5 e% R6 {0 D
  47.     }
    # k$ g9 Y9 g# Y8 X, O7 M8 Z# s& B
  48. }8 }9 l7 _% k$ C- w2 e0 R/ n
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间" H0 s" T4 K: l" ^$ ]
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    0 W/ T* `2 B8 t% {+ x9 Y
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放2 p; E9 d+ _8 O6 w9 y: H
  52.         nu = Timing.elapsed()+long;   //更新播放时间# {& g4 S" B+ d/ y; J
  53.     }" _6 {  K& ^6 h1 n$ s4 \4 n3 ^
  54.     return nu;//返回新的播放时间* F  `, k# Y2 v5 p# `# o3 W
  55. }
    # @9 L6 ~1 T5 G# _1 ]9 g; T
  56. function grnn(min, max) {//随机小数
      X1 [; N8 \- F+ W. s( j+ U7 P3 I7 v
  57.     return  Math.random()*(max-min)+min;4 W4 M* d4 l! K# B
  58. }
    7 A6 j4 H" D3 h' n
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    7 Z5 }! J& K% v
  60.     // 获取列车从车库开出的距离
    + f+ Y2 V( [" V+ E! T* V" q) \/ z- D
  61.     let railProgress = train.railProgress();7 @4 N3 l% P- X
  62.     // 获取当前轨道的索引
    ) y+ o+ w; G) f+ j6 T+ Z+ Q, c
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);8 T( \% K7 t1 L$ m" j
  64.     // 检查当前轨道索引是否有效$ e2 Z" r# a8 v+ K' V$ h0 h
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {' f7 {1 {9 c  O
  66.         // 获取当前路径数据对象
    9 u' P% d3 r5 t9 O
  67.         let currentPathData = train.path().get(currentRailIndex);+ J  w: m9 M. v2 C3 o
  68.         // 获取当前轨道使用的自定义轨道名称
    # ]% s6 n( d3 ?3 }" K6 z4 D
  69.         let trackModelKey = currentPathData.rail.getModelKey();/ p* S4 g* E! i: j
  70.         return trackModelKey;6 V0 t) ?% l; S& K; b4 @6 M% q
  71.     }
    + }$ M# c* @* }0 C
  72.     return null; // 或者是一个默认值
    ; z% |8 K. N8 C: [
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
1 J/ c9 ?% h1 f
有事加我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) v: O# y; J+ z1 z7 z( U! c
bve声音要方便一些吧,他有可视化可预览的编辑工具
8 |( T  M3 K7 [
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
* P6 ?" Y1 {+ j/ _* x: o' W$ L! j% R2 {/ z( N; x- T
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 : s: V8 J. j- T
huliawsl 发表于 2024-5-17 21:124 A# l1 D2 d) c6 ~, O5 ~6 U/ w  w+ J
相较于此,我还是认为bve格式会更简单

' b) W" G  q  F& y, S; o. V🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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