预期目标的碰撞改为仅沿轴碰撞

Collision for intended target is instead colliding along axis only

我试图让一个物体与两个障碍物中的任何一个碰撞并设置它的位置,但是每当我经过其中一个障碍物时它就会记录碰撞,老实说,我很困惑自己并且没有知道此时出了什么问题。这是我正在使用的代码,与其他所有代码分开:

int[] player1;
int[] player2;
int p1width = 50;
int p1height = 50;
int sandbagwidth = 30;
int sandbagheight = 200;
int sand11 =200;
int sand12 = 0;
int sand21 =200;
int sand22 = 400;
void setup(){
  size(1200, 600);
  player1= new int[] {250, 250};

}

void draw(){
  //draw players
  fill(0);
  rect(0,0,width/2,height);
  fill(255,0,0);
  rect(600,0,width/2,height);
  //move players
  fill(255);
  rect(player1[0], player1[1], p1width, p1height);
  if (keyPressed) {
    switch(keyCode) {
    case LEFT:
      player1[0] -=10;
      break;
    case RIGHT:
      player1[0] +=10;
      break;
    case UP:
      player1[1] -=10;
      break;
    case DOWN:
      player1[1] +=10;
      break;
    }
  }



   if(player1[0]+25>1150){
     player1[0]-=25;
   }
   if(player1[0]-25<0){
     player1[0]+=50;
   }


   if(player1[1]+25>550){
     player1[1]-=25;
   }
   if(player1[1]-25<0){
     player1[1]+=50;
   }

   //COLLISION
   fill(0,255,0);
   rect(sand11, sand12, sandbagwidth, sandbagheight);
   fill(0,255,0);
   rect(sand21, sand22, sandbagwidth, sandbagheight);
   if(player1[0] + p1width/2 > sand11 -  sandbagwidth/2
    && player1[0] - p1width/2 < sand11 + sandbagwidth/2
    && player1[1] + p1height/2 > sand12 - sandbagheight/2
    && player1[1] - p1height/2 < sand12 + sandbagheight/2){
     player1[0]=220;
     player1[1]=250;
    }

    if(player1[0] + p1width/2 > sand21 - sandbagwidth-25
    && player1[0] - p1width/2 < sand21 + sandbagwidth-25
    && player1[1] + p1height/2 > sand22 - sandbagheight-25
    && player1[1] - p1height/2 < sand22 + sandbagheight-25){
     player1[0]=50;
     player1[1]=50;
   }
  }

在我看来,您使用 player1sandXX 等作为绘图时的左上角,但在计算碰撞时作为中心(除非您有 rectMode 调用你没有包含的代码)。这很容易导致你的错误 - 尝试通过底部的底部沙袋,即使那里没有可见的缝隙。

吹毛求疵:你还在常量和计算值之间切换;这会在很长一段时间 运行 中咬你一口,即使它在这里有效。例如,rect(600,0,width/2,height) 可能应该是 rect(width/2,0,width/2,height)。碰撞响应代码中的 player1[0]=220 更适合替换为基于您的变量的计算。