Inspiration:
As I mentioned in my proposal, my game was inspired by Fruit Ninja. Apart from slicing the fruits, you had to catch the covid objects, like pills, syringes, sanitizers, and masks. You also had to avoid catching the virus. There is also a powerup in the game, that looks like a clock, which slows the frameRate for about 5 seconds.
Process:
The game starts by showing a start screen, which gives the instructions for the game. Then, when you click any key on the keyboard, the game starts.
I used the keypressed function in order to switch from the start screen to the main game.

After that, you can see a glove and objects falling from the top. The glove is made on mouse X and mouse Y. The objects use a random function on the width, to fall randomly from different sides and I have used gravity along with velocity to randomise the speed of the objects falling from the top.

Everytime, you catch the object, score increases by 1 and everytime you miss an object, the X on top gets red. If you miss 10 objects, the game ends. If you catch the virus game ends. I have used null to remove the objects.
Once the game ends, you see the following screen and I have again used keypressed function to restart the game, once the game ends.

This is what the game looks like:-
The code for the above game is below:-
//setting up the variables, importing libraries, importing images and fonts.
import processing.sound.*;
boolean gameOver = false;
boolean startScreen = true;
//setting up the screen and the background
back = loadImage("back.jpg");
font = createFont("Optima-Bold", 20);
file = new SoundFile(this, "main.wav");
objects = new SoundFile(this, "objects.mp3");
bomb = new SoundFile(this, "bomb.mp3");
gameover = new SoundFile(this, "gameover.mp3");
knife = loadImage("knife.png");
start = loadImage("start.jpeg");
start.resize(width,height);
//looping the background music
// setting font to optima bold
//changing cursor settings
if(startScreen || gameOver){
// start screen for instructions
rect((width/2)-400,(height/2)-150,800,400);
text("COVID NINJA", (width/2)-20,(height/2)-180);
text("INSTRUCTIONS", (width/2)-20,(height/2)-100);
text("Catch every object on the screen apart from the virus. \n If you catch the virus, you die. If you catch the clock, \n the time slows and the objects move slower. Use the cursor \n to catch the objects", (width/2),(height/2)-50);
text("PRESS ANY KEY TO START",(width/2), (height/2)+150);
//condition to remove the start screen after keypressed
fill(255); textSize(30); text("SCORE: ", 40, 50);
text(game.score, 150, 50);
//x's turing red after every miss
for(int i = 0; i < 10; i++){
text("x", width - 40 - (30*i), 50);
//restarting the game after game is over
if(gameOver == true && keyPressed){
//setting up class covid with variables
x = (int) random(150, width-150);
int selection = (int) random(1,60);
} else if(selection < 10) {
selection = (selection%4) + 1;
img = loadImage(str(selection) + ".png");
img_w = 100; img_h = 100;
image(img, x, y, img_w, img_h);
//increasing the number of objects
numCovidItems = difficulty;
covid = new Covid[numCovidItems];
for (int i=0; i<numCovidItems; i++){
//condition for game over
text("PRESS ANY KEY TO RESTART.", (width/2)-200, height/2);
if(frame+150 < frameCount){
numCovidItems = difficulty;
//making the objects disappear
for (int i=0; i<numCovidItems; i++){
if(killedobjs == numCovidItems){
for (int i=0; i<numCovidItems; i++){
// checks if object is missed
if(covid[i].y > height) {
if(!covid[i].virus) { missed++; }
// checks if object is cut else displays
if((covid[i].x <= (mouseX+50) && (mouseX-50) <= (covid[i].x + covid[i].img_w)) && (covid[i].y <= (mouseY+40) && (mouseY-50) <= (covid[i].y + covid[i].img_h))){
} else if (covid[i].clock) {
//setting up the variables, importing libraries, importing images and fonts.
import processing.sound.*;
SoundFile file;
SoundFile objects;
SoundFile bomb;
SoundFile gameover;
PImage back;
PImage knife;
PImage start;
PFont font;
int height = 720;
int width = 1040;
int frame = 0;
//initialising variables
Game game = new Game();
boolean gameOver = false;
boolean startScreen = true;
void setup(){
//setting up the screen and the background
size(1040, 720);
back = loadImage("back.jpg");
background(0);
font = createFont("Optima-Bold", 20);
//accessing sound path
file = new SoundFile(this, "main.wav");
objects = new SoundFile(this, "objects.mp3");
bomb = new SoundFile(this, "bomb.mp3");
gameover = new SoundFile(this, "gameover.mp3");
//loading the images
knife = loadImage("knife.png");
knife.resize(100,150);
start = loadImage("start.jpeg");
start.resize(width,height);
//looping the background music
file.amp(0.05);
file.loop();
}
void draw(){
// setting font to optima bold
textFont(font);
//changing cursor settings
if(startScreen || gameOver){
cursor(CROSS);
} else {
cursor(knife);
}
// start screen for instructions
if(startScreen){
background(start);
strokeWeight(0);
fill(200,0,0,100);
rect((width/2)-400,(height/2)-150,800,400);
fill(200,0,0,200);
stroke(255);
textSize(80);
textAlign(CENTER);
text("COVID NINJA", (width/2)-20,(height/2)-180);
fill(255);
textSize(40);
textAlign(CENTER);
text("INSTRUCTIONS", (width/2)-20,(height/2)-100);
textSize(30);
textAlign(CENTER);
text("Catch every object on the screen apart from the virus. \n If you catch the virus, you die. If you catch the clock, \n the time slows and the objects move slower. Use the cursor \n to catch the objects", (width/2),(height/2)-50);
text("PRESS ANY KEY TO START",(width/2), (height/2)+150);
textAlign(BASELINE);
}
//condition to remove the start screen after keypressed
if(keyPressed){
startScreen = false;
}
//starting the game
if(!startScreen){
background(back);
//score change
fill(255); textSize(30); text("SCORE: ", 40, 50);
text(game.score, 150, 50);
//x's turing red after every miss
for(int i = 0; i < 10; i++){
if(i < game.missed){
fill(255,0,0);
}
else {
fill(220, 220, 220);
}
textSize(40);
text("x", width - 40 - (30*i), 50);
}
game.display();
//restarting the game after game is over
if(gameOver == true && keyPressed){
game = new Game();
frameRate(60);
gameOver = false;
}
}
}
//setting up class covid with variables
class Covid {
int x, y;
float vy, g;
boolean virus = false;
boolean clock = false;
PImage img;
int img_w, img_h;
Covid() {
x = (int) random(150, width-150);
y = 60;
g = random(0.1,0.3);
int selection = (int) random(1,60);
if(selection < 8){
selection = 6;
} else if(selection < 10) {
selection = 5;
} else {
selection = (selection%4) + 1;
}
img = loadImage(str(selection) + ".png");
if(selection == 6){
virus = true;
}
if(selection == 5){
clock = true;
}
img_w = 100; img_h = 100;
}
void gravity() {
vy = vy + g;
}
void update() {
gravity();
y += vy;
}
void display() {
update();
image(img, x, y, img_w, img_h);
}
}
class Game {
int difficulty;
int score;
int missed;
int numCovidItems;
boolean roundOver;
Covid[] covid;
//using the constructor
Game() {
difficulty = 1;
score = 0;
missed = 0;
roundOver = true;
}
//defining method
void updateCovid(){
//increasing the number of objects
difficulty++;
numCovidItems = difficulty;
covid = new Covid[numCovidItems];
for (int i=0; i<numCovidItems; i++){
covid[i] = new Covid();
}
}
//method display
void display(){
//condition for game over
if(missed >= 10){
// GAME OVER SCREEN
if (gameOver == false){
gameover.play();
}
gameOver = true;
textSize(30);
fill(255);
text("PRESS ANY KEY TO RESTART.", (width/2)-200, height/2);
} else {
if(frame+150 < frameCount){
frameRate(60);
}
if(roundOver == true){
updateCovid();
roundOver = false;
}
numCovidItems = difficulty;
//making the objects disappear
int killedobjs = 0;
for (int i=0; i<numCovidItems; i++){
if(covid[i] == null){
killedobjs++;
}
}
if(killedobjs == numCovidItems){
roundOver = true;
}
for (int i=0; i<numCovidItems; i++){
// checks if object is missed
if(covid[i] != null){
if(covid[i].y > height) {
if(!covid[i].virus) { missed++; }
covid[i] = null;
}
}
// checks if object is cut else displays
if(covid[i] != null){
if((covid[i].x <= (mouseX+50) && (mouseX-50) <= (covid[i].x + covid[i].img_w)) && (covid[i].y <= (mouseY+40) && (mouseY-50) <= (covid[i].y + covid[i].img_h))){
if(covid[i].virus) {
missed = 11;
bomb.play();
} else if (covid[i].clock) {
covid[i] = null;
frameRate(20);
frame = frameCount;
} else {
covid[i] = null;
score++;
objects.amp(0.1);
objects.play();
}
} else {
covid[i].display();
}
}
}
}
}
}
//setting up the variables, importing libraries, importing images and fonts.
import processing.sound.*;
SoundFile file;
SoundFile objects;
SoundFile bomb;
SoundFile gameover;
PImage back;
PImage knife;
PImage start;
PFont font;
int height = 720;
int width = 1040;
int frame = 0;
//initialising variables
Game game = new Game();
boolean gameOver = false;
boolean startScreen = true;
void setup(){
//setting up the screen and the background
size(1040, 720);
back = loadImage("back.jpg");
background(0);
font = createFont("Optima-Bold", 20);
//accessing sound path
file = new SoundFile(this, "main.wav");
objects = new SoundFile(this, "objects.mp3");
bomb = new SoundFile(this, "bomb.mp3");
gameover = new SoundFile(this, "gameover.mp3");
//loading the images
knife = loadImage("knife.png");
knife.resize(100,150);
start = loadImage("start.jpeg");
start.resize(width,height);
//looping the background music
file.amp(0.05);
file.loop();
}
void draw(){
// setting font to optima bold
textFont(font);
//changing cursor settings
if(startScreen || gameOver){
cursor(CROSS);
} else {
cursor(knife);
}
// start screen for instructions
if(startScreen){
background(start);
strokeWeight(0);
fill(200,0,0,100);
rect((width/2)-400,(height/2)-150,800,400);
fill(200,0,0,200);
stroke(255);
textSize(80);
textAlign(CENTER);
text("COVID NINJA", (width/2)-20,(height/2)-180);
fill(255);
textSize(40);
textAlign(CENTER);
text("INSTRUCTIONS", (width/2)-20,(height/2)-100);
textSize(30);
textAlign(CENTER);
text("Catch every object on the screen apart from the virus. \n If you catch the virus, you die. If you catch the clock, \n the time slows and the objects move slower. Use the cursor \n to catch the objects", (width/2),(height/2)-50);
text("PRESS ANY KEY TO START",(width/2), (height/2)+150);
textAlign(BASELINE);
}
//condition to remove the start screen after keypressed
if(keyPressed){
startScreen = false;
}
//starting the game
if(!startScreen){
background(back);
//score change
fill(255); textSize(30); text("SCORE: ", 40, 50);
text(game.score, 150, 50);
//x's turing red after every miss
for(int i = 0; i < 10; i++){
if(i < game.missed){
fill(255,0,0);
}
else {
fill(220, 220, 220);
}
textSize(40);
text("x", width - 40 - (30*i), 50);
}
game.display();
//restarting the game after game is over
if(gameOver == true && keyPressed){
game = new Game();
frameRate(60);
gameOver = false;
}
}
}
//setting up class covid with variables
class Covid {
int x, y;
float vy, g;
boolean virus = false;
boolean clock = false;
PImage img;
int img_w, img_h;
Covid() {
x = (int) random(150, width-150);
y = 60;
g = random(0.1,0.3);
int selection = (int) random(1,60);
if(selection < 8){
selection = 6;
} else if(selection < 10) {
selection = 5;
} else {
selection = (selection%4) + 1;
}
img = loadImage(str(selection) + ".png");
if(selection == 6){
virus = true;
}
if(selection == 5){
clock = true;
}
img_w = 100; img_h = 100;
}
void gravity() {
vy = vy + g;
}
void update() {
gravity();
y += vy;
}
void display() {
update();
image(img, x, y, img_w, img_h);
}
}
class Game {
int difficulty;
int score;
int missed;
int numCovidItems;
boolean roundOver;
Covid[] covid;
//using the constructor
Game() {
difficulty = 1;
score = 0;
missed = 0;
roundOver = true;
}
//defining method
void updateCovid(){
//increasing the number of objects
difficulty++;
numCovidItems = difficulty;
covid = new Covid[numCovidItems];
for (int i=0; i<numCovidItems; i++){
covid[i] = new Covid();
}
}
//method display
void display(){
//condition for game over
if(missed >= 10){
// GAME OVER SCREEN
if (gameOver == false){
gameover.play();
}
gameOver = true;
textSize(30);
fill(255);
text("PRESS ANY KEY TO RESTART.", (width/2)-200, height/2);
} else {
if(frame+150 < frameCount){
frameRate(60);
}
if(roundOver == true){
updateCovid();
roundOver = false;
}
numCovidItems = difficulty;
//making the objects disappear
int killedobjs = 0;
for (int i=0; i<numCovidItems; i++){
if(covid[i] == null){
killedobjs++;
}
}
if(killedobjs == numCovidItems){
roundOver = true;
}
for (int i=0; i<numCovidItems; i++){
// checks if object is missed
if(covid[i] != null){
if(covid[i].y > height) {
if(!covid[i].virus) { missed++; }
covid[i] = null;
}
}
// checks if object is cut else displays
if(covid[i] != null){
if((covid[i].x <= (mouseX+50) && (mouseX-50) <= (covid[i].x + covid[i].img_w)) && (covid[i].y <= (mouseY+40) && (mouseY-50) <= (covid[i].y + covid[i].img_h))){
if(covid[i].virus) {
missed = 11;
bomb.play();
} else if (covid[i].clock) {
covid[i] = null;
frameRate(20);
frame = frameCount;
} else {
covid[i] = null;
score++;
objects.amp(0.1);
objects.play();
}
} else {
covid[i].display();
}
}
}
}
}
}