问题描述
//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;
}
有不明白的地方欢迎在评论中提问