开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
7 c0 B1 M/ f9 [  q5 J. q( j4 f' q0 x
/ W3 E) r9 b  V5 F1 i  `0 X7 H
3 ?, [- F, m! B: Q8 h6 L最近在研究JS 做了一个简单的逻辑来播放声音) j1 u# O4 @" q' C' k- P
  1. var pit = 1;//初始化音高(速度)4 p3 |+ k+ a# E2 D# E7 U5 i, c
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    4 _9 Q6 E$ U# l0 s$ f8 b
  3. function create(ctx, state, train) {
    - V8 Z% E3 O. y  t+ E$ R
  4.     state.number = new Array();
    % q& K1 }  O% G' U- E5 y* ]7 C; i
  5.     state.soundsspeed = 0;//初始化速度
    % M7 g0 W  F' z
  6.     state.speedsub = 0;
    ) a: V) f1 H2 h5 w
  7.     for(let i = 0; i < 100; i++){
    1 S; M8 ]; t  y' h
  8.         state.number[i]=0;//初始化数组
    6 P: c6 g' T+ Y+ L: {/ }9 Y
  9.     }
    , i" F+ V% E& M7 k  J
  10. }* K" v) @* w$ l  }0 B
  11.   e+ \( ^! {4 M5 l' B# [  z
  12. function render(ctx, state, train) {
    . M% H9 v6 e1 V$ {1 a  l
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    ! i3 j8 w; J; B' H; S  s4 @
  14.     pit = 1 + train.speed() / 40;//更新音高(速度): |* z# @$ G0 \( t$ C: K
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    6 }' e7 Z# N4 ?
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    ( M7 I, b+ f' n; S- {  I
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)2 Z  o/ w. C$ L) j# f+ A
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作* I: |) z- d( K6 \: P1 {0 O
  19.         for (let i = 0; i < train.trainCars(); i++) {3 g7 l: F. q# p  e$ d+ h( w* ]: p+ T
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    6 q0 I3 [) p, U
  21.             if(state.speedsub<-1){//如果车辆减速' m" H; p" ]  o1 ^: C
  22.                 ctx.setDebugInfo("shache",1);//记录刹车9 o# C3 d8 ~  }2 ?& D5 k. R9 s
  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
    % Q& v# b* Z2 n0 N+ Q9 Z( c& J0 a; u+ g
  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
    - x: R$ b1 a$ @0 i
  25.             }else if(state.speedsub>1){//如果车辆加速
    / ~9 ^, W7 b5 Q$ n
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    6 G) J  i3 x# g& n
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声+ {1 C" w& [6 l. i- r" q3 ^
  28.             }# s; P$ Q7 p+ i  S8 t) `
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声
    * j% F+ f1 R9 _6 S: M4 k- G
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    : W( g* n+ _/ B7 u# m
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    1 N& O  Q+ z$ `6 M: o9 N2 U
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右' U. ?1 d& q" Z! r& Z0 q& g
  33.             }
    + Q: l# y; V( r# b4 r. h
  34.             if(train.speed()*20*3.6>5){
    # e# r4 S; m; p" X. j, v: U2 C
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声  X- d! L& X6 s3 p9 b/ a& ~
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声' h! g/ ?. D# s1 x1 A
  37.             }3 }5 Q7 h  E2 V: u
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){1 a; }. ]: G. G5 f8 A0 M
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声! E0 \2 c3 L6 D$ T
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    9 F: D9 A- u# B9 ?/ b  z
  41.             }, R% S: o$ K+ k. h+ d
  42.         }
    . G! j9 h+ M2 I, L& Y0 M# S3 a
  43.     }& I9 ?5 L  g9 X  y/ x$ s* \
  44.     state.soundsspeed = train.speed();//更新速度
    5 t; x" h* ?4 o  ]2 V6 e: R
  45.     for(let i=0;i<4;i++){
    4 L. k/ j  a* O% i
  46.         ctx.setDebugInfo(i+"=",state.number[i]);$ {: l8 N0 S' k7 m5 K
  47.     }
    ; h" s+ C8 ^2 D
  48. }7 a  O7 n- m5 g/ W
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    : m6 O' _% e+ ^8 I2 B+ K: j
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    2 k  K# v  J( A, C+ ^
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放1 \) g2 ?8 [, y
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    5 u3 [5 H% N0 _7 S
  53.     }
    5 D1 J4 l. t, H! X+ p, K
  54.     return nu;//返回新的播放时间
      ~$ n7 c6 a5 [; [; p
  55. }
    " N& V; \: {% j3 w0 l2 F' r
  56. function grnn(min, max) {//随机小数+ {5 m' @- Y. y1 \% R
  57.     return  Math.random()*(max-min)+min;6 e0 o; y& V+ w& [
  58. }1 c% O/ E* i( K$ G) b
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的/ W6 ]: [5 o! b. m- _
  60.     // 获取列车从车库开出的距离
    5 N+ I% ]7 \$ _. M! H
  61.     let railProgress = train.railProgress();
    " g4 Q! u/ |7 ~/ c& z' P5 A
  62.     // 获取当前轨道的索引
    : P% _+ T8 O' `! j
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    7 o  w1 r& V# M, G- F/ o1 C
  64.     // 检查当前轨道索引是否有效
    7 M/ Y$ W* G, H( V; q
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {, G; |* p5 o2 x6 [% R4 x
  66.         // 获取当前路径数据对象
    ; u9 h7 B5 y: c2 d6 ]
  67.         let currentPathData = train.path().get(currentRailIndex);
    ; ^' F6 v5 t. n5 ]9 ~8 ]
  68.         // 获取当前轨道使用的自定义轨道名称
    * Q5 ?% c9 T; H6 P3 X  i/ j( `$ C
  69.         let trackModelKey = currentPathData.rail.getModelKey();  L/ O) p( J) i- a% f, Q
  70.         return trackModelKey;) i5 K" ?; W; j/ X+ \& y" s
  71.     }
    $ q8 u. @, r# y( E) ~3 ~1 H! X
  72.     return null; // 或者是一个默认值6 P( U" N- O7 j  ^, I0 [
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
$ j; q. @% g5 r! a: T
有事加我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
) D- c2 V3 Q+ I0 V: m1 ^" E8 f3 ibve声音要方便一些吧,他有可视化可预览的编辑工具

( B. E2 P0 y& r& f& F- l% |$ s6 X嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 * O- c" z: \0 \% H0 h

! h* f( m3 B# b5 z相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑
7 U& P% V$ L7 K' A! B8 e6 z" e
huliawsl 发表于 2024-5-17 21:12
: V9 _/ `- G- ~. G3 A' i1 B! a相较于此,我还是认为bve格式会更简单

  ~( t+ h- I; C2 G; c7 |🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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