开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
2 r3 h) W1 j) I2 P2 r# M( D4 X: a$ F" o) O% s/ [

. V0 R4 T( |: I" w. b: k最近在研究JS 做了一个简单的逻辑来播放声音
! p3 K/ D) U  q8 o1 b3 ~" H
  1. var pit = 1;//初始化音高(速度), V* V$ {9 [& S) d
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    $ a  A) L3 |/ W5 o+ f& m
  3. function create(ctx, state, train) {4 c7 U. b" Z2 ]1 L% ~0 a% e
  4.     state.number = new Array();
    2 X3 O# \. }! j7 x2 V0 c
  5.     state.soundsspeed = 0;//初始化速度& F- ~" C# v8 s/ w
  6.     state.speedsub = 0;
    . A( f* ~/ J7 j$ M  D* a/ l
  7.     for(let i = 0; i < 100; i++){# \. Z9 \) y/ ?0 P4 M
  8.         state.number[i]=0;//初始化数组3 }) G( I& O' J1 B9 ?! \
  9.     }- g3 ~% \" H1 q6 G
  10. }1 `; m9 F( ^6 K. I$ b' C

  11. & O# B) _1 _  S1 g$ b7 T; v
  12. function render(ctx, state, train) {' @3 Y+ e, b. c* N  A7 K( g
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    5 I& N" u0 S+ x& `( d
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    2 y2 }7 [; Y+ s+ `6 a9 W
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    0 W! L: G- K( C8 V, i* r
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    6 x& R  a5 f/ `  G/ G1 f3 G7 D
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)! W; p! Y1 L8 M  q' k- f2 Q! p9 `
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    4 U: _; n8 Y: |7 S6 m! V* x
  19.         for (let i = 0; i < train.trainCars(); i++) {
    % P9 N/ S# o( {  Z
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    2 S" _1 ?5 i: B7 }" G
  21.             if(state.speedsub<-1){//如果车辆减速0 V, H3 x! O( [5 u# f; ~
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
      U4 u# t* L' g& p& b) j& t. E
  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);//更新返回时间 播放刹车声在转向架10 N& x6 l: a& Y$ F3 Y$ ?' m( O
  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);//更新返回时间 播放刹车声在转向架26 z1 b5 p; D; {: @' b( r' n) E
  25.             }else if(state.speedsub>1){//如果车辆加速! Y7 e& M) F2 R6 m" M" s
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    2 c9 G) F. Y$ l/ A1 C
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声, {' ~+ S" p* |3 F7 v2 k! F
  28.             }
    5 `6 p- s: J% q, b
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
      J. l' l7 j$ f& q5 D
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声5 `1 ~3 t: |" C
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    : l: _! \& u1 E6 k# E
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右7 `) ^/ t' u$ r3 C. a3 v% O  u
  33.             }# O& h3 q1 Y% H( ^3 \
  34.             if(train.speed()*20*3.6>5){
    2 g5 v% X+ g% @6 L2 d" `2 W( q
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    # ~5 {9 {; V* W6 c  Y
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ; _% K' [) [4 C& x
  37.             }0 @/ i4 _# |* o7 t$ ?5 @3 K
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ; A4 T5 ^! @2 }8 `1 a: q) t
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    9 Z; K) s- G2 s
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    . S9 r) h# p8 p8 L8 a- x
  41.             }
    " f  k: y+ q9 c* V- c/ @1 k
  42.         }
    - I9 t0 A) D4 ?: U- ~# |1 O  C
  43.     }, r+ c3 g5 P7 |: |( H' j8 w
  44.     state.soundsspeed = train.speed();//更新速度
    2 ^- b5 s3 y7 h8 w
  45.     for(let i=0;i<4;i++){
    8 X  M- l# J9 |) \
  46.         ctx.setDebugInfo(i+"=",state.number[i]);7 a7 d8 O6 L# J; ]
  47.     }
    7 Q6 ^. N7 C2 [. u' X
  48. }, E" T" U8 H6 o/ j: q8 Y+ {9 E
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    0 O7 U6 K0 _# J! ~6 p5 g$ A
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间6 w) Q, O2 q  E! k
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放- c( v0 z/ y# L$ I; O$ I
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    6 J8 B/ o, E* z2 w/ S
  53.     }
    5 a* `' p2 u. [- ?) [
  54.     return nu;//返回新的播放时间
    1 g' Z+ j% a3 h/ B
  55. }! S4 r* H, }' V3 k; ]/ U5 A6 M
  56. function grnn(min, max) {//随机小数5 X1 _# L! h2 }
  57.     return  Math.random()*(max-min)+min;8 e* b  K, N1 i# ?/ s: h
  58. }* x2 g/ o+ y, t- x9 F) t7 g
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    ( K' u1 o; w( y+ G' j: M
  60.     // 获取列车从车库开出的距离
    1 h9 P- M9 [) Z5 R8 ]7 R- E( Q
  61.     let railProgress = train.railProgress();+ x/ v0 M+ E9 O  u+ W
  62.     // 获取当前轨道的索引
    $ m" Z. s7 ]6 f) ^% R; ]! T
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);2 B% l3 G- [6 `; |( U: E
  64.     // 检查当前轨道索引是否有效
      L+ l/ T: `- ^& l: x  L6 N  R
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {- R* b! }) J. f! [: f6 V- V
  66.         // 获取当前路径数据对象# h  n# [8 l- W+ g: y9 Z
  67.         let currentPathData = train.path().get(currentRailIndex);# @, ^% y  h' P; I# T/ Q; d1 K  ^
  68.         // 获取当前轨道使用的自定义轨道名称
    + G5 Q7 J: {) H# S9 C' M1 g
  69.         let trackModelKey = currentPathData.rail.getModelKey();) J+ h2 _; c/ c; u; U0 x* R3 v: J
  70.         return trackModelKey;
    9 ^$ s; v3 j3 e# b# J* d; v" ~
  71.     }
    / H8 H) Q1 x) I# X& X. V- K
  72.     return null; // 或者是一个默认值0 U! B9 H- Y6 I, L
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
, k. r- h, T) S1 x* Y' C9 k
有事加我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
$ Q$ z+ K8 J2 d& e* O2 y- }* rbve声音要方便一些吧,他有可视化可预览的编辑工具

! V# D& N! O# }1 d嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 ; o7 ?( N0 k; ^3 V$ e# p7 e) R

) ]. [2 b6 p6 C$ X* i/ `相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 # E9 B# M: z0 E; w0 ~' |5 s
huliawsl 发表于 2024-5-17 21:12
' R' M- W) k. y. y相较于此,我还是认为bve格式会更简单

. S3 u% k9 `. ]2 C- P& S🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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