开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
% X( o8 B4 ~: J+ S! F" ~; `5 A6 z- h% d# s& a

1 S& v! C0 A. k) f9 q最近在研究JS 做了一个简单的逻辑来播放声音: F+ A4 I; x' p
  1. var pit = 1;//初始化音高(速度)
    ' Y# l2 `  t. X' |' c1 G' v4 S0 E: p
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]0 R2 b4 ?! V9 V
  3. function create(ctx, state, train) {! i* z; P! D; M( H( l8 Y0 s7 h! p, f
  4.     state.number = new Array();/ j& |+ Y8 @5 Z
  5.     state.soundsspeed = 0;//初始化速度
    & c2 [( ?/ f' D% Q; a& O3 Y9 U; ~
  6.     state.speedsub = 0;
      [7 I# u7 T- T3 h: F+ q& f0 c
  7.     for(let i = 0; i < 100; i++){' N" U7 q( @2 A; {2 A. _8 S3 C; @
  8.         state.number[i]=0;//初始化数组
    ' j& K4 K2 B  j$ A/ Y
  9.     }; n* q( i% U& ]* }
  10. }
    : W7 Z! A9 O, q5 p

  11. 5 [/ B9 M+ m9 E, z
  12. function render(ctx, state, train) {7 l; s: ~* v/ X$ a& ^8 O
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    6 ]2 E7 g8 w& S9 [
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)  j& ^) `+ b$ W8 e. ?' P
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    / m. Q. I& x) t5 P) x1 k$ d
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差# p+ S/ f2 a" y5 @0 R5 V4 h, a# _
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)) U% s8 H( L  P5 k2 _+ Y" Q
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    + s# g% G) A8 b' _' d
  19.         for (let i = 0; i < train.trainCars(); i++) {- T" W! {7 G* ~2 n" e( S
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启1 a$ g5 E9 v% r5 f) L! q8 @. A5 r
  21.             if(state.speedsub<-1){//如果车辆减速$ G2 T3 l$ ^# O0 f, F* d/ ~' z5 F
  22.                 ctx.setDebugInfo("shache",1);//记录刹车' Z- n3 [+ b; ~9 T  ~$ J% n1 f' v
  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);//更新返回时间 播放刹车声在转向架16 l  d6 f+ |& I7 K+ 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);//更新返回时间 播放刹车声在转向架24 ^* U3 N" O1 d- T( {
  25.             }else if(state.speedsub>1){//如果车辆加速
    3 F2 l: U; }- X% U
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
      M) d1 e4 U, z6 z
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    $ g9 L# K- U- u! G2 }' @& H
  28.             }" ~# B! \# t) b9 a
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    7 g2 t+ W9 h! ?4 T" n( D
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    4 m9 h& H! Q0 P6 s2 T' T9 [. v
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启& v' x8 `0 ~3 U/ e
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右+ g% g7 Z( Q4 ~* L8 |; ?
  33.             }
    & s8 A) V  W, X' ]2 c9 m6 h  D! o
  34.             if(train.speed()*20*3.6>5){* H. q1 f" n: G* D' C" S* W8 A
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声* ^1 N$ r7 \1 \& L% q
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    2 X* x6 u4 L# F8 p6 b4 ?' A& G4 K0 I3 y
  37.             }
    & ~2 d: c& _+ U
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){2 X, s2 q' o, {
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    1 a# X/ M, J) j4 u; }
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    & {! w! [) E) X+ o; }
  41.             }
    ' G( Z) J5 k* ]" l: D& ~
  42.         }
    % _, d' p5 w5 k# q  ~3 m9 M1 q8 [
  43.     }
    7 t  E, m, S  J8 L3 c* s: E
  44.     state.soundsspeed = train.speed();//更新速度
    ' r8 W' e/ [5 B% n
  45.     for(let i=0;i<4;i++){: }1 i3 r. R0 ?
  46.         ctx.setDebugInfo(i+"=",state.number[i]);' O- b4 d5 X; ^% h: C
  47.     }& Y) {3 A% ^, R$ {- x
  48. }
    ; w/ t# ^7 e4 E2 S$ T# ~
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间8 \) _1 Z; G$ ]/ n# Q& X
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间6 K+ f) J( T1 V( y7 [
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    : G1 P4 h+ K: F9 h8 R% C' ~
  52.         nu = Timing.elapsed()+long;   //更新播放时间* l  v- d5 ?6 `9 G" Q
  53.     }2 q; Q' \* q9 n  ^
  54.     return nu;//返回新的播放时间* R" n6 l* G9 e$ @+ ^! ^
  55. }
    $ u: ^8 P! Q2 g8 Y) z# B
  56. function grnn(min, max) {//随机小数5 A. }% b/ n( j/ w8 ~$ U. S
  57.     return  Math.random()*(max-min)+min;, J- c0 w6 T6 D5 R. [2 ~  l' M
  58. }
    / m0 e7 A0 ?) M& X( D& t
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的( D3 f; @' M8 E  U% o1 L& Z
  60.     // 获取列车从车库开出的距离$ O" d1 C/ l1 J8 c3 S' M
  61.     let railProgress = train.railProgress();' S& H6 U6 m" [' P1 X/ H1 t' Y' v
  62.     // 获取当前轨道的索引
    ; s4 P* V* W; h* I
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);- M* Z8 `: v; P  ?' g" G( A0 s1 I4 b7 K
  64.     // 检查当前轨道索引是否有效8 p, R% k3 C& d1 \2 Q$ f0 l
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {( X* C! X* ~/ H
  66.         // 获取当前路径数据对象# \) X( W. G9 @& A2 b0 b
  67.         let currentPathData = train.path().get(currentRailIndex);5 Q6 y! R" M8 y* p+ o8 I# @
  68.         // 获取当前轨道使用的自定义轨道名称# k1 d3 p. U4 c( s$ L- |& _" H
  69.         let trackModelKey = currentPathData.rail.getModelKey();$ v6 Q0 m# r# p  S
  70.         return trackModelKey;2 Q5 Q. i; a# E
  71.     }7 F  c) r" e% k
  72.     return null; // 或者是一个默认值# E$ X9 B( g1 j. L/ h
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错/ z8 l9 S, ~: O$ Z5 X. |
有事加我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( p$ I  U1 g5 G0 _2 c
bve声音要方便一些吧,他有可视化可预览的编辑工具

! J8 H7 d7 ~/ U# M. i嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ! m. @$ ~2 A2 S% G) {* o7 ]: f4 {
8 \' ?7 U3 w+ [  I
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 : N# v; T7 ]( }: e$ F5 O
huliawsl 发表于 2024-5-17 21:12: f' b& r$ V0 L! Z/ L
相较于此,我还是认为bve格式会更简单

; F$ j, s, B+ p🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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