开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 5 I( o1 L7 {1 k4 B/ O- o

, ]% E- \( G$ g8 J% o6 c% ~6 n2 G# p# w3 A
最近在研究JS 做了一个简单的逻辑来播放声音/ F$ K5 M. I7 K% v% B1 W" ^
  1. var pit = 1;//初始化音高(速度)
    ; Q5 `" O) y: a* j/ p
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]/ x5 l9 H: v; B& @7 }8 P+ X
  3. function create(ctx, state, train) {: f+ W9 l8 C4 b0 ~% V
  4.     state.number = new Array();, O/ U' x2 S5 v/ I8 p% s9 a/ J
  5.     state.soundsspeed = 0;//初始化速度* G7 k) z' E, F3 `% K- M
  6.     state.speedsub = 0;
    , j( y9 B0 @1 o6 A7 F
  7.     for(let i = 0; i < 100; i++){1 I9 o. F$ G4 z
  8.         state.number[i]=0;//初始化数组
    ; Y+ y% \- g1 S, @8 z
  9.     }
    - `8 t$ q5 A1 R9 ?/ q0 S6 n
  10. }) E" F. j7 y7 c; g* I7 Z
  11. / k6 v! A1 L) D# `9 ~! F
  12. function render(ctx, state, train) {  A  Z6 g: p- [) Y) _0 w' |
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    : p3 X% ^* [+ Z3 B/ E; w3 o
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' ^/ V; ?3 C$ p8 H, g
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    : p9 K4 e  h8 n" j; x4 A. X1 q5 W
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差# u0 L  |* D/ ^& x* k) z
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)3 r% t- Y3 z5 x* ~6 [
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    1 W* B5 ~, i' V7 g: y: w
  19.         for (let i = 0; i < train.trainCars(); i++) {
    " u4 z' L. x, d& @8 M0 B% K& J
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启* Q% P! d* H7 Y# k9 S; V5 f8 ^
  21.             if(state.speedsub<-1){//如果车辆减速
      e3 U7 L4 R/ J0 `
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
      K0 ?- e. P! }! L5 U5 V' H
  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
    & v$ V6 o; o1 d- w9 {! t; N& X+ n
  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
    4 V5 g( a' S2 d
  25.             }else if(state.speedsub>1){//如果车辆加速$ D6 b8 Q, U/ R
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速* l' o( j5 g4 f9 j
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    * h7 J0 P. r2 ]- s3 q7 g
  28.             }
    ' K' K4 B- l% w/ A2 I! g; C
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声8 D5 V: L5 F. ?& G* j
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声9 u5 ]+ h3 n4 I( o" _4 A* y' P3 [
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启: [/ J5 X( i+ g4 _0 T4 e% b5 l* R
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右$ P8 F$ Z7 w' u' \
  33.             }0 S9 Z. T4 @- P4 \* a+ N
  34.             if(train.speed()*20*3.6>5){4 y. l3 ~! |- A" u' J! _, d& |3 a
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声; z5 _) H8 ]3 u5 a7 [9 s
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声  w4 `2 L1 g6 Q
  37.             }
    3 e6 f( S' v; {, G$ _0 G; P
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    - a# c# G" {8 r; X$ d2 j
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    ( ]7 H2 t. x  X6 d5 S" [
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声: d, G3 b4 A% e. o
  41.             }
    3 L; d! C/ A, i+ K$ M5 Q6 q3 @, n
  42.         }
    . l6 m( b5 Q2 a* e  m" e. G. U
  43.     }1 ]+ z9 D1 }# G  ^4 {6 M  i, u# o
  44.     state.soundsspeed = train.speed();//更新速度1 ?% a9 T  U% s8 n  _6 b
  45.     for(let i=0;i<4;i++){
    ( l1 r" y) l- D) B
  46.         ctx.setDebugInfo(i+"=",state.number[i]);
    % {0 U$ W" v1 X! g5 x$ m" `
  47.     }% B/ S6 G- `. H: `
  48. }
    : {7 @4 P1 c3 I& s' l
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    % ^1 b! u& K0 E; z/ j
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    ! z" t7 N1 ^* X' J
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
    ' f) b; o* w  M0 J
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    9 N" H6 i  Q; B  X
  53.     }
    % ^8 O# c2 D6 M) ]3 K/ c1 k# h
  54.     return nu;//返回新的播放时间
    4 S8 N& |* Q: n) m0 z2 ]
  55. }7 Q% D2 o; C: K4 A  n4 ~
  56. function grnn(min, max) {//随机小数" e+ F  _2 n; x1 o6 {9 I6 q
  57.     return  Math.random()*(max-min)+min;; P3 l6 Y: H: e6 k: E% I6 ~
  58. }
    6 ]+ ^0 X3 W3 G1 G5 |
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的) f6 M- ]/ e8 Q1 ?$ Z
  60.     // 获取列车从车库开出的距离. X! G7 {( H& W1 V
  61.     let railProgress = train.railProgress();
    " J# a+ u% f; u- g7 J6 Z
  62.     // 获取当前轨道的索引" s+ N. E2 J8 e) D- ^! L
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    0 e7 p* D' D- ~' Z/ Y
  64.     // 检查当前轨道索引是否有效1 c* [& n4 ?/ e& F
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {' j- R9 y5 O* {0 S+ ?9 A' x  a
  66.         // 获取当前路径数据对象
    ) [7 }- b, j* q" R
  67.         let currentPathData = train.path().get(currentRailIndex);
    : }, [: x3 \8 S0 A  p* q5 Z( K& R
  68.         // 获取当前轨道使用的自定义轨道名称+ |, ^, \* G) X  q5 r& O
  69.         let trackModelKey = currentPathData.rail.getModelKey();1 _$ G# \" K* N' {$ r& U
  70.         return trackModelKey;; u/ ^! l! S' ?( ?+ ?) E1 S
  71.     }1 O! H0 b- b* G/ v' [$ i
  72.     return null; // 或者是一个默认值
      N; _' o# K( m+ C
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
! j! J6 W" @4 ^, R3 E" _/ e
有事加我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:046 y$ l6 R" M3 g& u& u0 W% b
bve声音要方便一些吧,他有可视化可预览的编辑工具

* Y) Z5 d- T1 M嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
9 G$ K" ?- N8 e- m8 c: c) Q' k/ R( B8 O* _
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 , a/ u5 r4 N, z6 p, a* b. B
huliawsl 发表于 2024-5-17 21:12
1 X( z* B/ A, V2 f& @- g相较于此,我还是认为bve格式会更简单
& i. J+ m1 t5 N' ~
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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