使翻译对象与某物发生碰撞

问题描述

//Spielfeld Größe
int sizeX = 800;
int sizeY = 600;

//Robo Startposition
float roBox = sizeX/2;
float roboY = sizeY/2;

//Robo Speed
float speed = 0.03;

//Robo acceleration
float accel = 0.05;

float x1;
float y1;


void setup() {
  size(800,600);
  frameRate(60);
  background(200);
}


void draw() {
  background(200);
  println("x " +x1);
  println("y " +y1);
  robo();
  x1=screenX(roBox,roBox);
  y1=screenY(roboY,roboY);
  stopRobot();
  object();
}

//Beschleunigung zurücksetzen
void mouseReleased() {
accel = 0.05;
}

void robo() {
  rectMode(CENTER);

  //RoboMovement
if(mousepressed){
  float zielX = mouseX;
  float moveX = zielX - roBox;
  roBox += moveX * speed*accel;

  float zielY = mouseY;
  float moveY = zielY - roboY;
  roboY += moveY * speed*accel;
  
  //Beschleunigung am Anfang
  if(accel< 1) {
  accel += 0.05;
  }
}
pushmatrix();

  translate(roBox,roboY); 

  rotate(atan2(mouseY-roboY,mouseX-roBox));
  rotate(radians(90));


  //HitBox
  fill(0,0);
  stroke(160);
  ellipse(0,78,78);

  nostroke();

  //Track Connectors
  fill(129,29,29);
  rect(18,12,10,8);
  rect(18,-12,8);
  rect(-18,8);

  //Robo Body
  fill(63,82,21);
  rect(0,13,30);
  ellipse(7,15,20,20);
  ellipse(-7,20);
  ellipse(7,-15,20);
  rect(9,16,23);
  rect(0,17,15);
  rect(-9,-17,15);

  //Robo Body Details
  fill(120);
  ellipse(0,25,25);

  fill(60);
  rect(0,-18,6,36);
  rect(0,-36,5);
  ellipse(0,20);

  fill(255,20);
  ellipse(10,18,5,5);


  //Robo Tracks

  //Right
  fill(80);
  rect(25,34);
  ellipse(24,10);
  ellipse(26,10);
  ellipse(24,-20,10);

  //Left
  rect(-25,34);
  ellipse(-24,10);
  ellipse(-26,10);
  ellipse(-24,10);

  //Track Details
  fill(140);
  for (int i = -21; i< 22; i += 6) {
    rect(25,i,2);
    rect(-25,2);
  }
  popMatrix();
}






float [] [] bobject= new float [][] {{250,250},{500,500},{100,100}};
void object() {
  fill(255);
  stroke(0);
  circle(bobject[0][0],bobject[0][1],20);
  circle(bobject[1][0],bobject[1][1],20);
  circle(bobject[2][0],bobject[2][1],20);
}


void stopRobot() {
  
  
  
  if(dist(x1,y1,bobject[0][0],bobject[0][1])<=45){
    speed=0;
    if(mouseX<bobject[0][0]){
      speed=0.03;}
    if(mouseY>bobject[0][1]){
      speed=0.03;}
    }
  
  
  
  
  
  
  if ( x1<=0+45) {
    speed=0;
    if (mouseX>=0) {
      speed=0.03;
    }
  }
  if ( x1>=width-45) {
    speed=0;
    if (mouseX<=width-45) {
      speed=0.03;
    }
  }
  if ( y1<=0+47) {
    speed=0;
    if (mouseY>=0+47) {
      speed=0.03;
    }
  }
  if ( y1>=height-45) {
    speed=0;
    if (mouseY<=height-45) {
      speed=0.03;
    }
  }
}

这是代码,基本上的想法是,如果机器人与墙壁/物体碰撞,它会停止,独立于小圆圈的位置。 不知何故我无法粘贴代码,所以这里有一个指向文件链接

https://drive.google.com/drive/folders/1AvXQ2-stM-ubR38XSVG0zOaKvXHJTkC7?usp=sharing

如果有人能帮我就好了

解决方法

代码有点乱,但我设法制作了您需要的东西,您需要做的第一件事是将坦克的半径初始化为全局变量,以便您稍后检查与它的碰撞。其次,最好通过添加第三个值来存储半径来更改您的 circles 数组,这样您就可以检查多个大小圆的碰撞。然后我实现了一个简单的检查碰撞方法,它检查给定位置 (x,y) 是否坦克会与任何圆圈发生碰撞。最后你需要做的是在移动之前存储坦克位置,然后检查新位置是否真的与任何圆圈碰撞,如果是,你需要停止坦克并将其放回之前的位置。我希望我的解释有意义,这是最终的代码:

//Spielfeld Größe
int sizeX = 800;
int sizeY = 600;

//Robo Startposition
float roboX = sizeX/2;
float roboY = sizeY/2;

//Robo Speed
float speed = 0.03;
float robotRadius = 78;

//Robo Acceleration
float accel = 0.05;

float x1;
float y1;


void setup() {
  size(800,600);
  frameRate(60);
  background(200);
}


void draw() {
  
  background(200);
    
  println("x " +x1);
  println("y " +y1);
  robo();
  x1=screenX(roboX,roboX);
  y1=screenY(roboY,roboY);
  object();
}

//Beschleunigung zurücksetzen
void mouseReleased() {
accel = 0.05;
}

void robo() {
  rectMode(CENTER);

  //RoboMovement
if(mousePressed){
  //save robot position before moving it
  float saveX = roboX;
  float saveY = roboY;
  
  float zielX = mouseX;
  float moveX = zielX - roboX;
  roboX += moveX * speed*accel;

  float zielY = mouseY;
  float moveY = zielY - roboY;
  roboY += moveY * speed*accel;
  
  //check if its colliding after moving it
  if(checkCollision(roboX,roboY))
  {
    //in case the tank collide,put the robot baack and make acc = 0
    accel = 0;
    roboX = saveX;
    roboY = saveY;
  }
  
  //Beschleunigung am Anfang
  if(accel< 1) {
  accel += 0.05;
  }
}
pushMatrix();

  translate(roboX,roboY); 

  rotate(atan2(mouseY-roboY,mouseX-roboX));
  rotate(radians(90));


  //Hitbox
  fill(0,0);
  stroke(160);
  ellipse(0,robotRadius,robotRadius);

  noStroke();

  //Track Connectors
  fill(129,29,29);
  rect(18,12,10,8);
  rect(18,-12,8);
  rect(-18,8);

  //Robo Body
  fill(63,82,21);
  rect(0,13,30);
  ellipse(7,15,20,20);
  ellipse(-7,20);
  ellipse(7,-15,20);
  rect(9,16,23);
  rect(0,17,15);
  rect(-9,-17,15);

  //Robo Body Details
  fill(120);
  ellipse(0,25,25);

  fill(60);
  rect(0,-18,6,36);
  rect(0,-36,5);
  ellipse(0,20);

  fill(255,20);
  ellipse(10,18,5,5);


  //Robo Tracks

  //Right
  fill(80);
  rect(25,34);
  ellipse(24,10);
  ellipse(26,10);
  ellipse(24,-20,10);

  //Left
  rect(-25,34);
  ellipse(-24,10);
  ellipse(-26,10);
  ellipse(-24,10);

  //Track Details
  fill(140);
  for (int i = -21; i< 22; i += 6) {
    rect(25,i,2);
    rect(-25,2);
  }
  popMatrix();
}

//added a 3rd value to the circles array to store the radius
float [][] bobject= new float [][] {{250,250,20},{500,500,{100,100,20}};
void object() {
  fill(255);
  stroke(0);
  for(int i=0; i<bobject.length; i++)
  {
    circle(bobject[i][0],bobject[i][1],bobject[i][2]);
  }
}

//deleted stopRobot method

//created a method to check weather a specific place has a collision with a circle
boolean checkCollision(float x,float y)
{
  //for every circle in the array,check weather the distance between it and the given tank position is lower than both radius sumed ( which means they collide )
  for(int i=0; i<bobject.length; i++)
  {
    if(dist(x,y,bobject[i][0],bobject[i][1])< (robotRadius + bobject[i][2])/2)
      return true;
  }
  return false;
}

有不明白的地方欢迎在评论中提问