开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
# K; T4 L9 Z+ Y7 t. D/ w9 F: r0 y
2 j0 l7 n* ~$ @; a7 N8 l4 b
  t, |- t( n# c' o1 r9 a' |$ ~最近在研究JS 做了一个简单的逻辑来播放声音
  E; j, m6 G1 x% e
  1. var pit = 1;//初始化音高(速度)) `) g, S" t* \$ h, M, l/ ?1 b
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]
    7 t; s7 R; a& M9 {. E5 Z. I; e9 ]6 U
  3. function create(ctx, state, train) {. b$ j2 R3 G) i$ c' n
  4.     state.number = new Array();
    5 q1 k3 V! q# r# n+ D
  5.     state.soundsspeed = 0;//初始化速度' C9 p  J. z! H! a% q
  6.     state.speedsub = 0;
    ( l: ]8 p) a" l) |! J
  7.     for(let i = 0; i < 100; i++){7 }2 f( K/ C/ L% B  i
  8.         state.number[i]=0;//初始化数组5 ]9 W+ _9 f; k% ^( V
  9.     }
    2 ~- w- C( P- T1 o# A; Z
  10. }
    . w- \9 ~8 E1 q) Y
  11. $ b' _3 z- G! ?' {
  12. function render(ctx, state, train) {% u  f3 S& l6 t! m' T$ B) ?# S
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动* L  B/ ~% B: `+ ^! L: Y
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)' A; n5 z5 X% @. X  h0 J; b
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称    9 r% J6 _( ~- z* ^# L# `6 G
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    5 W, N' ~- \1 I1 x2 M' l
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)5 P5 G& U5 O* L- b6 c. h; \% A, u
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作& Z0 M) b0 {" [8 \/ D; b6 z! _
  19.         for (let i = 0; i < train.trainCars(); i++) {3 i0 S% m4 x1 b' Q) H0 n/ T
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启
    6 W# q2 m+ `* H7 F7 E5 j: \) m& C
  21.             if(state.speedsub<-1){//如果车辆减速
    ' d: p1 w; p- x5 |! i6 Q! B
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    / M; V5 |6 C) }4 c! o- 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  A7 y) e3 L) x8 p( H
  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' H+ ]6 A5 R. ]) F+ k& X
  25.             }else if(state.speedsub>1){//如果车辆加速
    0 y, {$ H; J6 s; n/ M
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速4 P) V, O) @9 w3 g0 X: v& N
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    + a4 t% E( S5 C0 r# z/ z
  28.             }) t5 j4 Q9 x7 z5 q* I( P
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声9 L9 Q0 ?/ u1 V+ M: K$ B& e
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声' D& A/ {* v/ s* n, G% A/ w0 M; k8 f9 S
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启
    + b. Z  h- A$ J- I5 z  ~
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    - ^8 w1 n) s) e; E" r) w" i) k
  33.             }8 n' L  Y; @. ?8 E
  34.             if(train.speed()*20*3.6>5){# V! P2 h# |* p/ q; v
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声
    2 m3 ?1 r( m" t# W
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声. D& Q/ t! B" V1 A+ D* L+ k
  37.             }; t3 y! m) b2 R8 e% a7 z
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    ( L4 p/ y, L0 j. O# _
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声( l- {0 l  h" @) X! n3 U8 g9 b
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声* b* g- M- W% T
  41.             }
    3 R, l5 S4 E" r$ C$ G4 G
  42.         }, u/ U# Q9 J$ ?( E  n+ l
  43.     }
    7 I, J& u9 o' K8 T9 u  Q
  44.     state.soundsspeed = train.speed();//更新速度: G; O2 j& U. g& i/ h# b- z8 L
  45.     for(let i=0;i<4;i++){
    & T( u' T- ?" p9 M
  46.         ctx.setDebugInfo(i+"=",state.number[i]);2 d8 ?/ L7 r1 c# _9 V, s% s
  47.     }
    6 R9 }4 \' m( E& P3 Q
  48. }
    4 ?+ s8 B) e5 o+ C8 r+ w& F
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间6 t+ T+ m. o% r# {3 s/ Y( y
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
    * K6 e" g9 t/ Y3 E2 v
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放& k4 j! X+ S1 J! n! c2 }1 L
  52.         nu = Timing.elapsed()+long;   //更新播放时间
    ' ]; D2 l" l" h) G0 u
  53.     }1 z; s* y& r: Y* g  }  U1 Q3 t
  54.     return nu;//返回新的播放时间
    ' `9 k3 M4 @5 ]6 A* V
  55. }
    " s  D4 `* E- B" Q. N
  56. function grnn(min, max) {//随机小数2 I' W7 F  F% W
  57.     return  Math.random()*(max-min)+min;
    . M. ]' D3 T2 l# M
  58. }
    , P. o. j* I. A$ m1 O% a6 L
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    7 K# Z" `$ N& v$ }8 w/ F" m
  60.     // 获取列车从车库开出的距离
    . f$ E! y) J' N) m3 |" A7 S
  61.     let railProgress = train.railProgress();
    # E2 W5 o# C9 y. P4 q
  62.     // 获取当前轨道的索引% A9 H- n4 R  K! W2 [
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);  r, F% v4 p. h5 d8 Z
  64.     // 检查当前轨道索引是否有效
    % W5 O. ^8 O* N
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
    5 Z2 u' Z' H% x
  66.         // 获取当前路径数据对象& S, w7 i4 J  d: R" n1 F3 E$ A
  67.         let currentPathData = train.path().get(currentRailIndex);9 {7 Y! @, A1 m' o5 L, s6 g
  68.         // 获取当前轨道使用的自定义轨道名称
    % Y. n6 _5 o: J- s" X. V
  69.         let trackModelKey = currentPathData.rail.getModelKey();
    , T+ h: R" o1 }+ E; ?' G; h
  70.         return trackModelKey;
    $ K; G- w3 `" N  ?6 _. ~0 Q5 t( m
  71.     }' X+ @& M- F  x# ~% y
  72.     return null; // 或者是一个默认值
    * ]3 D! a3 ^% T
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错; v3 A7 |2 W3 a# 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:049 [& i* B3 Z; N" p
bve声音要方便一些吧,他有可视化可预览的编辑工具
: P0 V7 C6 r3 v4 _& {
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑 2 b$ f- Q0 l! i  k$ J

- s& ^8 b/ k3 I! Y相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ; }, C5 c) W. \6 E* b0 v
huliawsl 发表于 2024-5-17 21:12
$ Z$ L1 ^. q, q5 W1 ]6 l相较于此,我还是认为bve格式会更简单

7 B' |5 l& U1 j🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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