开启左侧

关于随机摇晃、车轮转动、判断轨道类型、使用js完成音效播放的JS代码分享

[复制链接]
Harlotte 作者认证 2024-5-6 21:18:52

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

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

×
随便写了点丰富了一些,我发这些代码分享的帖子会是顺承关系,请尽量阅读最新的帖子来参考。

以下是我的一些代码,有些地方没有用文档里给的东西,但实现效果类似,后期我可能会考虑替换,也欢迎各位尝试。
以下代码欢迎各位借鉴,转移并改编什么的,下面的我自己写的函数和逻辑可能对你有用。
音频播放部分目前因为一些未知的原因还不可用,正在积极探讨,此部分逻辑可用但没有实际效果。
  1. var rms = ModelManager.loadPartedRawModel(Resources.manager(), Resources.idRelative("df5g.obj"), null);//抄的
  2. var models = uploadPartedModels(rms);//抄的
  3. var r=0;//初始化摇晃幅度
  4. var pid=1.12; //轮子直径
  5. var d=-0.446434+0.01; //轮子距原点纵轴距离
  6. var s1=3.1358; //轮子距原点横距离1
  7. var s2=1.80722; //轮子距原点横距离2
  8. var pit = 1;//初始化音高(速度)
  9. var yao=0.1;//摇晃幅度限制
  10. var yao1=0.01;//车速对摇晃幅度的影响幅度

  11. function create(ctx, state, train) {
  12.     state.r = 0.0;
  13.     state.speed = 0;
  14.     state.number=new Array();
  15.   }

  16. function render(ctx, state, train) {
  17.     if(r==0&&grnn(0,800)-train.speed()/10<5&&train.speed()>0){//计算随机摇晃
  18.         r=grn(0,yao+train.speed()*yao1);
  19.     }else if(r>0.1){
  20.         r=r-Math.abs(grnn(0,0.15));
  21.     }else if(r<-0.1){
  22.         r=r+Math.abs(grnn(0,0.15));
  23.     }else{
  24.         r=0;
  25.     };
  26.     if(train.speed()-state.speed>=0){//计算轮子转动
  27.         if(train.isReversed()){
  28.           state.r = state.r - train.speed() / ( pid * Math.PI ) * 360 * Timing.delta() * 20;
  29.         }else{
  30.           state.r = state.r + train.speed() / ( pid * Math.PI ) * 360 * Timing.delta() * 20;
  31.         }
  32.       }else if(train.speed()-state.speed==0){
  33.         state.r = state.r;
  34.         sound(ctx,"mtr:df5g/shache",i,0,0,0,pit,state.number[1],16,0.05);
  35.     };
  36.     let mat = new Matrices();
  37.     let mat2 = new Matrices();
  38.     mat.rotateZ(dtrd(r));
  39.     mat2.rotateZ(dtrd(r)/5);
  40.     for (let i = 0; i < train.trainCars(); i++) {
  41.         ctx.drawCarModel(models["bogie_frame"], i, mat2);
  42.         ctx.drawCarModel(models["bogie_frame_1"], i, mat2);
  43.         ctx.drawCarModel(models["coupler"], i, mat);
  44.         ctx.drawCarModel(models["decorations"], i, mat);
  45.         ctx.drawCarModel(models["doors"], i, mat);
  46.         ctx.drawCarModel(models["frame"], i, mat);
  47.         ctx.drawCarModel(models["shell"], i, mat);
  48.         if(train.isReversed()){
  49.             ctx.drawCarModel(models["light_2"], i, mat);
  50.             ctx.drawCarModel(models["light_11"], i, mat);
  51.         }else{
  52.             ctx.drawCarModel(models["light_1"], i, mat);
  53.             ctx.drawCarModel(models["light_21"], i, mat);
  54.         };
  55.     };
  56.     for (let i = 0; i < train.trainCars(); i++) {//加载轮子
  57.         let mat33 = new Matrices();
  58.         mat33.translate(0,d,0);
  59.         mat33.translate(0,0,s1);
  60.         mat33.pushPose();
  61.         mat33.rotateX(dtrd(state.r));
  62.         ctx.drawCarModel(models["wheel"], i, mat33);
  63.         mat33.popPose();
  64.         mat33.translate(0,0,s2);
  65.         mat33.pushPose();
  66.         mat33.rotateX(dtrd(state.r));
  67.         ctx.drawCarModel(models["wheel"], i, mat33);
  68.         mat33.popPose();
  69.         mat33.translate(0,0,s2);
  70.         mat33.pushPose();
  71.         mat33.rotateX(dtrd(state.r));
  72.         ctx.drawCarModel(models["wheel"], i, mat33);
  73.         mat33 = new Matrices();
  74.         mat33.translate(0,d,0);
  75.         mat33.translate(0,0,-s1);
  76.         mat33.pushPose();
  77.         mat33.rotateX(dtrd(state.r));
  78.         ctx.drawCarModel(models["wheel"], i, mat33);
  79.         mat33.popPose();
  80.         mat33.translate(0,0,-s2);
  81.         mat33.pushPose();
  82.         mat33.rotateX(dtrd(state.r));
  83.         ctx.drawCarModel(models["wheel"], i, mat33);
  84.         mat33.popPose();
  85.         mat33.translate(0,0,-s2);
  86.         mat33.pushPose();
  87.         mat33.rotateX(dtrd(state.r));
  88.         ctx.drawCarModel(models["wheel"], i, mat33);
  89.     };
  90.     ctx.setDebugInfo("r=",state.r);
  91.     ctx.setDebugInfo("dtrd(r)=",dtrd(state.r));
  92.     pit = 1.0 + train.speed() / 4;//计算音高(速度)
  93.     let gmk = getCurrentTrackModelKey(ctx,state,train);//获取当前轨道的自定义轨道名称
  94.     ctx.setDebugInfo("rail=",gmk);
  95.     if(train.isOnRoute()){//如果工作
  96.         for (let i = 0; i < train.trainCars(); i++) {
  97.             sound(ctx,"mtr:df5g/engine2",i,0,0,0,pit,state.number[1],16,1);//播放常见的声音,最后一个是轮播时常,单位是秒,推荐是音频的一半左右
  98.             sound(ctx,"mtr:df5g/engine",i,0,0,0,pit,state.number[2],16,1);//同上
  99.             if(gmk.indexOf("horn")){
  100.                 sound(ctx,"mtr:df5g/horn",i,0,0,0,pit,state.number[3],16,5);//播放鸣笛声,单位是秒,推荐是5秒左右,可以根据需要调整 我这里是因为音频不合适循环播放,实际音频在1s左右
  101.             }
  102.         }
  103.     }
  104.     state.speed=train.speed();//更新速度
  105. }



  106. function uploadPartedModels(rawModels) {//直接搬过来的,上传模型
  107.     let result = {};
  108.     for (it = rawModels.entrySet().iterator(); it.hasNext(); ) {
  109.       entry = it.next();
  110.       entry.getValue().applyUVMirror(false, true);
  111.       result[entry.getKey()] = ModelManager.uploadVertArrays(entry.getValue());
  112.     }
  113.     return result;
  114. }


  115. function grn(min, max) {//随机小数正负
  116.     if(Math.random()>=0.5){
  117.         return  Math.random()*(max-min)+min;
  118.     }else{
  119.         return  0-Math.random()*(max-min)+min;
  120.     }
  121. }


  122. function grnn(min, max) {//随机小数
  123.         return  Math.random()*(max-min)+min;
  124. }


  125. function getCurrentTrackModelKey(ctx, state, train) {//获取当前轨道的自定义轨道名称,让ai写的
  126.     // 获取列车从车库开出的距离
  127.     let railProgress = train.railProgress();
  128.     // 获取当前轨道的索引
  129.     let currentRailIndex = train.getRailIndex(railProgress, true);
  130.     // 检查当前轨道索引是否有效
  131.     if (currentRailIndex >= 0 && currentRailIndex < train.path().size()) {
  132.         // 获取当前路径数据对象
  133.         let currentPathData = train.path().get(currentRailIndex);
  134.         // 获取当前轨道使用的自定义轨道名称
  135.         let trackModelKey = currentPathData.rail.getModelKey();
  136.         return trackModelKey;
  137.     }
  138.     return null; // 或者是一个默认值
  139. }


  140. function dtrd(degrees) {//角度转弧度
  141.     return degrees * Math.PI / 180;
  142. }


  143. function sound(ctx,name2,i,xx,yy,zz,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
  144.     if(Timing.elapsed()>nu){
  145.         ctx.playCarSound(name2 , i , xx , yy , zz , ll , pit);
  146.         nu = Timing.elapsed()+long;
  147.     }else{
  148.         nu = Timing.elapsed();
  149.     }
  150. }
复制代码


评分

参与人数 2车费 +20 收起 理由
ShentongMetro + 10 dalao%%%
Jeffreyg1228 + 10 MTRBBS有你更精彩!

查看全部评分

hhwilk 2024-5-7 16:09:45
b站会出教程吗?
楼主 Harlotte 作者认证 2024-5-7 19:04:29
hhwilk 发表于 2024-5-7 16:09
b站会出教程吗?

等我捣鼓完了会出
hhwilk 2024-5-7 20:50:20
Harlotte 发表于 2024-5-7 19:04
等我捣鼓完了会出

OK,非常期待
ShentongMetro 作者认证 2024-5-9 16:53:28
巨!话说能不能做出外轨超高之类的
(我们这边一直有问题,dh直接不显示了

MTRSHM成员,又叫XHG78999
私信一概不看,有事QQ联系
楼主 Harlotte 作者认证 2024-5-9 18:31:37
ShentongMetro 发表于 2024-5-9 16:53
巨!话说能不能做出外轨超高之类的
(我们这边一直有问题,dh直接不显示了 ...

按理来说是可以的((
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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