Search code examples
processingcollision-detection

processing collision test return false at the beginning


I am doing the collision test for the programme, and I tried to insert the test into draw() and I'm expecting it to display "GameOver" and no further events will result any change.

float x;
float y;
float w;
float h;

float xPed;
float yPed;
float yPedc;

float objectX;
float objectY;
float objectWidth;
float objectHeight;

float triangleWidth;
float triangleHeight;

float dia;
int speed = 2;

boolean gameOver;

int N_LANES = 1;

void setup() {

    size(1200, 400);
    background(255);

    x = width / 60;
    y = height / 40;
    w = width / 80;

    xPed = width / 2;

    triangleWidth = height / 4;

    triangleHeight = 2.5 * w;

    yPed = height - 3 * w;

    yPedc = 2.5 * w / 2;

    dia = w / 2;
    h = w / 2;

    objectX = x + 2 * w;

    objectY = y + 5 * h;

    objectWidth = 4 * w;

    objectHeight = 10 * h;

    gameOver = false;
}

void  draw() {

    //reset background
    background(255);
    line(0, height/4, width, height/4);
    
    vehicle();
    pedestrian();

    // collision detect
    if (gameOver == true) {

        textSize(100);
        fill(255, 0, 0);
        text("Game Over", width / 3, height / 2);

    }

}

void vehicle() {

    //moving vehicle
    x += speed;

    // reset vehicle
    noFill();

    if (x > width) {

        x = 0;

    } else if (x < 0) {
        x = width;
    }
    
    for (int i = 0; i < N_LANES; i++) {
        //head of vehicle
        fill(0, 194, 0, 50);
        rect(x, y, w, h);
        rect(x + 3 * w, y, w, h);
        rect(x, y + h, 4 * w, 4 *h);

        //eyes of vehicle
        fill(0);
        rect(x + w, 3 * y, w * 0.85, h);
        rect(x + 3 * w, 3 * y, w * 0.85, h);

        //body of vehicle
        fill(0, 240, 0, 80);
        rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
        //left arm
        line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
        //right arm
        line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
        //left leg 
        line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
        //right leg
        line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);

    }

}

// draw pedestrian
void pedestrian() {

    fill(255, 140, 0, 70);

    //body of pedestrian

    triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);

    fill(0);

    circle(xPed + triangleWidth / 4, yPed, dia);

    circle(xPed - triangleWidth / 4, yPed, dia);

    fill(255, 165, 0);

    ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
    
}

// arrow key moving
void keyPressed() {
    if (gameOver != true) {

        if (key == CODED) {

            if (keyCode == UP) {
                yPed -= height / 4;

                if (yPed <= 0) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode == DOWN) {
                yPed += height / 4;

                if (yPed > height) {
                    yPed = height - 3 * w;
                }
            }

            if (keyCode==LEFT) {
                xPed -= height / 4;
                if (xPed < 0 + triangleWidth / 2) {
                    xPed = width / 2;
                }
            }

            if (keyCode==RIGHT) {
                xPed += height / 4;

                if (xPed > width - triangleWidth / 2) {
                    xPed = width / 2;
                }

            }

        }

    }

}

boolean gameOver() {
    // optional visualise collision objects
    rect(objectX, objectY, objectWidth, objectHeight);
    rect(xPed, yPed, triangleWidth, triangleHeight);
    // x axis
    float distX = abs( (objectX + objectWidth / 2) - (xPed + triangleWidth / 2) );
    // y axis
    float distY = abs( (objectY + objectHeight / 2) - (yPedc + triangleHeight / 2) );
    // half combined x distance
    float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
    // half combined y distance
    float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
    
    // check collision
    if (distX < combinedHalfWidth) {
        if (distY < combinedHalfHeight) {
            return true;
        }
    }
    
    return false;

}

I tried to insert the gameOver boolean into draw and it returns the same value everytime. Just wondering what the logical problem or the coding problem is.


Solution

  • As Rabbid76 mentions, you should format the code correctly first.

    Let's assume the code been copied from a pdf with code snippets and that's how formatting got messed up.

    The code still has a few glaring bugs:

    • confusingly you're using both a boolean variable gameOver and a boolean function gameOver() and the variable isn't always updated. (In fact gameOver is only set once in setup() and gameOver() which actually does the collision detection is never called). I recommend either update the boolean variable, or simpler yet, just call gameOver() to compute the collision as needed. This is one of the reasons your code won't behave as you expect.
    • You're checking collisions between two objects: the vehicle and the pedestrian. However, there are 3 sets of coordinates: x, y, xPed, objectX, objectY. When rendering in draw, the vehicle uses x,y, however, when checking for collisions, gameOver() uses objectX, objectY (which don't match and aren't updated). This is the other reason you're collisions don't behave as expected.
    • aside from the question you've asked, N_LANES is used in a for loop, but never declared. Even if I declare it, the for loop uses the exact same x,y coordinates, making the for loop redundant.

    Here's a formatted version of your code with extra bounding boxes highlighting what the collision function is checking against (and commenting a few unused variables):

    float x;
    float y;
    float w;
    float h;
    
    float xPed;
    float yPed;
    //float yPedc;
    
    float objectX;
    float objectY;
    float objectWidth;
    float objectHeight;
    
    float triangleWidth;
    float triangleHeight;
    
    float dia;
    int speed = 2;
    
    //boolean gameOver;
    
    int N_LANES = 1;
    
    void setup() {
    
        size(1200, 400);
        background(255);
    
        x = width / 60;
        y = height / 40;
        w = width / 80;
    
        xPed = width / 2;
    
        triangleWidth = height / 4;
    
        triangleHeight = 2.5 * w;
    
        yPed = height - 3 * w;
    
        //yPedc = 2.5 * w / 2;
    
        dia = w / 2;
        h = w / 2;
    
        objectX = x + 2 * w;
    
        objectY = y + 5 * h;
    
        objectWidth = 4 * w;
    
        objectHeight = 10 * h;
    
        //gameOver = false;
    }
    
    void  draw() {
    
        //reset background
        background(255);
        line(0, height/4, width, height/4);
        
        vehicle();
        pedestrian();
    
        // collision detect
        if (gameOver() == true) {
    
            textSize(100);
            fill(255, 0, 0);
            text("Game Over", width / 3, height / 2);
    
        }
    
    }
    
    void vehicle() {
    
        //moving vehicle
        x += speed;
    
        // reset vehicle
        noFill();
    
        if (x > width) {
    
            x = 0;
    
        } else if (x < 0) {
            x = width;
        }
        
        for (int i = 0; i < N_LANES; i++) {
            //head of vehicle
            fill(0, 194, 0, 50);
            rect(x, y, w, h);
            rect(x + 3 * w, y, w, h);
            rect(x, y + h, 4 * w, 4 *h);
    
            //eyes of vehicle
            fill(0);
            rect(x + w, 3 * y, w * 0.85, h);
            rect(x + 3 * w, 3 * y, w * 0.85, h);
    
            //body of vehicle
            fill(0, 240, 0, 80);
            rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
            //left arm
            line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
            //right arm
            line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
            //left leg 
            line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
            //right leg
            line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
    
        }
    
    }
    
    // draw pedestrian
    void pedestrian() {
    
        fill(255, 140, 0, 70);
    
        //body of pedestrian
    
        triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);
    
        fill(0);
    
        circle(xPed + triangleWidth / 4, yPed, dia);
    
        circle(xPed - triangleWidth / 4, yPed, dia);
    
        fill(255, 165, 0);
    
        ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
        
        // visualise bounding box
        //fill(255, 140, 0, 70);
        //rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
    }
    
    // arrow key moving
    void keyPressed() {
        if (gameOver() != true) {
    
            if (key == CODED) {
    
                if (keyCode == UP) {
                    yPed -= height / 4;
    
                    if (yPed <= 0) {
                        yPed = height - 3 * w;
                    }
                }
    
                if (keyCode == DOWN) {
                    yPed += height / 4;
    
                    if (yPed > height) {
                        yPed = height - 3 * w;
                    }
                }
    
                if (keyCode==LEFT) {
                    xPed -= height / 4;
                    if (xPed < 0 + triangleWidth / 2) {
                        xPed = width / 2;
                    }
                }
    
                if (keyCode==RIGHT) {
                    xPed += height / 4;
    
                    if (xPed > width - triangleWidth / 2) {
                        xPed = width / 2;
                    }
    
                }
    
            }
    
        }
    
    }
    
    boolean gameOver() {
        // optional visualise collision objects
        rect(objectX, objectY, objectWidth, objectHeight);
        rect(xPed, yPed, triangleWidth, triangleHeight);
        // x axis
        float distX = abs( (objectX + objectWidth / 2) - (xPed + triangleWidth / 2) );
        // y axis
        float distY = abs( (objectY + objectHeight / 2) - (yPed + triangleHeight / 2) );
        // half combined x distance
        float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
        // half combined y distance
        float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
        
        // check collision
        if (distX < combinedHalfWidth) {
            if (distY < combinedHalfHeight) {
                return true;
            }
        }
        
        return false;
    
    }
    
    

    Here's a version of the code with a few of the 3 notes above applied, somewhat resolving the collision and gameOver state issue:

    float x;
    float y;
    float w;
    float h;
    
    float xPed;
    float yPed;
    
    float objectWidth;
    float objectHeight;
    
    float triangleWidth;
    float triangleHeight;
    
    float dia;
    int speed = 2;
    
    void setup() {
    
        size(1200, 400);
        background(255);
    
        x = width / 60;
        y = height / 40;
        w = width / 80;
    
        xPed = width / 2;
    
        triangleWidth = height / 4;
    
        triangleHeight = 2.5 * w;
    
        yPed = height - 3 * w;
    
        dia = w / 2;
        h = w / 2;
    
        objectWidth = 4 * w;
    
        objectHeight = 10 * h;
    }
    
    void  draw() {
    
        //reset background
        background(255);
        line(0, height/4, width, height/4);
        
        vehicle();
        pedestrian();
    
        // collision detect
        if (gameOver()) {
    
            textSize(100);
            fill(255, 0, 0);
            text("Game Over", width / 3, height / 2);
    
        }
    
    }
    
    void vehicle() {
    
        //moving vehicle
        x += speed;
    
        // reset vehicle
        noFill();
    
        if (x > width) {
    
            x = 0;
    
        } else if (x < 0) {
            x = width;
        }
        
        //head of vehicle
        fill(0, 194, 0, 50);
        rect(x, y, w, h);
        rect(x + 3 * w, y, w, h);
        rect(x, y + h, 4 * w, 4 *h);
    
        //eyes of vehicle
        fill(0);
        rect(x + w, 3 * y, w * 0.85, h);
        rect(x + 3 * w, 3 * y, w * 0.85, h);
    
        //body of vehicle
        fill(0, 240, 0, 80);
        rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
        //left arm
        line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
        //right arm
        line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
        //left leg 
        line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
        //right leg
        line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
    }
    
    // draw pedestrian
    void pedestrian() {
    
        fill(255, 140, 0, 70);
    
        //body of pedestrian
        triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);
    
        fill(0);
    
        circle(xPed + triangleWidth / 4, yPed, dia);
    
        circle(xPed - triangleWidth / 4, yPed, dia);
    
        fill(255, 165, 0);
    
        ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
        
        // visualise bounding box
        //fill(255, 140, 0, 70);
        //rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
    }
    
    // arrow key moving
    void keyPressed() {
        if (!gameOver()) {
    
            if (key == CODED) {
    
                if (keyCode == UP) {
                    yPed -= height / 4;
    
                    if (yPed <= 0) {
                        yPed = height - 3 * w;
                    }
                }
    
                if (keyCode == DOWN) {
                    yPed += height / 4;
    
                    if (yPed > height) {
                        yPed = height - 3 * w;
                    }
                }
    
                if (keyCode==LEFT) {
                    xPed -= height / 4;
                    if (xPed < 0 + triangleWidth / 2) {
                        xPed = width / 2;
                    }
                }
    
                if (keyCode==RIGHT) {
                    xPed += height / 4;
    
                    if (xPed > width - triangleWidth / 2) {
                        xPed = width / 2;
                    }
    
                }
    
            }
    
        }
    
    }
    
    boolean gameOver() {
        // optional visualise collision objects
        rect(x, y, objectWidth, objectHeight);
        rect(xPed, yPed, triangleWidth, triangleHeight);
        // x axis
        float distX = abs( (x + objectWidth / 2) - (xPed + triangleWidth / 2) );
        // y axis
        float distY = abs( (y + objectHeight / 2) - (yPed + triangleHeight / 2) );
        // half combined x distance
        float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
        // half combined y distance
        float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
        
        // check collision
        if (distX < combinedHalfWidth) {
            if (distY < combinedHalfHeight) {
                return true;
            }
        }
        
        return false;
    
    }
    

    Notice that the triangle bounding box needs to be moved to the left by half the triangle width ideally.

    I'd also like to point you to java.awt.Rectangle which has an intersects() that could be useful:

    import java.awt.Rectangle;
    
    float x;
    float y;
    float w;
    float h;
    
    float xPed;
    float yPed;
    
    float objectWidth;
    float objectHeight;
    
    float triangleWidth;
    float triangleHeight;
    
    float dia;
    int speed = 2;
    
    Rectangle vehicleBoundingBox;
    Rectangle pedestrianBoundingBox;
    
    void setup() {
    
        size(1200, 400);
        background(255);
    
        x = width / 60;
        y = height / 40;
        w = width / 80;
    
        xPed = width / 2;
    
        triangleWidth = height / 4;
    
        triangleHeight = 2.5 * w;
    
        yPed = height - 3 * w;
    
        dia = w / 2;
        h = w / 2;
    
        objectWidth = 4 * w;
    
        objectHeight = 10 * h;
        
        vehicleBoundingBox = new Rectangle((int)x, (int)y, (int)objectWidth, (int)objectHeight);
        pedestrianBoundingBox = new Rectangle((int)xPed, (int)yPed, (int)triangleWidth, (int)triangleHeight);
    }
    
    void  draw() {
    
        //reset background
        background(255);
        line(0, height/4, width, height/4);
        
        vehicle();
        pedestrian();
    
        // collision detect
        if (gameOver()) {
    
            textSize(100);
            fill(255, 0, 0);
            text("Game Over", width / 3, height / 2);
    
        }
    
    }
    
    void vehicle() {
    
        //moving vehicle
        x += speed;
    
        // reset vehicle
        noFill();
    
        if (x > width) {
    
            x = 0;
    
        } else if (x < 0) {
            x = width;
        }
        
        //head of vehicle
        fill(0, 194, 0, 50);
        rect(x, y, w, h);
        rect(x + 3 * w, y, w, h);
        rect(x, y + h, 4 * w, 4 *h);
    
        //eyes of vehicle
        fill(0);
        rect(x + w, 3 * y, w * 0.85, h);
        rect(x + 3 * w, 3 * y, w * 0.85, h);
    
        //body of vehicle
        fill(0, 240, 0, 80);
        rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
        //left arm
        line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
        //right arm
        line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
        //left leg 
        line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
        //right leg
        line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
    }
    
    // draw pedestrian
    void pedestrian() {
    
        fill(255, 140, 0, 70);
    
        //body of pedestrian
        triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);
    
        fill(0);
    
        circle(xPed + triangleWidth / 4, yPed, dia);
    
        circle(xPed - triangleWidth / 4, yPed, dia);
    
        fill(255, 165, 0);
    
        ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
    }
    
    // arrow key moving
    void keyPressed() {
        if (!gameOver()) {
    
            if (key == CODED) {
    
                if (keyCode == UP) {
                    yPed -= height / 4;
    
                    if (yPed <= 0) {
                        yPed = height - 3 * w;
                    }
                }
    
                if (keyCode == DOWN) {
                    yPed += height / 4;
    
                    if (yPed > height) {
                        yPed = height - 3 * w;
                    }
                }
    
                if (keyCode==LEFT) {
                    xPed -= height / 4;
                    if (xPed < 0 + triangleWidth / 2) {
                        xPed = width / 2;
                    }
                }
    
                if (keyCode==RIGHT) {
                    xPed += height / 4;
    
                    if (xPed > width - triangleWidth / 2) {
                        xPed = width / 2;
                    }
    
                }
    
            }
    
        }
    
    }
    
    boolean gameOver(){
      // update bounding box positions
      vehicleBoundingBox.x = (int)x;
      vehicleBoundingBox.y = (int)y;
      
      pedestrianBoundingBox.x = (int)(xPed - triangleWidth / 2);
      pedestrianBoundingBox.y = (int)yPed;
      //optional: visualise boxes
      fill(255, 140, 0, 70);
      rect(pedestrianBoundingBox.x, pedestrianBoundingBox.y, pedestrianBoundingBox.width, pedestrianBoundingBox.height);
      rect(vehicleBoundingBox.x, vehicleBoundingBox.y, vehicleBoundingBox.width, vehicleBoundingBox.height);
      
      return vehicleBoundingBox.intersects(pedestrianBoundingBox);
    }
    
    //boolean gameOver() {
    //    // optional visualise collision objects
    //    rect(x, y, objectWidth, objectHeight);
    //    rect(xPed, yPed, triangleWidth, triangleHeight);
    //    // x axis
    //    float distX = abs( (x + objectWidth / 2) - (xPed + triangleWidth / 2) );
    //    // y axis
    //    float distY = abs( (y + objectHeight / 2) - (yPed + triangleHeight / 2) );
    //    // half combined x distance
    //    float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
    //    // half combined y distance
    //    float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
        
    //    // check collision
    //    if (distX < combinedHalfWidth) {
    //        if (distY < combinedHalfHeight) {
    //            return true;
    //        }
    //    }
        
    //    return false;
    
    //}
    
    void circle(float x, float y, float dia){
      ellipse(x, y, dia, dia);
    }
    

    Bare in mind, if this is an assignment/homework, you might not be allowed to use java.awt.Rectangle. Speaking of which, if this is an assignment you should mention that in the question.

    Update

    Here's an updated version better handling the game over state.

    float x;
    float y;
    float w;
    float h;
    
    float xPed;
    float yPed;
    
    float objectWidth;
    float objectHeight;
    
    float triangleWidth;
    float triangleHeight;
    
    float dia;
    int speed = 2;
    // defaults to false
    boolean isGameOver;
    
    void setup() {
    
      size(1200, 400);
      background(255);
    
      x = width / 60;
      y = height / 40;
      w = width / 80;
    
      xPed = width / 2;
    
      triangleWidth = height / 4;
    
      triangleHeight = 2.5 * w;
    
      yPed = height - 3 * w;
    
      dia = w / 2;
      h = w / 2;
    
      objectWidth = 4 * w;
    
      objectHeight = 10 * h;
    }
    
    void  draw() {
      //reset background
      background(255);
      line(0, height/4, width, height/4);
    
      
      if (isGameOver) {
        textSize(100);
        fill(255, 0, 0);
        text("Game Over", width / 3, height / 2);
      }else{
        // check colloisions only in game state and update game over state
        isGameOver = checkCollisions();
        vehicle();
        pedestrian();
      }
      
    }
    
    void vehicle() {
    
      //moving vehicle
      x += speed;
    
      // reset vehicle
      noFill();
    
      if (x > width) {
    
        x = 0;
      } else if (x < 0) {
        x = width;
      }
    
      //head of vehicle
      fill(0, 194, 0, 50);
      rect(x, y, w, h);
      rect(x + 3 * w, y, w, h);
      rect(x, y + h, 4 * w, 4 *h);
    
      //eyes of vehicle
      fill(0);
      rect(x + w, 3 * y, w * 0.85, h);
      rect(x + 3 * w, 3 * y, w * 0.85, h);
    
      //body of vehicle
      fill(0, 240, 0, 80);
      rect(x + 1.5 * w, 6.3 * h, 1.5 * w, 3 *h );
      //left arm
      line(x + 1.5 *w, 6.3 * h, x + 0.5 * w, 7.3 * h);
      //right arm
      line(x + 3 * w, 6.3 * h, x + 4 * w, 7.3 * h);
      //left leg 
      line(x + 1.5 * w, 9.3 * h, x + w, 11.3 * h);
      //right leg
      line(x + 3 * w, 9.3 * h, x + 3.5 * w, 11.3 * h);
    }
    
    // draw pedestrian
    void pedestrian() {
    
      fill(255, 140, 0, 70);
    
      //body of pedestrian
      triangle(xPed, yPed, xPed - triangleWidth / 2, yPed + 2.5 * w, xPed + triangleWidth / 2, yPed + 2.5 * w);
    
      fill(0);
    
      circle(xPed + triangleWidth / 4, yPed, dia);
    
      circle(xPed - triangleWidth / 4, yPed, dia);
    
      fill(255, 165, 0);
    
      ellipse(xPed, yPed + w, 1.5 * dia, 3 * dia);
    
      // visualise bounding box
      //fill(255, 140, 0, 70);
      //rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
    }
    
    // arrow key moving
    void keyPressed() {
      if (isGameOver){
        // exit game over
        isGameOver = false;
        // lazy way to restart the game
        // normally you'd write & call a reset() function to reset player/vehicle positions, avodiing instant gameOver
        setup();
      } else {
    
        if (key == CODED) {
    
          if (keyCode == UP) {
            yPed -= height / 4;
    
            if (yPed <= 0) {
              yPed = height - 3 * w;
            }
          }
    
          if (keyCode == DOWN) {
            yPed += height / 4;
    
            if (yPed > height) {
              yPed = height - 3 * w;
            }
          }
    
          if (keyCode==LEFT) {
            xPed -= height / 4;
            if (xPed < 0 + triangleWidth / 2) {
              xPed = width / 2;
            }
          }
    
          if (keyCode==RIGHT) {
            xPed += height / 4;
    
            if (xPed > width - triangleWidth / 2) {
              xPed = width / 2;
            }
          }
        }
      }
    }
    
    boolean checkCollisions() {
      // optional visualise collision objects
      fill(255, 140, 0, 70);
      rect(x, y, objectWidth, objectHeight);
      rect(xPed - triangleWidth / 2, yPed, triangleWidth, triangleHeight);
      // x axis
      float distX = abs( (x + objectWidth / 2) - xPed );
      // y axis
      float distY = abs( (y + objectHeight / 2) - (yPed + triangleHeight / 2) );
      // half combined x distance
      float combinedHalfWidth = ( (objectWidth / 2) + (triangleWidth / 2) );
      // half combined y distance
      float combinedHalfHeight = ( (objectHeight / 2) + (triangleHeight / 2) );
    
      // check collision
      if (distX < combinedHalfWidth) {
        if (distY < combinedHalfHeight) {
          return true;
        }
      }
    
      return false;
    }
    

    The main changes are:

    • reintroduced gameOver boolean as isGameOver which is used to change between the two states
    • renamed gameOver() to checkCollisions() to avoid confusion.

    In this case, with just two states, a boolean will do. It's important to also reset game variables when changing state (e.g. reset player/vehicle positions, etc.) In case your game may require more states you can use an integer and constants. This answer has a demo code snippet. If multiple states are required OOP was introduced, this answer also has demo code.