开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
$ b0 S' @, V8 A! G/ S+ o/ Z
# d) v) H1 F7 O9 n2 K- f5 l: b0 }7 o- d7 O, g5 K
最近在研究JS 做了一个简单的逻辑来播放声音
0 Q+ @% t) V4 W2 m( x3 s  ^3 I
  1. var pit = 1;//初始化音高(速度)
    " P4 K1 }! f. d' B- U
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ S* ?5 z  N; [0 @1 N
  3. function create(ctx, state, train) {
    ( c/ \  ^' j9 m8 M& Q5 J
  4.     state.number = new Array();) {4 }! X, R  |' Z) s
  5.     state.soundsspeed = 0;//初始化速度& t; ]/ \% `5 d8 }# i
  6.     state.speedsub = 0;
    " O, d9 ?% K* b7 ^0 L0 A
  7.     for(let i = 0; i < 100; i++){
    7 i4 D/ O3 ]/ j# _$ h2 f
  8.         state.number[i]=0;//初始化数组
    $ i8 b; t5 F; l1 C
  9.     }  l3 Z) g' T) j2 D
  10. }" r, U) |- a' W; k
  11. 5 G  ?; f4 X' N3 O
  12. function render(ctx, state, train) {7 N( e! L4 }) Q  u
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动( \* v* F) m5 a% {4 e( B$ {5 u
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    . d5 t% [4 [1 l) j% r" ]- _
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    7 {4 z/ U/ g* x! g2 c
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    $ s  h$ S* a3 N$ s9 Q/ v. }
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)5 @- B+ C* P% l! x/ ^
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    1 W1 ^  p8 r* O
  19.         for (let i = 0; i < train.trainCars(); i++) {
    7 M6 R2 ?( s  z/ l8 q4 c; h
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启; h: @- \4 F* h3 q$ s. Q
  21.             if(state.speedsub<-1){//如果车辆减速
    + P/ u4 a0 ^: ]1 |0 V
  22.                 ctx.setDebugInfo("shache",1);//记录刹车  p" l* _6 _  @  u* [) _
  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
    5 L) G: z6 _8 R' ]7 Q  _& @  `+ }0 T
  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) X6 Z% _3 S- q9 J
  25.             }else if(state.speedsub>1){//如果车辆加速
    4 I) z2 O# X3 a) Q, k9 W" s( m
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速9 u; v. r* Z, {$ @
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    . G: l; _! E, p+ l2 |9 M
  28.             }
    : Y6 c! D4 _! e  I/ ?
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声+ \, S7 e0 _# |! v8 i
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    6 s( ~: L/ V$ ?* C( a. z1 J( H
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    3 W& C  s* s) i5 I" k$ r4 c8 x
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右* s: k8 r; A! K% d
  33.             }
    ; A6 l1 n' {3 k2 r
  34.             if(train.speed()*20*3.6>5){
    ) L# s' f2 k2 ]2 y
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ) h; L, @5 l: Z0 N' y: p4 d6 s6 ]. ~
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    5 r- P: k9 m4 n1 G( y4 {& Q/ ]
  37.             }+ G$ v$ ~' q  ~2 ~
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    + A" g9 f7 K/ g4 y7 R& K% G, g
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    . N# d, |1 U9 v6 R
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声! z+ e7 Q$ M6 l: ?
  41.             }+ ]$ v3 {3 k# J/ R* H
  42.         }6 \6 a, d+ K0 ?4 X, K% ^9 Z, E
  43.     }8 J; q0 ^" e0 E6 k& ?) L
  44.     state.soundsspeed = train.speed();//更新速度
    $ B3 h" _4 c" q7 l: B0 A* D4 k+ W9 C
  45.     for(let i=0;i<4;i++){
    7 r* L- B, T- a9 b
  46.         ctx.setDebugInfo(i+"=",state.number[i]);# n* H1 o5 h9 y+ w8 Q1 }+ y
  47.     }" t; F2 _$ B7 Z% N6 l
  48. }6 N. b4 Z- d+ c- E: R- t" |
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
      F4 m9 Y# E4 J0 I- `! N8 t+ H
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间- U. i+ p. c3 K% u! R" V
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    2 _! C: j- R  S  z
  52.         nu = Timing.elapsed()+long;   //更新播放时间+ B+ v; o, H+ f* B+ u% \
  53.     }
      M) f9 A) [- G  W
  54.     return nu;//返回新的播放时间
    2 R' J/ C0 p8 y
  55. }' m6 ]# Z# [4 D; o; O, Z4 _
  56. function grnn(min, max) {//随机小数* \9 X9 x1 I  V8 Q
  57.     return  Math.random()*(max-min)+min;/ R* i# u" s' N! M# y  I
  58. }
    9 u) o, L# f. D
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    # L9 @/ I* c& l: `( |1 K) y
  60.     // 获取列车从车库开出的距离7 u. ~5 s/ Z7 |+ N5 l8 u6 Z
  61.     let railProgress = train.railProgress();& F: V* Y; R7 }
  62.     // 获取当前轨道的索引
    6 G7 T! X1 L6 {5 O3 e  n% l/ j
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    . _2 ^) _0 R/ z/ V
  64.     // 检查当前轨道索引是否有效
    $ }  n5 ?" Y: f+ A0 V' r; m
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {. X: u) M  F2 K# s
  66.         // 获取当前路径数据对象, F. l7 a' Z! F+ L
  67.         let currentPathData = train.path().get(currentRailIndex);
    # L" a& C  N: @5 p& |3 @# a6 Z1 P0 Z2 L
  68.         // 获取当前轨道使用的自定义轨道名称' p  T8 R* Z  a! O
  69.         let trackModelKey = currentPathData.rail.getModelKey();! L5 C; O( S; b2 f. b
  70.         return trackModelKey;
    ( X  ?& z) M0 K8 z* @
  71.     }% j. n7 Y4 k+ {" d! x
  72.     return null; // 或者是一个默认值+ Q; e6 Y$ ?  ?4 m
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错, a, q, O  Q, x* W
有事加我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' W1 D- p) w# W1 ]/ H+ A6 C3 y
bve声音要方便一些吧,他有可视化可预览的编辑工具
; K! e& A0 y- f& _: A
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 9 t4 H% K9 n! S! X0 J( H

0 N, J3 c. o% Z4 t; w相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ( J- g" e: g8 A, M% U
huliawsl 发表于 2024-5-17 21:12
4 i: ^0 d6 K0 f" P% U相较于此,我还是认为bve格式会更简单
7 f6 v1 i! T7 r' J& l- U7 n
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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