开启左侧

给点播放声音的新思路

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

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

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

×
本帖最后由 Harlotte 于 2024-5-18 15:24 编辑
; x; Y; x- x1 W7 O: g
6 z- T% C% \, B: x1 \! J5 R
2 c4 \4 L; |5 h. e7 X& d5 H2 y最近在研究JS 做了一个简单的逻辑来播放声音3 O1 |/ I- }2 }% g3 K( m
  1. var pit = 1;//初始化音高(速度)6 g; o  O7 \3 A2 _$ u  c: Z
  2. var wheelsounds = ["mtr:df5g_wheel1","mtr:df5g_wheel2","mtr:df5g_wheel3"]! [+ D, k! Y, ~" v/ p9 }# r
  3. function create(ctx, state, train) {1 ~' T# Y) y% ~! P7 c
  4.     state.number = new Array();" s! Z$ Z7 C2 B, N& R! L3 R& q$ w
  5.     state.soundsspeed = 0;//初始化速度/ ?+ Y$ U  J! q- d+ Y
  6.     state.speedsub = 0;
    " b* _2 K/ M& r& I5 R+ Z* O4 @
  7.     for(let i = 0; i < 100; i++){& Q7 {: V) ]% p" v4 f3 F. D
  8.         state.number[i]=0;//初始化数组. E% ]# b- E' q
  9.     }
    ! V$ o( l1 O7 o
  10. }
    0 p: k: \5 [  {  \
  11. 4 V! q0 |( P% p0 i' H. g$ G
  12. function render(ctx, state, train) {
    ( l& F* ]5 e7 Y. B
  13.     ctx.setDebugInfo("sounds=",1);//记录声音程序已启动9 x* H/ F! ?: _$ d* x
  14.     pit = 1 + train.speed() / 40;//更新音高(速度)
    ' Z! E9 t$ \) {3 L# S
  15.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称   
    - f& A1 p! R$ w/ |
  16.     state.speedsub = (train.speed() - state.soundsspeed) * Timing.delta() * 1000000;//计算速度差
    9 q5 e% o: n9 P. m
  17.     ctx.setDebugInfo("speedsub=",state.speedsub)
    + D2 }3 M# \, y( L6 @7 O
  18.     if(train.isOnRoute()&&gamerunning==1){//如果工作
    : C0 R$ n% m" Q) ^& R% D
  19.         for (let i = 0; i < train.trainCars(); i++) {* e9 ^( \; A# m8 v
  20.             ctx.setDebugInfo("soundsrun",1);//记录声音开启. J9 `/ L/ u: `! [: l
  21.             if(state.speedsub<-1){//如果车辆减速
    - z# h9 ]# v1 q$ m
  22.                 ctx.setDebugInfo("shache",1);//记录刹车
    : b# y( K& E8 w. ~# j) ^7 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);//更新返回时间 播放刹车声在转向架1
    ! H6 r# @3 {& f6 n5 N: k
  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
    6 I. {3 O) [* H7 d" F, i
  25.             }else if(state.speedsub>1){//如果车辆加速* P: k" q$ P) I8 p5 Q
  26.                 ctx.setDebugInfo("addspeed",1);//记录加速1 F7 Q# p8 Y9 v
  27.                 state.number[2]=sound(ctx,"mtr:df5g_engine",i,soundspos.engine,pit,state.number[2],20,grnn(0.8,1));//播放加速声
    5 s* B9 y* M: i3 h1 r
  28.             }$ Q$ i  n. S' L/ q: y
  29.             state.number[1]=sound(ctx,"mtr:df5g_engine2",i,soundspos.engine,pit,state.number[1],16,1);//播放怠速声. y, l/ E* R/ X7 g. `! z; c( w
  30.             if(gmk.indexOf("horn")!=-1){//如果在轨道名称里找到了horn,则播放鸣笛声
    , j/ F$ ?) p- A8 G/ \) o5 w" O4 h
  31.                 ctx.setDebugInfo("horn",1);//记录鸣笛声开启! }, a% o* ~8 p% n. D
  32.                 state.number[3]=sound(ctx,"mtr:df5g_horn",i,soundspos.horn,1,state.number[3],32,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
    , S- @& O0 s: R
  33.             }
    ( G5 u9 O0 V, H; z8 o
  34.             if(train.speed()*20*3.6>5){
    - r3 U/ n8 \- l7 d6 ~) R
  35.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking2,pit,state.number[4],16,9);//播放普通轮轨声/ A9 y; G4 U% R2 p; j) F7 y
  36.                 state.number[4]=sound(ctx,"mtr:df5g_wheelrun",i,soundspos.braking1,pit,state.number[4],16,9);//播放普通轮轨声
    7 l# Y: J" a/ X( f% v1 p
  37.             }8 X  n" ^! X$ }$ z# K3 v+ G  S: g
  38.             if(train.speed()>0&&grnn(0,20+train.speed()/30)>19){
    / e4 |- R/ E: r
  39.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking2,0.8,state.number[5],32,0.05);//播放撞轨声6 D" ?7 w6 B' W
  40.                 state.number[5]=sound(ctx,wheelsounds[Math.floor(grnn(0,3))],i,soundspos.braking1,0.8,state.number[5],32,0.05);//播放撞轨声
    ! V5 \8 t  Q( X4 w: J1 M8 n  L
  41.             }/ X, f0 M1 ^; H0 H1 p
  42.         }
    7 R6 h1 ?* S3 J. g. R* A: U
  43.     }* [5 U6 J, x$ K# a2 w- J8 m* |
  44.     state.soundsspeed = train.speed();//更新速度1 U4 A$ G0 r: l8 T( }
  45.     for(let i=0;i<4;i++){
    5 w2 U: ^: G& x) l( n
  46.         ctx.setDebugInfo(i+"=",state.number[i]);) ^) f- ]" h1 n% f( {
  47.     }
    ( `2 W& `. g* L4 m1 T+ X: X# S
  48. }; S3 M& ~  ]( M1 s. E" ^. ^: b
  49. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
    4 p- l, P8 ?6 W$ z% n* R9 @" V, X
  50.     if(Timing.elapsed()>nu){//如果时间超过了播放时间5 G$ e& O& [* D( b0 F) g* X
  51.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放: R* F9 y& e- E1 s+ t
  52.         nu = Timing.elapsed()+long;   //更新播放时间: U( g) e7 h6 f, P
  53.     }4 j* H& s+ ^+ L. G6 E/ x& _
  54.     return nu;//返回新的播放时间
    4 Q" e& r0 A) E- q
  55. }% q- o4 C4 }' _
  56. function grnn(min, max) {//随机小数
    $ @6 }- d3 ?- [$ W  Q
  57.     return  Math.random()*(max-min)+min;5 `2 _1 `; }  t+ o! |+ b5 u( e
  58. }: o- G, O4 ]- x1 V( K: C- _( A
  59. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
    " N1 X8 ]" a1 w5 d8 D
  60.     // 获取列车从车库开出的距离' D/ z7 C* \/ M' I
  61.     let railProgress = train.railProgress();. A; E! @" g- k1 M* K4 A+ L# C& O
  62.     // 获取当前轨道的索引* p6 U8 y( L! C9 u7 h5 g/ _
  63.     let currentRailIndex = train.getRailIndex(railProgress, true);
    # ]# C9 G) \, p9 O( g5 B. L
  64.     // 检查当前轨道索引是否有效
    , W0 }1 Z( h" W7 S# {
  65.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {) C! g7 x& m" N$ n3 l  G2 m
  66.         // 获取当前路径数据对象9 z* ~+ B  \) ]
  67.         let currentPathData = train.path().get(currentRailIndex);
    # I2 N- m0 \% _
  68.         // 获取当前轨道使用的自定义轨道名称) H8 p' K4 ]$ l
  69.         let trackModelKey = currentPathData.rail.getModelKey();4 }5 n+ v0 H) @; H
  70.         return trackModelKey;. J8 a( o  a3 [9 p4 N
  71.     }8 u3 p9 J. f+ W  W9 J: T5 k
  72.     return null; // 或者是一个默认值$ i/ _% J; Z  N3 ~, J
  73. }
复制代码
相比bve 用这种方式可以搞更多的逻辑,随机叠加音频,实测效果非常不错" O9 W7 e" z3 K; m8 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* p6 C$ c5 b! i( {) d
bve声音要方便一些吧,他有可视化可预览的编辑工具
; L* Q  v+ F. X+ L! U, M1 k% b$ `
嘶 主要是这个把 我懒得学了
有事加我QQ: 3435494979
huliawsl 2024-5-17 21:12:04
本帖最后由 huliawsl 于 2024-5-17 22:09 编辑
9 n' P0 {3 U" d" U; u( b
5 }8 \- U+ ~; [/ u4 K& }+ g& I! c& S相较于此,我还是认为bve格式会更简单
屑搞3d的 https://space.bilibili.com/403409690
mtrbbs的私信咱很少看 如果需要联系咱可以尝试其他途径
楼主 Harlotte 作者认证 2024-5-18 09:21:18
本帖最后由 Harlotte 于 2024-5-18 15:18 编辑 ) h0 m" J5 h: U8 V4 C0 t/ K; U
huliawsl 发表于 2024-5-17 21:12
0 S/ v, t4 {$ N# J$ |5 [7 e% \. j相较于此,我还是认为bve格式会更简单

# ], z8 S1 R: ]2 e) r! ]- D🤔不过吧 这么做花样可以更多倒是
有事加我QQ: 3435494979
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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