开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
: ?6 u, ?1 E/ e! j; t% w" a0 w8 M+ h! [7 V( k2 f% ^$ V

! J, F, ^& X9 W7 Y# @3 [& l+ H最近在研究JS 做了一个简单的逻辑来播放声音6 b1 p5 W7 @5 }# Z$ o. n0 i
  1. var pit = 1;//初始化音高(速度)0 C; D' r2 w2 h
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ! ^% i8 a3 ]8 g
  3. function create(ctx, state, train) {
    & \3 @5 A( `0 C8 W! I' F( r
  4.     state.number = new Array();  Q! e2 C- f! D7 n2 r
  5.     state.soundsspeed = 0;//初始化速度
    & s% z' a6 Z' q
  6.     state.speedsub = 0;
      t5 j3 A* M9 ^4 `4 J
  7.     for(let i = 0; i < 100; i++){
    / G  A6 l% A6 v8 ^; a
  8.         state.number[i]=0;//初始化数组
    8 P. ~2 e. X3 s! M  e2 z8 F
  9.     }0 H/ g0 N: Y) M4 M8 E
  10. }
    7 X3 P2 M; m3 J9 C: T
  11. % D+ E5 q) E% c7 Q  j1 U( V/ @
  12. function render(ctx, state, train) {
    8 v( P* J( u1 I  ^1 o# Q- h4 C
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    9 K. e3 D& U5 z& w! P8 y6 e/ l
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    8 T0 [' A* E& N4 d4 V  q
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    2 ?3 g/ {$ u+ _, k% P7 r$ ^
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    4 N8 g: c7 B6 w- q& N5 M
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    3 e1 D6 O7 l5 h5 M7 D5 V
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    $ `* h$ I5 x6 W- F7 E
  19.         for (let i = 0; i < train.trainCars(); i++) {
    . W: K* T. x7 x. j' E# ]- T& x+ J
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    - T1 Q, a$ S- ]
  21.             if(state.speedsub<-1){//如果车辆减速' z- r% s& q6 H
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    # T; j+ [) T; |+ ]5 K4 X- r% Z' r& a: B5 d
  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
    9 a$ Z0 X" o; W- Y
  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
    8 A5 w$ k  C0 s
  25.             }else if(state.speedsub>1){//如果车辆加速
    ( N( g8 J. D+ }3 f
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    4 A1 r1 R/ G1 [2 W4 N, v
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ' a3 G  l& P6 K: C7 f' j( R9 ~* @
  28.             }/ h, f0 k  c! Z7 f# M- B& h3 K! l
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声- Y7 a. R9 ]2 ~8 c' ^2 m
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声8 N/ I5 h& ?; T7 |+ q( R
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    & K/ P; ?: _  U" L6 ?
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右8 B. U( |9 M8 i+ L6 ?
  33.             }$ ?- j# z$ }% Y* x, _
  34.             if(train.speed()*20*3.6>5){9 Q! A9 }$ \* P+ s
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    , ]4 U) `1 G) {  x( V% y
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    * M% X0 b& }  p* M) E& e: x
  37.             }
    1 v7 d. f# U7 B
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    4 a6 L9 S1 r0 L. t6 U* b
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声0 o4 X/ _( I* W7 ^
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    - J/ |$ ]. i6 G8 r1 E0 C
  41.             }
    6 E+ |% Y6 l. g9 V# ~0 J
  42.         }# H- }! _* F" Z6 D
  43.     }
    & x: m3 n1 ^( b( T  }: J
  44.     state.soundsspeed = train.speed();//更新速度5 d( o: H5 C' B/ ^7 ?% [5 }6 Q
  45.     for(let i=0;i<4;i++){, m$ [+ ]/ M1 U3 ~/ K
  46.         ctx.setDebugInfo(i+"=",state.number[i]);/ s  \8 O; T/ V( w
  47.     }" @0 }7 y5 F/ z
  48. }) O8 `3 {1 ^2 m# e% B
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间( ^9 ^) b0 F* v+ B
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间" k5 \; u5 i) ~3 c0 k: r
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放8 D4 e' Q2 V7 V4 r
  52.         nu = Timing.elapsed()+long;   //更新播放时间: ^4 j, Z8 V) f& e; u
  53.     }
    7 o9 o: m/ g4 y# k3 G
  54.     return nu;//返回新的播放时间  H2 Q7 a9 U; _3 K& n
  55. }
    6 u/ a6 {( N* [& z4 f, |5 }
  56. function grnn(min, max) {//随机小数
    1 V0 j" H# [$ `8 R  c, u1 Q' p
  57.     return  Math.random()*(max-min)+min;, a/ B" L  K1 X; U
  58. }! G7 c7 r. E4 M2 t
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    + e5 t6 v9 [* T/ h4 d4 |( X! J8 S
  60.     // 获取列车从车库开出的距离
    8 ]* j; }/ E1 x) J/ p' n" f% Z- g+ ~
  61.     let railProgress = train.railProgress();
    . n& A; G: B, \/ W$ z
  62.     // 获取当前轨道的索引
    2 c- ]( g  ?( c1 y" L) W; Y
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);4 d8 g  J* S- l+ v8 p
  64.     // 检查当前轨道索引是否有效% b: x. r  O$ o7 F: ]* P
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {0 J' ?- R% X: M2 s; w
  66.         // 获取当前路径数据对象$ A8 R. b. T, b
  67.         let currentPathData = train.path().get(currentRailIndex);
    ! U8 J( N; ^6 k* M$ f2 T
  68.         // 获取当前轨道使用的自定义轨道名称' Q0 V- V1 U/ _) p" B' K
  69.         let trackModelKey = currentPathData.rail.getModelKey();  J2 R% z: a. d2 c- z
  70.         return trackModelKey;) I! r( d( J, Z
  71.     }
    6 B9 v1 U- i5 N# Z
  72.     return null; // 或者是一个默认值
    9 Z; x) M  I, z) B8 }& v
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错9 P! P: b% x! d& {0 C
有事加我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:047 k9 Z5 ?0 f6 [% G1 d7 x/ R
bve声音要方便一些吧,他有可视化可预览的编辑工具

4 L, u+ G2 y: v: A$ ~嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 2 H( W' u5 o: |5 |2 f. o
2 o1 e% d  D, j$ i0 Q. w' B# N
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 . }3 S9 O* Y0 n5 u4 @+ |0 a
huliawsl 发表于 2024-5-17 21:12
/ f8 E/ p. S8 O3 k  \" ?1 J" c% z, x相较于此,我还是认为bve格式会更简单
( S2 `0 l7 Z( e% K2 H* y) b, ~
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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