【问题标题】:make a translated object collide with something [duplicate]使翻译的对象与某物发生碰撞[重复]
【发布时间】:2021-04-18 20:45:17
【问题描述】:

//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, 0, 78, 78);

  noStroke();

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

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

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

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

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


  //Robo Tracks

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

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

  //Track Details
  fill(140);
  for (int i = -21; i< 22; i += 6) {
    rect(25, i, 12, 2);
    rect(-25, i, 12, 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

如果有人可以帮助我,那就太好了

【问题讨论】:

  • 如果您以一种便于人们帮助您的方式编写问题,您将提高获得帮助的机会。在这种情况下,最明显的改进是创建一个minimal, working example 并将其发布在问题中,格式为代码而不是链接。未来有类似问题的用户可能会发现链接断开,否则没有答案,我们会为您和未来写下这些答案。当你改进这个问题时标记我,我会好好看看它!
  • 一个最小的例子将很容易制作并且更容易使用(我不知道粘贴代码的问题,但我有一种预感,即比整个代码更短的代码 sn-p项目可能工作得很好!否则用示例的链接标记我,我会将其粘贴到您的问题中)。
  • @laanceloti 添加了一个代码片段,不知道是否有效
  • @laancelot 添加了一些代码

标签: processing collision-detection collision


【解决方案1】:

代码有点乱,但我设法做出了你需要的东西,你需要做的第一件事是初始化坦克的半径作为一个全局变量,这样你以后可以检查你与它的碰撞。其次,最好通过添加第三个值来存储半径来更改圆数组,这样您可以检查多个大小圆的碰撞。然后我实现了一个简单的检查碰撞方法,它检查给定位置 (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, 0, robotRadius, robotRadius);

  noStroke();

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

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

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

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

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


  //Robo Tracks

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

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

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

//added a 3rd value to the circles array to store the radius
float [][] bobject= new float [][] {{250, 250, 20}, {500, 500, 20}, {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;
}

如果您有任何不明白的地方,请随时在评论中提问

【讨论】:

  • 我很高兴能提供帮助,对于发布答案后的迟到评论感到抱歉。关于碰撞,当你计算两个物体是否碰撞时,如果你的碰撞箱是一个圆,它是最简单的类型,因为你需要做的就是计算它们之间的距离,然后检查它是否优于它们的半径之和,您可以查看此链接:happycoding.io/tutorials/processing/collision-detection 向下滚动到“Circle Circle Collision” 在我编写的代码中,我将半径的总和除以 2,因为在处理过程中它代表圆的高度,而不是半径
  • 感谢 m8 的帮助,对于我迟到的回答感到抱歉。我现在明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多