Collisions on moving objects

Hello, I am new to processing and I have to work on a school project. For my project, I need objects that are falling down to collide with my own moving character. I have been searching quite a bit but I can’t find how to work with collisions on moving objects. If someone knows how I can end my game if my obstacles and character touch each other that would be very helpful.
(This is my code so far)

float stripeYPos;
float b;
float obstacleYPos;

int x = 0;
int y = 450;

void setup() {
size (720, 600);
stripeYPos = -40;
obstacleYPos = -80;
b = -70;

//fill (#626161);
//rect (0, 0, 240, 600); // links weg

//fill (#F7F7F7);
//rect (240, 0, 240, 600); // midden weg

//fill (#626161);
//rect (480, 0, 240, 600); // rechts weg
}

void keyPressed() {
if ( key == ‘d’ ) {
x = x + 50;
}
if ( key == ‘a’)
x = x - 50;
}

void draw () {
background (#484646);
smooth();
strokeWeight(2);

line(240, 0, 240, 600);
line(480, 0, 480, 600);

obstacleYPos = obstacleYPos + 8;
if (obstacleYPos > height) {
obstacleYPos = -20;
}

stripeYPos = stripeYPos + 5;
if (stripeYPos > height + 70) {
stripeYPos = -20;
}

fill (#F7F7F7);
rect(100, stripeYPos, 40, 70); // all the moving stripes

rect(340, stripeYPos, 40, 70);

rect(580, stripeYPos, 40, 70);

fill(255);
ellipse(400, obstacleYPos, 72, 72); // Obstacle circle

fill (#F20F0F);
rect(100, obstacleYPos, 80, 80); // obstacle rectangle

fill (#F00F0F);
rect(mouseX+5, y-12, 50, 20); //x,y,w,h body

fill (#F00F0F);
rect(mouseX+5, y+60, 50, 20); //x,y,w,h body

fill (#F00F0F);
rect(mouseX, y-5, 60, 80); //x,y,w,h car

fill (#050505);
rect(mouseX-15, y+2, 15, 25); // top left tire

fill (#050505);
rect(mouseX-15, y+40, 15, 25); // bottom left tire

fill (#050505);
rect(mouseX+60, y+2, 15, 25); // top right tire

fill (#050505);
rect(mouseX+60, y+40, 15, 25); // bottom right tire
}

Use dist() command- see reference

Like if (dist(x,y 100, obstacleypos) < 44) {// hit
}

1 Like

Thank you! It was actually that simple thanks!

Yeah, well.

Would be easier if you had all obstacles stored in an array

1 Like

Is there a way where I can only use the X axis as an dist()? Because what happens now is that every time the objects meet on the Y axis the program stops

1 Like

Could you maybe give an example op an array?

1 Like

That’s for example

if(abs(x-obstacleX) > 44) …

1 Like

When you have only 2 obstacles, not necessary

For example one array shows the x values for all obstacles

x[0] = 400;

then for loop over the array for loop i
rect… x[i]

See reference section array

1 Like

Okay I now have this:

float stripeYPos;
float b;
float obstacleYPos;
float obstacleXPos;

float carXPos;
float carYPos;

float d;

int x = 0;
int y = 450;

void setup() {
size (720, 600);
stripeYPos = -40;
obstacleYPos = -80;
b = -70;
obstacleXPos = x;

carXPos = 0;

//fill (#626161);
//rect (0, 0, 240, 600); // links weg

//fill (#F7F7F7);
//rect (240, 0, 240, 600); // midden weg

//fill (#626161);
//rect (480, 0, 240, 600); // rechts weg
}

void keyPressed() {
if ( key == ‘d’ ) {
x = x + 50;
}
if ( key == ‘a’)
x = x - 50;
}

void draw () {
background (#484646);
smooth();
strokeWeight(2);

line(240, 0, 240, 600);
line(480, 0, 480, 600);

//if (dist(carXPos, y, obstacleXPos, obstacleYPos) < 3) {
// background (0);
// noLoop();
//}

if(abs(x-obstacleXPos) < 100)

obstacleYPos = obstacleYPos + 8;
if (obstacleYPos > height) {
obstacleYPos = -20;
}

stripeYPos = stripeYPos + 5;
if (stripeYPos > height + 70) {
stripeYPos = -20;
}

fill (#F7F7F7);
rect(100, stripeYPos, 40, 70); // all the moving stripes

rect(340, stripeYPos, 40, 70);

rect(580, stripeYPos, 40, 70);

fill(255);
ellipse(obstacleXPos + 400, obstacleYPos, 72, 72); // Obstacle circle

fill (#F20F0F);
rect(obstacleXPos + 100, obstacleYPos, 80, 80); // obstacle rectangle

fill (#F00F0F);
rect(x+5, y-12, 50, 20); //x,y,w,h body

fill (#F00F0F);
rect(x+5, y+60, 50, 20); //x,y,w,h body

fill (#F00F0F);
rect(x + carXPos, y-5, 60, 80); //x,y,w,h car

fill (#050505);
rect(x-15, y+2, 15, 25); // top left tire

fill (#050505);
rect(x-15, y+40, 15, 25); // bottom left tire

fill (#050505);
rect(x+60, y+2, 15, 25); // top right tire

fill (#050505);
rect(x+60, y+40, 15, 25); // bottom right tire
}

But it still doesn’t do what I want it to do, It only has to stop when the objects hit eacother

When you mean car against obstacle? check car against obstacle.

Or obstacle against other obstacle?

1 Like

When the car hits an obstacle the game should stop and when you dodge an object your score should go up with 1 but I have no idea how I can fix this…

Okay, you have this noLoop() Statement already.

You could also go to another screen by setting a new variable state to 1 when the car crashes

Then in draw evaluate state: if ==0 the code you have in draw() now otherwise text() you lost

1 Like

Yeah is see but the noLoop() statement start before the objects hit each other, maybe I am not using the dist statement right?

I dunno what your car is exactly, x,y OR carXpos,y ???

1 Like

Its the body of the car but the car is mounted on the X axis
rect(x + carXPos, y-5, 60, 80); //x,y,w,h car

But I can remove the carXPos because it doesn’t add anything

1 Like

That should work!
Chrisir

1 Like