开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
% U, O6 V3 S% V5 U* Q$ Y4 B. k9 w
- K, i0 ]- V# m% q: [9 Z- \; J
. p1 V) d8 Z- f2 h6 v最近在研究JS 做了一个简单的逻辑来播放声音; z2 B! `. g( L- X! j
  1. var pit = 1;//初始化音高(速度)
    5 @0 ]/ E9 m' Y, M
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
      |* }% G3 I1 F2 h5 Z
  3. function create(ctx, state, train) {! T5 x3 ^. R; C1 e' x" m' U
  4.     state.number = new Array();
      P$ ~5 u. [+ B
  5.     state.soundsspeed = 0;//初始化速度4 g# M7 s6 `) `: Q
  6.     state.speedsub = 0;' h7 x+ c% p( o; P5 g" ^- s
  7.     for(let i = 0; i < 100; i++){
    ' ?$ a- f' I' a
  8.         state.number[i]=0;//初始化数组
    - N  x4 E- o0 b7 U: k
  9.     }
    0 L; J+ f  z% T  a5 S' N/ d
  10. }
    8 L! e6 `* X; X( T- b4 Z4 C

  11. 8 g* r0 H9 S% g/ a: f$ A0 K7 A
  12. function render(ctx, state, train) {8 `0 y5 d' }( o. }' Q8 h
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    3 ]( X" _' ]  G1 ^
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    7 l, P+ x# ^7 T5 e! o
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    3 ~0 R7 U1 ]* e. ^& N
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差1 d5 s: n8 p7 S: J5 Q" G9 f
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)+ N" w2 B" l, I* v  r% R
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作; D2 \8 ]& @3 k/ y2 p" |3 f
  19.         for (let i = 0; i < train.trainCars(); i++) {
    ( ^: x/ J1 \4 r0 |# `/ h# j
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    + n, j+ V% G9 w! j
  21.             if(state.speedsub<-1){//如果车辆减速
    5 H/ ?; W  l; o, b+ p" d% r
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    0 g8 ^  U: f. ^# d' P
  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
    - u! b  |# p& C
  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
    ! T2 \0 z+ R! w: t
  25.             }else if(state.speedsub>1){//如果车辆加速
    ' R4 H0 A9 M- R9 W  Z5 V2 p
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    8 x1 w% [' Q! `/ u8 I6 ?7 l: x# B3 l
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声! d) |- G# Z8 ^/ Y0 c
  28.             }- A; P( B% O( n6 r
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声8 v( X& {9 E2 _" i5 j' [
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    " F$ U; h7 U/ `7 v! I/ l
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启6 m. `/ q1 F, e" z
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右" p, f- D+ ^. I* g$ P
  33.             }% X0 X# R* v9 [0 h
  34.             if(train.speed()*20*3.6>5){- g  E- S/ u1 J+ g4 _6 W: j: f
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声$ w. b& i1 N+ k
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声# K/ S8 V  i5 i8 l0 _
  37.             }' b; L" r+ v& i1 _  ^' _! ~
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    2 d$ N% j6 j# S/ n  f) Y2 c
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声" @, n$ }$ [; g% Y8 Y8 \  T
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声+ x4 M2 g3 [- q9 Q, H) @2 n) Q
  41.             }
    , H4 y$ F- Z, n1 @/ |5 R3 Q( S
  42.         }
    # u$ l% O. g" v/ [+ K# I% [6 f9 W
  43.     }' Q6 e4 z& D; [7 q8 v
  44.     state.soundsspeed = train.speed();//更新速度5 F- K6 F4 P! [+ b" s" Z
  45.     for(let i=0;i<4;i++){# v- a3 l5 w6 K& e8 R
  46.         ctx.setDebugInfo(i+"=",state.number[i]);( _, v( K& X% P" ?: Q7 ~
  47.     }
    & u% D3 ?  b' P9 t
  48. }
    3 T# K+ n! B1 s& [
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间* h4 I: C. b1 n
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    $ x! G) L8 ^+ I7 S5 |9 e
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    9 D! B: D& m# d" n
  52.         nu = Timing.elapsed()+long;   //更新播放时间) Q' {* Q2 i% k) A4 s6 H
  53.     }2 f) s3 B% i3 N7 ]4 X) P* v
  54.     return nu;//返回新的播放时间
    : \- X: w# z7 d) K* F! s6 k+ P" m
  55. }) E$ u3 H  R" p, R0 u- u1 A4 |7 Q
  56. function grnn(min, max) {//随机小数5 ~* V4 z6 s& T5 K' i
  57.     return  Math.random()*(max-min)+min;0 \* Z( q% I& E7 L0 D7 C
  58. }
    - ~  }. G/ ~  G/ \6 B
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的. z" j/ I' t* Z
  60.     // 获取列车从车库开出的距离
    3 p4 r( L4 E8 S% f5 [& |( c
  61.     let railProgress = train.railProgress();( p$ G) i8 V; `3 d6 g  W! n
  62.     // 获取当前轨道的索引
    4 h: y  H/ f9 `) R
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);! o+ I3 ^) n: |  l
  64.     // 检查当前轨道索引是否有效) n2 [2 |( ~6 Z1 p  z3 F
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {3 D0 x# P$ f4 u: ?4 d5 a) g5 J7 \
  66.         // 获取当前路径数据对象
    . P) F; c& N2 L3 [& t, D
  67.         let currentPathData = train.path().get(currentRailIndex);
    * Z  v& U4 x7 O/ v) u. f2 r1 p
  68.         // 获取当前轨道使用的自定义轨道名称6 m2 F' p& s. G/ d
  69.         let trackModelKey = currentPathData.rail.getModelKey();+ j8 C  ]; ?- P( g' a9 c* ]
  70.         return trackModelKey;! c  c4 v$ _5 Q9 r5 D- p1 y0 z9 z# f# L
  71.     }
    - }5 f1 R5 J" E4 Z
  72.     return null; // 或者是一个默认值
    , R, r  ]/ ^/ E; q1 C" W( F
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错* A5 a3 z1 p* ^/ v4 b- X6 j+ Q
有事加我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
9 c0 F& O+ S) r9 W* F  H/ Ybve声音要方便一些吧,他有可视化可预览的编辑工具

! Y# v$ i6 s) ?嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
回复

使用道具 举报

huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
  O! A! m- T2 B0 X# f" S1 v3 t0 ^* X6 p5 Y5 \$ i' ^
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
回复

使用道具 举报

楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
- M" V6 F- A" u; U
huliawsl 发表于 2024-5-17 21:12* Y3 F$ _* N" h, g; [" R
相较于此,我还是认为bve格式会更简单
) ~! g5 F$ P# f5 T' Y& q
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
回复

使用道具 举报

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

本版积分规则

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