开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
( {. m# k7 `+ |! T0 l7 |  z, Z9 u/ w) b& ~
9 e/ s, X  G# @' ^; w/ \
最近在研究JS 做了一个简单的逻辑来播放声音1 C7 n; d, g4 v& M3 [, @
  1. var pit = 1;//初始化音高(速度)9 s+ R+ H3 k% @, o+ T
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    ! v( a& i( }2 @# N6 K: }% k
  3. function create(ctx, state, train) {
    9 ^" L- X6 q8 L. H# M( w
  4.     state.number = new Array();
    3 T, Q& Y& H% s( D8 e2 `
  5.     state.soundsspeed = 0;//初始化速度# V. z" C' m) F1 A" W" `  Q9 |
  6.     state.speedsub = 0;
    9 [  {5 }" P( {0 i
  7.     for(let i = 0; i < 100; i++){
    4 O; n9 `$ k3 z. U$ }3 c
  8.         state.number[i]=0;//初始化数组7 ^- t- t; P; w2 b
  9.     }6 v' L0 b  v/ y1 V
  10. }4 z0 F# q! v" ?
  11. 0 o  y# d6 V) R2 R4 f8 C
  12. function render(ctx, state, train) {
    " K* X) l$ ^) B$ q
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动, W0 Z1 F% W  Z% G4 d1 ?
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)) m' U# O. F0 `
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    2 N: g$ x$ A0 v  c3 s
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差8 ^0 M& [2 ~# w4 M$ t  J$ p. e( W
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)" n+ g/ |6 K  E  g
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    * a" ]" o& d* q8 j& x
  19.         for (let i = 0; i < train.trainCars(); i++) {
    7 w. S1 S- g! |  Q% c" g
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启! O9 Q" r' T" |" [
  21.             if(state.speedsub<-1){//如果车辆减速% C9 `$ U4 y' E) h' z, u3 M, @
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    / S) |5 u' {3 G& T- 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);//更新返回时间 播放刹车声在转向架11 |- [: c* E+ l" _: ?- K
  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);//更新返回时间 播放刹车声在转向架21 W& Y# P9 e8 t" n9 K/ T
  25.             }else if(state.speedsub>1){//如果车辆加速
    0 R" z5 l! Y1 X' q1 i  Q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速' r$ d! H7 o0 B7 J; X9 J
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声5 i: n. H$ o" T8 S+ q" u% |
  28.             }
    - z7 `( ^& a# S6 _# R
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声$ l+ A5 r9 T/ I2 h# o4 q- \
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声$ f# C9 C/ M5 }, u' A
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    & O$ o! E: ], q, n2 g" D% k/ U
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ W% s* p+ ]. L- A. o4 a
  33.             }
    " c" V1 x: d8 Q/ I* l8 p; d" A
  34.             if(train.speed()*20*3.6>5){
    ( E/ i2 P& C0 R% z
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    & _' u& M  ?6 u/ b. H
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    8 @/ A  P  t% \9 F, a% X8 ~  N
  37.             }  l8 N8 q6 c' C9 f
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ; L+ M" B! J/ B
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声& E  j# h2 L- H( S$ E# ~' k+ v! n
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声9 i1 Q- @+ X; _; [0 r
  41.             }
    9 @1 F  y  \+ n/ ]% P- ]
  42.         }
    ; ?7 z& s+ ^# l& e+ i+ N! W# t5 V
  43.     }
    4 V$ S. R8 _+ q  l7 C- H% u; g
  44.     state.soundsspeed = train.speed();//更新速度
    # A' a$ S# l4 r: t& \
  45.     for(let i=0;i<4;i++){
    ) F$ @+ C' U  U! G# w
  46.         ctx.setDebugInfo(i+"=",state.number[i]);4 M* {, Z' E/ H, W  X: I
  47.     }
    : b/ s/ Y" Q2 ^' C
  48. }
    % S' i$ e0 d7 |
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    ! T$ e+ \4 u8 [6 i2 _% J5 P
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    9 D" x" [; w; d2 g! R3 F. H
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放( H8 y. S) L8 q% |
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    , U* T0 J4 Q+ N$ U: B- W; j
  53.     }
    * n8 I0 [& }- ~2 i8 O
  54.     return nu;//返回新的播放时间( T2 E! j3 B8 A( T' d2 z
  55. }
    ; Z  ]: o$ F0 H0 j' y0 {
  56. function grnn(min, max) {//随机小数& K4 e5 b9 a8 _3 Z9 O) s
  57.     return  Math.random()*(max-min)+min;
    + \/ f; \  ?4 v- u& h, l
  58. }
    3 k  Q. x3 t) S' X
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    / h! k+ O2 q% q2 l
  60.     // 获取列车从车库开出的距离( R3 G4 w9 ]2 c! L
  61.     let railProgress = train.railProgress();
    * E/ h2 c: X- T" }- L: Z+ ~
  62.     // 获取当前轨道的索引
    - s/ X' m1 R9 s/ ~
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);: J" i- q" v. w- p* ^5 r
  64.     // 检查当前轨道索引是否有效+ X3 n) D- b0 i6 K
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    ) l! ], o$ n! I2 q2 v. o
  66.         // 获取当前路径数据对象
    5 Y! _# U+ |- F! B: t* n1 l! d
  67.         let currentPathData = train.path().get(currentRailIndex);7 |6 ?. [6 C4 v0 _" w$ \8 d
  68.         // 获取当前轨道使用的自定义轨道名称
    1 ^7 V1 R) C  t" {3 A
  69.         let trackModelKey = currentPathData.rail.getModelKey();& h) W# i* T2 ^% j5 j/ M% f
  70.         return trackModelKey;
    ' L( y+ @' S5 w
  71.     }
    * K2 k. K. f/ n" _2 _) l
  72.     return null; // 或者是一个默认值
    * a- Y# j; D. n  j% m$ ~+ h
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
) \( Z- q; d6 d' b* Q  j' [; t9 m0 Z" S3 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% l& j3 `* \' U4 z1 \
bve声音要方便一些吧,他有可视化可预览的编辑工具
1 p7 @% m1 z2 D' C7 [
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 5 e. m1 }, J/ J# G) E; W8 {9 u- P# O
* `9 Y' {; K7 g; v
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
6 f3 P- x; j; a! Q6 [
huliawsl 发表于 2024-5-17 21:129 z9 g: @2 S" Y0 \" `
相较于此,我还是认为bve格式会更简单
" }: b- _* O4 K6 ~3 C4 T
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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