开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑 % k. H7 W! Z+ K; t" N; P. `, y

8 ?5 F  e8 l+ m6 m, e. i/ i" U0 g: I9 s/ H; ?& U( K
最近在研究JS 做了一个简单的逻辑来播放声音) }8 |7 c4 W; T" z$ U
  1. var pit = 1;//初始化音高(速度)
    ( d+ @& Z7 B9 H- p
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    % z( {- n5 }( P8 q5 J& m/ C
  3. function create(ctx, state, train) {
    & r" J: g6 r1 _( O5 P2 O& b
  4.     state.number = new Array();% v, u5 D1 G4 D* b8 p' ^; \6 ?4 w
  5.     state.soundsspeed = 0;//初始化速度; a" W# T9 r! i4 A' m2 D& j4 u
  6.     state.speedsub = 0;
    / @9 e) ^0 z+ u& X# }
  7.     for(let i = 0; i < 100; i++){
    7 I) `2 K9 Z+ q6 |
  8.         state.number[i]=0;//初始化数组
    + A  O  n% U' |0 A6 ?
  9.     }  k2 Y4 X; T2 T3 w) p* |
  10. }* u% N$ ?) F5 e. F
  11. 4 p! R6 O" t3 `. P
  12. function render(ctx, state, train) {6 z8 C# o1 Z) X* z
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动
    5 E2 r) u* ]" i3 M3 F3 y- _
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    / }; X) f5 X; V7 z3 n- {6 y
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    % x. X2 x* J3 Z
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差1 ~5 @1 C3 y  c+ Q7 l! z5 G
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    * n. n6 }6 y* z: z4 J
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    8 t2 V5 w- J) P+ [& {% H
  19.         for (let i = 0; i < train.trainCars(); i++) {
    7 V4 `# J2 o* X; G
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启, L1 T$ i* D( {1 k( V
  21.             if(state.speedsub<-1){//如果车辆减速8 Q8 h* ?2 \4 _! V+ ?
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    9 h% B: ?/ F8 Y# ?: ~8 @- z
  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);//更新返回时间 播放刹车声在转向架17 x; P. I! O" H& E/ P- 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);//更新返回时间 播放刹车声在转向架2
    8 e4 {5 |/ U3 F- e& R% x
  25.             }else if(state.speedsub>1){//如果车辆加速
    7 Y) V! i) k0 ]% b* c
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速
    % j1 q3 ~7 b5 s1 Q
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    4 ^( D9 o5 w+ c0 s! \; K
  28.             }
    & {/ V; B2 R' }! s7 H
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声) g2 K/ i) d* N, M( `$ d) r
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声% u# f5 Y5 L0 I) ]
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启0 N! t7 @+ |7 |1 Z$ ?, V7 C: L- `
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    9 G# o& W3 P7 D! n
  33.             }) P1 O5 @8 ], L7 {& h; \% x6 ~- A
  34.             if(train.speed()*20*3.6>5){' h1 t  B4 z" w* K1 n  c
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    ( n0 C3 Z6 X& k- F% ^0 {
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    ' O1 n- I$ P$ L* T
  37.             }; r$ ^2 @4 P9 G$ V. L: a
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){/ |6 x" y' F( [
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声
    , n5 O; S) v+ f& n! e
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    : D: M' i8 R' D; b7 j
  41.             }
    3 G- h4 D, p' t  B! f
  42.         }
    + {) s; ?% B& a; N$ B
  43.     }
    ( W, |( t0 s3 u2 D5 B6 U) c- H
  44.     state.soundsspeed = train.speed();//更新速度
    ! t9 c/ }: Y6 j# X
  45.     for(let i=0;i<4;i++){2 m. h7 \3 |' Z# A
  46.         ctx.setDebugInfo(i+"=",state.number[i]);2 ]9 [) Y1 f; g: G. E1 K
  47.     }
    2 P$ z& q1 H3 s; m
  48. }
    7 M3 i1 m1 M6 C, _5 R& X' g" a6 W
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    $ U8 s6 Q; o: U( P& i  I
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    $ G# X. G- {& b9 ?5 k$ K
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放! Q3 U) l) X4 k% ]2 D1 u1 c) l  l
  52.         nu = Timing.elapsed()+long;   //更新播放时间0 |+ {! Q! \% v
  53.     }) z9 W: d, W, N3 M# _
  54.     return nu;//返回新的播放时间* H7 t: t  d# ~6 {( z, W
  55. }
    5 a9 e# r. m7 ~" X, L  [/ T
  56. function grnn(min, max) {//随机小数
    4 p7 ^; M! a  s/ G
  57.     return  Math.random()*(max-min)+min;+ N% l: h3 h2 N5 F- t$ ^" H! N4 q
  58. }
    ! u) m) O; ^* g: o; _2 E/ E
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的9 ?8 f1 c( Z' j' k7 O# P% Y6 t
  60.     // 获取列车从车库开出的距离& z9 N3 |% h8 P! z
  61.     let railProgress = train.railProgress();
    ) g. j( {6 R  [+ K
  62.     // 获取当前轨道的索引
    . t( [9 e) `( |$ \: S3 g) S) m
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);, ?! s$ M) N# o4 C) L2 q( i3 i
  64.     // 检查当前轨道索引是否有效: q1 A$ ^1 [2 ~1 D# @6 M0 l
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {8 V9 E9 N8 ^4 W# v. J
  66.         // 获取当前路径数据对象
    : M7 {  O* W+ h2 V  ?
  67.         let currentPathData = train.path().get(currentRailIndex);
      w% u: ]- \. `; F( u% @
  68.         // 获取当前轨道使用的自定义轨道名称
    1 [+ _+ X9 V5 F# t5 p
  69.         let trackModelKey = currentPathData.rail.getModelKey();. v5 R9 F( z9 `# ^7 h3 x# j
  70.         return trackModelKey;( j& |! }, J" i" f
  71.     }6 l; E" T9 o7 b4 O; S: ?# D1 |
  72.     return null; // 或者是一个默认值
    4 j4 m8 y" @+ J- b8 C8 y7 ~9 |( k
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错
+ m) ?, ~# q8 |+ Y
有事加我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, O& ^, H8 u5 d2 c
bve声音要方便一些吧,他有可视化可预览的编辑工具
6 m& Q2 @. C! |7 B7 _0 I
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
3 ~& f6 ]  p* a, |4 z  J  N9 t! k' Z6 W% C% [
相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ' `' {, ]) D) f/ B) W. m5 e/ l
huliawsl 发表于 2024-5-17 21:12
/ T6 B" A* ^0 H- ?) Q" |* X相较于此,我还是认为bve格式会更简单
7 L; I+ }; @& V: ~3 E/ O0 ~
🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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