开启左侧

雨刮器的代码分享

[复制链接]
Harlotte 作者认证 2024-5-18 15:28:16

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

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

×
这是一个好久前就完成的项目 但是一直没发 今天发出来跟大家分享一下,其中我还为它添加了声音。
请注意 有些全局变量我没有在这里声明,声明部分在main函数中,如单独使用须声明。


  1. var wipersmodels = uploadPartedModels(ModelManager.loadPartedRawModel(Resources.manager(), Resources.idRelative("df5g_wipers.obj"), null));//抄的
  2. var wipersounds = ["mtr:df5g_wiper1" , "mtr:df5g_wiper2"];
  3. function create(ctx, state, train) {
  4.     state.wipersrot = 45;//旋转度数
  5.     state.wipersrotlast = 45;//上一次旋转度数
  6.     state.wipersrottarget = 0;//目标度数
  7.     state.wiperstime = 0;//计时器
  8.     state.wipersstarttimelast = 0;//上一次计时器
  9.     state.wiperstarttime = 0;//开始时间
  10.     state.wiperrun = 0;//运行状态
  11.     state.number = new Array();
  12.     for(let i = 0; i < 100; i++){
  13.         state.number[i]=0;//初始化数组
  14.     }
  15. }

  16. function render(ctx, state, train) {
  17.     ctx.setDebugInfo("wipers=",1);
  18.     ctx.setDebugInfo("wipersrot=",state.wipersrot);
  19.     ctx.setDebugInfo("wiperrun=",state.wiperrun);
  20.     ctx.setDebugInfo("wiperstarttime=",state.wiperstarttime);
  21.     ctx.setDebugInfo("wipertarget=",state.wipersrottarget)
  22.     ctx.setDebugInfo("sound=",wipersounds[Math.floor(grnn(0,2))])
  23.     let mata = new Matrices();
  24.     let matrot4f = new Matrix4f();
  25.     for(j = 0; j < 4; j++){
  26.         mata = new Matrices();
  27.         MatricesTranslateVector3f(mata,wiper.pos[j]);
  28.         mata.rotateZ(dtrd(-state.wipersrot)*wiper.rot[j]);
  29.         for(let i = 0; i < train.trainCars(); i++){
  30.             ctx.drawCarModel(wipersmodels[wiper.model1[j]],i,mata);
  31.         }
  32.         matrot4f = new Matrix4f();
  33.         matrot4f.rotateZ(dtrd(-state.wipersrot+22.5)*wiper.rot[j]);
  34.         matrot4f.translate(0,wiper.dir[j]*wiperlong,0);
  35.         mata = new Matrices();
  36.         MatricesTranslateVector3f(mata,vectadd(wiper.pos[j],matrot4f.getTranslationPart()));
  37.         for(let i = 0; i < train.trainCars(); i++){
  38.             if(state.wiperrun==1){
  39.                 state.number[4*i+j+10]=sound(ctx,wipersounds[Math.floor(grnn(0,2))],i,matrot4f.getTranslationPart(),1,state.number[4*i+j+10],12,1);//播放雨刮声
  40.             }
  41.             ctx.setDebugInfo(4*i+j+10+"=",state.number[4*i+j+10]);
  42.             ctx.drawCarModel(wipersmodels[wiper.model2[j]],i,mata);
  43.         }
  44.     };
  45.     if(state.wiperrun == 1){
  46.         if(state.wipersrottarget == 45){//向另一侧缓动
  47.             state.wipersrot = smoothEnds(0,45,state.wiperstarttime,state.wiperstarttime + wiperspeedcoefficient,state.wiperstime);
  48.             ctx.setDebugInfo("wiperDO=",1);
  49.         }else if(state.wipersrottarget == 0){//要回到原始位置
  50.             state.wipersrot = smoothEnds(45,0,state.wiperstarttime,state.wiperstarttime + wiperspeedcoefficient,state.wiperstime);
  51.             ctx.setDebugInfo("wiperDO=",2);
  52.         }
  53.         state.wipersrotlast = state.wipersrot;
  54.         state.wipersstarttimelast = state.wiperstime;
  55.     };
  56.     if(train.isOnRoute()){
  57.         if(MinecraftClient.worldIsRaining()){
  58.             state.wiperrun = 1;
  59.             if(state.wipersrot == 45){
  60.                 state.wipersrottarget = 0;
  61.                 state.wiperstarttime = state.wiperstime;
  62.                 ctx.setDebugInfo("wiperCH=",1);
  63.             }else if(state.wipersrot == 0){
  64.                 state.wipersrottarget = 45;
  65.                 state.wiperstarttime = state.wiperstime;
  66.                 ctx.setDebugInfo("wiperCH=",0);
  67.             }
  68.         }else{
  69.             state.wiperrun = 0;

  70.                 state.wipersrot = smoothEnds(state.wipersrotlast,0,state.wipersstarttimelast+0.5,state.wipersstarttimelast + wiperspeedcoefficient * 0.8 * state.wipersrotlast / 45+0.5,state.wiperstime);
  71.         }
  72.     }
  73.     state.wiperstime += Timing.delta();//计时器增加
  74.     ctx.setDebugInfo("wipertime=",state.wiperstime);
  75. }

  76. function uploadPartedModels(rawModels) {//直接搬过来的,上传模型
  77.     let result = {};
  78.     for (it = rawModels.entrySet().iterator(); it.hasNext(); ) {
  79.       entry = it.next();
  80.       entry.getValue().applyUVMirror(false, true);
  81.       result[entry.getKey()] = ModelManager.uploadVertArrays(entry.getValue());
  82.     }
  83.     return result;
  84. }

  85. function smoothEnds(startValue, endValue, startTime, endTime, time) {//从隔壁抄的原本被用于车门缓动的函数
  86.     if (time < startTime) return startValue;
  87.     if (time > endTime) return endValue;
  88.     let timeChange = endTime - startTime;
  89.     let valueChange = endValue - startValue;
  90.     return valueChange * (1 - Math.cos(Math.PI * (time - startTime) / timeChange)) / 2 + startValue;
  91. }

  92. function dtrd(degrees) {//角度转弧度
  93.     return degrees * Math.PI / 180;
  94. }

  95. function vectadd(v1,v2){//向量相加
  96.     return new Vector3f(v1.x()+v2.x(),v1.y()+v2.y(),v1.z()+v2.z());
  97. }

  98. function MatricesTranslateVector3f(mat,vect){
  99.     mat.translate(vect.x(),vect.y(),vect.z());
  100. }

  101. function sound(ctx,name2,i,vect,pit,nu,ll,long){//播放声音pit是音高(速度) nu是一个数组,用来记录播放时间,ll是音频响度,long是循环播放时间
  102.     if(Timing.elapsed()>nu){//如果时间超过了播放时间
  103.         ctx.playCarSound(Resources.id(name2) , i , vect.x() , vect.y() , vect.z() , ll , pit);//播放
  104.         nu = Timing.elapsed()+long;   //更新播放时间
  105.     }
  106.     return nu;//返回新的播放时间
  107. }

  108. function grnn(min, max) {//随机小数
  109.     return  Math.random()*(max-min)+min;
  110. }
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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