开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 $ ]6 \/ U1 G% l8 u0 V
$ m; i' C! G8 n  q% t/ O
- i" Q% @; l# M  x8 ?; D
最近在研究JS 做了一个简单的逻辑来播放声音
( u; K5 t( \5 @" G% B$ n( d$ ]
  1. var pit = 1;//初始化音高(速度)8 p! a1 p* l7 V& ?6 S( T9 Y$ b
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]' W4 D9 j% d+ d
  3. function create(ctx, state, train) {
    . J( f& l4 C; C9 C) [5 ]
  4.     state.number = new Array();
    6 v: K6 G- _+ J9 k5 w
  5.     state.soundsspeed = 0;//初始化速度
    4 g! T  a1 @- ^) z% L
  6.     state.speedsub = 0;
    + v, V% ?& N$ s5 q, d' D% [9 H
  7.     for(let i = 0; i < 100; i++){9 i1 h* V  R" l+ a7 B  c
  8.         state.number[i]=0;//初始化数组
    ) _2 A0 Z1 T: H) H2 ~
  9.     }
    5 J6 `' H% t% P2 o0 g: B3 ~
  10. }3 x# [" @- n, F! g2 }

  11. ; k0 s1 _: q" ]$ w% @; q. m5 t5 B
  12. function render(ctx, state, train) {2 Z* [; w0 m: z8 V# Z: v! _4 L+ s6 B6 [
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    & j# W5 H! B& y/ f- l2 Y5 x
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)1 [1 K- Q! L. O3 g5 |. H& [
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    & r. K" D+ v& s; K0 a1 X# F
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    : ]2 }. @/ }9 b/ g
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    $ H& Y7 j7 x" _) F; c* c3 w9 x7 ^+ k
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作0 [* I. K+ L, o0 r4 ?/ ^* F! ?
  19.         for (let i = 0; i < train.trainCars(); i++) {' Y5 Z. X; S0 F$ z& o+ t' ^9 H
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启. r, J' N5 ~4 i0 i% f
  21.             if(state.speedsub<-1){//如果车辆减速
    7 E2 E; a. M0 c1 f8 F5 S  T* M
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    / W4 P( |* k6 n$ L
  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
    / L+ g6 f' Y& ^! 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. T& M* |1 J8 F! K1 ^( c" W
  25.             }else if(state.speedsub>1){//如果车辆加速: D3 }) Z! R) m& O- a
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 Q  H' v( ^, a# Y4 k5 Q2 H' ]
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    ! H3 Z! Q9 b9 u
  28.             }9 k# }! w9 M% `* R
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    ! h% E9 h  d$ B
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声* F, S' R, B6 M/ K
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启; |( O/ t0 d* z6 x, e
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右& ~6 L9 F/ ?0 L( Z  _* L! V) m
  33.             }/ E( W% I; l# k' q+ u
  34.             if(train.speed()*20*3.6>5){9 s* Y" b5 c  D% c7 x! S# o8 X
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    , g) K- H+ z9 T! k+ g
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    $ p# R8 @+ `, d( ^5 x! i3 A4 E, m
  37.             }- t. Y$ I0 R' J. p. x: e; i# h" h
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    # x# r  Z9 t5 b2 [, H
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声1 j4 a# n/ d) X9 T  G
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    2 g7 _1 r6 X0 ]7 S% H" D
  41.             }' H: L4 A2 I% t! ?) f5 g5 o
  42.         }" b$ N; d2 N& b* U4 x
  43.     }- U4 I4 Q8 G# F" ~
  44.     state.soundsspeed = train.speed();//更新速度: U( Q# k; C# e
  45.     for(let i=0;i<4;i++){) `: N5 b+ Y5 s6 b0 N  E
  46.         ctx.setDebugInfo(i+"=",state.number[i]);7 n9 ~# `9 e! F
  47.     }) Z& y- w) P2 f  `
  48. }9 H$ m6 a% _% `
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间) J( R7 b: Y' A3 M# L/ X" S2 `
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    8 {  r9 \8 i: p" I% w3 V* Q, z
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放2 h! |' D3 W) P; s
  52.         nu = Timing.elapsed()+long;   //更新播放时间; q1 i$ X3 M6 t3 d+ T% m
  53.     }. R8 J* @% X7 |' O
  54.     return nu;//返回新的播放时间
    # ?# P/ F! _+ x
  55. }1 f7 o7 ?* N/ R! e8 r2 e* }5 F
  56. function grnn(min, max) {//随机小数+ U+ z+ Y8 x6 M3 T  Y) z: W
  57.     return  Math.random()*(max-min)+min;# n/ _! @5 d  z, p+ k1 }, _& V
  58. }
    . e0 \) a5 _7 R& R! G$ T
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ) ~  p7 c- J8 H% t& X
  60.     // 获取列车从车库开出的距离
    1 n8 ?4 f8 h: o5 D- A3 u& f
  61.     let railProgress = train.railProgress();
    9 m2 T3 m: T3 A7 ?) W; ^  O
  62.     // 获取当前轨道的索引$ G9 @( Y! r, C& `& p0 W) ^  {
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);9 E# {# I8 W+ {) C0 d
  64.     // 检查当前轨道索引是否有效
    8 n* u6 P& ~  f, v, ~0 A
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    8 G; V/ U6 R- |
  66.         // 获取当前路径数据对象
    ! z- N4 ^" y& o7 L3 p% `: d
  67.         let currentPathData = train.path().get(currentRailIndex);) |, V& l, Y/ \
  68.         // 获取当前轨道使用的自定义轨道名称
    5 T# f/ T# R- N! f- a
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    * Y% F1 z! C; ], |8 e/ \
  70.         return trackModelKey;" _$ Y/ y6 z* ?8 N; J+ Q) P" S
  71.     }
    7 T* G7 p( I5 m, m) |9 |
  72.     return null; // 或者是一个默认值* O4 L6 h9 s$ O+ E5 Z: A
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
6 C+ C$ t1 u6 O, x+ {& y
有事加我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
7 ^0 k3 Y* r" d" l% C9 I! ]" Vbve声音要方便一些吧,他有可视化可预览的编辑工具
0 F' Y- z& F" f9 b* X- T! {
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 . L, n% z! ^% g% ]+ U6 h! i" G( o

) U0 X2 s/ h/ }7 }; \* R8 [相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 5 ~, F% X+ _3 h8 N
huliawsl 发表于 2024-5-17 21:12. v) Y& Y0 L' Y! P4 y
相较于此,我还是认为bve格式会更简单

' b+ @( L" G* ^0 A4 m2 a🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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