user18588015
user18588015

Reputation:

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.

Upvotes: 2

Views: 154

Answers (1)

George Profenza
George Profenza

Reputation: 51847

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.

Upvotes: 1

Related Questions