UNI RUSH
INTRODUCTION & GAME RULES:
Uni Rush is an innovative idea for gaming in processing which have sketched the idea of a student escaping the reality of university course grades. The basic logic behind it is that the student character is moving in all four directions and the grade letters are coming from the right side of the screen. When a grade passes behind the character, the score increases. However, if the character moves out of the screen or touches any grade, whether bad or good, then it is game over. For the character movements, conventional gaming keyboard keys were used: w for up, a for left, s for down, and d for right.
INSPIRATION BEHIND UNI RUSH:
The inspiration behind the game I wanted to create comes from how overprotective I tend to be with my GPA. Since I was a kid, I always would work to achieve the highest grades and even the slightest deduction of grades would make me cry. However, after I came to university, that reality changed, and it’s been like a roller-coaster with all its ups and downs. The game resembles a university student who is running all over to escape the sad reality of university grades. Based on that, the more grades the character is able to escape , the higher the score is. I have always been keen to understand how gpa calculation works, so I searched it up and decided to base my game on that. Yet, this did not work and the fun of it made me come up with a new game logic, closer to reality.
CHALLENGES & PROBLEMS:
The very first and foremost challenge I have faced was rendering the grades continuously on the screen, in addition to its movement within the specified speed. This has put me in chaos, as I felt that my code is all over the place. A second difficulty was during the movement of the character. Third, the management of frames and the glitches found during frame rendering. Last, but not least, playing the sound based on the movement of the character and rendering the grade letters as a series of image was an obstacle.
OBJECTS USED :
1- Grade letters
The grade letter objects are moving images of all grade letters
2- Student Character
This is an NYU Mascot cartoon character given a bigger size as compared to the grade letters and is able to move left- right & up-down based on the key pressing
3- Game Background
This object is a university campus image
4- GPA Score Prompt
This object is a simple score text prompt which gets added as the character escapes the grade letters.
PROCEDURE:
I have started my game by implementing the player character class. This class was responsible for the actions taken by the character. Later, I have implemented attributes and methods in that class that helps with the movement of the character in all four directions. The rendering of the character is also implemented in that class. I performed the default constructor for the character class which takes x and y positions of the character.
The die function implemented to check if the player character moves out of the screen.
//function to check if the player character is out screen which means the character died
//stopping the game background sound and playing main menu sound
void die()
{
this.xPos = -500;
this.yPos = -500;
this.CharacterDropped = true;
BackSoundEffect.stop();
SkipGradeLetterSound.play();
MainMenuSoundEffect.play();
}
The player character is moving based on the key pressed events which work on the specified keys for the movement of the player character in upward, downward, left, or right direction.
void keyPressed()
{
//If the key is 'w' then moving the character upward
if(key == 'w') Character.move(0, -1);
//if the key is 'a' then moving the character left
if(key == 'a') Character.move(-1, 0);
//if the key is s then moving the character down
if(key == 's') Character.move(0, 1);
//if the key is 'd' then moving the character right
if(key == 'd') Character.move(1, 0);
//if the key is 'r' then setting the character to its default state and postion
if(key == 'r' || Character.CharacterDropped)
{
//stop playing background sounds
BackSoundEffect.stop();
MainMenuSoundEffect.stop();
BackSoundEffect.loop();
//restarting game to its default configuration
restart();
gameFrame = 0;
}
}
For rendering the player character on screen I implemented show() method inside the character class which is loading the player character image on the current frame x and y position.
//for rendering the player character in rectangular box structure on screen
void show()
{
rectMode(CENTER);
fill(255);
noStroke();
//showing player character image on screen
image(PlayerCharacter[currentFrame], this.xPos + xRail * screenHeight/4, this.yPos + this.yRail * screenHeight/4);
}
Then I did the implementation letter class which I used later to render grade letters on the screen. The letter class contains attributes for the position of letters and the movement speed of letter images on the screen. Afterwards, I implemented a function to update letters on-screen through frames and another function to check if the letter moves out of the screen. In this case, the letter further drops out from the object array.
The default constructor of the letter class takes the position of the letter as a parameter and sets the default speed and movement direction of the letter on screen.
//default constructor for letter class which takes position of letter as parameter
Letter(PVector pos)
{
//setting radom speed and velocity of the letters for the movement of letter
acceleration = new PVector(random(-0.05, 0.05), random(-0.05, 0.05));
velocity = new PVector(random(-2, 2), random(-2, 2));
//default position of each letter
position = pos.copy();
//random boundry for each letter movement
MovementSpan = random(100.0, 255.0);
}
I implemented the function IsLetterDrops() to check if the letter moves out the screen or not. If the letter moves out of the screen then the letter will be removed further from the letters array.
//for checking if the letters moves out of the screen or not
boolean IsLetterDrops()
{
//if the letter movement boundry value is less than 0 then letter is out of screen thus returning true else false
if(MovementSpan < 0.0)
{
return true;
}
else
{
return false;
}
}
For loading background image and sound effects, I made a separate function and called that function in the draw and setup functions to render the graphical assets on screen. There are different sound effects used to represent different behaviours. When the character moves, then the sound effect is different. Thus, for the main menu screen and game over screen, a different sound effect is allocated.
I implemented the loadGraphics() function which is loading the images saving in the global image arrays for the player character and grade letters. Furthermore, the background image is also loading into the global background image variable.
// for loading graphics on screen
void loadGraphics()
{
PlayerCharacter[0] = loadImage("C1.png");
PlayerCharacter[1] = loadImage("C2.png");
PlayerCharacter[2] = loadImage("C3.png");
PlayerCharacter[3] = loadImage("C4.png");
gradeLetters[0] = loadImage("A.png");
gradeLetters[1] = loadImage("B.png");
gradeLetters[2] = loadImage("C.png");
gradeLetters[3] = loadImage("D.png");
gradeLetters[4] = loadImage("F.png");
gradeLetters[5] = loadImage("B+.png");
gradeLetters[6] = loadImage("C+.png");
gradeLetters[7] = loadImage("D+.png");
GPAScoreValues[0] = loadImage("0.png");
GPAScoreValues[1] = loadImage("1.png");
GPAScoreValues[2] = loadImage("2.png");
GPAScoreValues[3] = loadImage("3.png");
GPAScoreValues[4] = loadImage("4.png");
background = loadImage("back.png");
KeyControlsImage = loadImage("Controls.png");
MainPromptText = loadImage("textprompt.png");
GPAScore = loadImage("gpascore.png");
}
In setup() function I am setting the frame rate by using framerate() builtin function, loading the graphical assets, and playing the main menu sound effect in the loop.
//Main setup function for the configuration of game
void setup()
{
//setting the size of screen by width and height
size(1080, 720);
//setting framerate which means how many times screen should be repeated
frameRate(30);
//loading sound and background images assets on screen
loadAssets();
//Put the game in default configuration and game renders from starting position
restart();
//checking true which shows that character is at its default state
Character.CharacterDropped = true;
//for playing main menu sound
MainMenuSoundEffect.loop();
}
In draw() function I am rendering the background image by using image() function and also updating the game assets, for example, repositioning the player character based on the key pressed by the user.
//Main draw function which iterates infinite time and render game screen
void draw()
{
image(background,0,0);
//Updating GPA score point and game configuration
updateGame();
//showing graphichs and other assets on screen
show();
}
FINAL WORK:
CONCLUSION:
For my midterm project, I learned how to implement game logic, render multiple graphics all at the same time, move images from one position to another, and use my knowledge of data structures (for example arrays lists in processing). The game making journey has enhanced my knowledge in regards to different object initialization and creation, and in audio file manipulations from the loading of sound effects that has been done.
GOOGLE DRIVE LINK:
https://drive.google.com/drive/folders/11FKKklnNtAAbftPXK7VQ85PIB9F_IHjX?usp=sharing
COMPLETE CODE OF UNI RUSH GAME 🙂
//importing library for sound
import processing.sound.*;
//Object Creation for Background Sound Effect while game playing
SoundFile BackSoundEffect;
//Object Creation For Main Menu Background Sound Effect
SoundFile MainMenuSoundEffect;
//Object Creation For Sound Effect When Character Fails to Eat Any Grade Letter
SoundFile SkipGradeLetterSound;
//Object Creation For Sound Effect during the movement of character
SoundFile CharacterMovementSoundEffect;
//Image object array creation for lion character
PImage PlayerCharacter[] = {null, null, null, null};
//Object Creation for grade letters
PImage gradeLetters[] = {null, null, null, null, null, null, null, null};
//Object Creation for the background image
PImage background;
//object creation for key controls for game playing
PImage KeyControlsImage;
//Object creation for main screen text prompt
PImage MainPromptText;
//Object creation for GPA Score Prompt
PImage GPAScore;
//Object creation for GPA score Points
PImage GPAScoreValues[] = {null, null, null, null, null, null, null, null, null, null};
//Game screen width and height
int screenWidth = 1080;
int screenHeight = 720;
//for how many times background should be repeated
int backgroundRepeat[] = {((int)screenWidth/128) + 2, ((int)screenHeight/128) + 2};
//the starting point of the background image
int backgroundOffset = 0;
ArrayList<IntersectionWithLetter> fframes;
float framespeed;
float margin;
float marginCounter;
int score;
int gameFrame = 0;
GradeLetters GradeLetters = new GradeLetters();
Character Character;
//Main setup function for the configuration of game
void setup()
{
//setting the size of screen by width and height
size(1080, 720);
//setting framerate which means how many times screen should be repeated
frameRate(30);
//loading sound and background images assets on screen
loadAssets();
//Put the game in default configuration and game renders from starting position
restart();
//checking true which shows that character is at its default state
Character.CharacterDropped = true;
//for playing main menu sound
MainMenuSoundEffect.loop();
}
//Main draw function which iterates infinite time and render game screen
void draw()
{
image(background,0,0);
//Updating game background which include background image,character images and grade letters
// updateBackground();
//Updating GPA score point and game configuration
updateGame();
//showing graphichs and other assets on screen
show();
}
//Key pressed function event which occurs when any keyboard key is pressed
void keyPressed()
{
//If the key is 'w' then moving the character upward
if(key == 'w') Character.move(0, -1);
//if the key is 'a' then moving the character left
if(key == 'a') Character.move(-1, 0);
//if the key is s then moving the character down
if(key == 's') Character.move(0, 1);
//if the key is 'd' then moving the character right
if(key == 'd') Character.move(1, 0);
//if the key is 'r' then setting the character to its default state and postion
if(key == 'r' || Character.CharacterDropped)
{
//stop playing background sounds
BackSoundEffect.stop();
MainMenuSoundEffect.stop();
BackSoundEffect.loop();
//restarting game to its default configuration
restart();
gameFrame = 0;
}
}
//Main class for Grade letters which inherits the letters class object array
class GradeLetters
{
//grade letters object array
ArrayList<Letter> letters;
//default constructor for grade letters
GradeLetters()
{
//initializing letters object array in defualt constructor
letters = new ArrayList<Letter>();
}
//populating grade letters with different screen positions
void AddLetter(PVector position, int nletters)
{
//for loop which iterates through number of letters and adding letter with its position
for(int i = 0; i < nletters; i++)
{
//adding letter with its position
this.AddLetter(position);
}
}
//single paramter add letter function which is for initializing new letter with its position
void AddLetter(PVector position)
{
//calling letters array add function and adding new letter with it position into the array
letters.add(new Letter(position));
}
//function for updating letters on screen
void UpdateLettersOnScreen()
{
//for loop which runs till letters array size in reverse order
for (int i = letters.size()-1; i >= 0; i--)
{
//getting the letter from the array from ith index
Letter l = letters.get(i);
//rendering the letter on screen
l.UpdateLettersOnScreen();
//checking if the letter goes out of screen then removing the letter from the array
if (l.IsLetterDrops())
{
letters.remove(i);
}
}
}
}
//letter class which represents single letter object
class Letter
{
//Position of Letter on screen
PVector position;
//Velocity of movement of letter on screen
PVector velocity;
//Accelration of movement of letter on screen
PVector acceleration;
//size of the letter which is randomly generated from values 1 to 4
int size = (int)random(1, 4);
//varibale for limiting the area for the movement of each letter on screen. the letter moves in its setting boundry
float MovementSpan;
//default constructor for letter class which takes position of letter as parameter
Letter(PVector pos)
{
//setting radom speed and velocity of the letters for the movement of letter
acceleration = new PVector(random(-0.05, 0.05), random(-0.05, 0.05));
velocity = new PVector(random(-2, 2), random(-2, 2));
//default position of each letter
position = pos.copy();
//random boundry for each letter movement
MovementSpan = random(100.0, 255.0);
}
//to update the rendering of letter on screen
void UpdateLettersOnScreen()
{
//updating speed and velocity of letter movement and decresing the movement boundry of letter by value 2.
velocity.add(acceleration);
position.add(velocity);
MovementSpan -= 2.0;
//displaying the letter on screen
display();
}
//to display letter on screen
void display()
{
//setting transparent color
fill(255, MovementSpan);
//drawing rectangle which represents the boundry of letters
rect(position.x, position.y, size, size);
}
//for checking if the letters moves out of the screen or not
boolean IsLetterDrops()
{
//if the letter movement boundry value is less than 0 then letter is out of screen thus returning true else false
if(MovementSpan < 0.0)
{
return true;
}
else
{
return false;
}
}
}
//Player Character Class
class Character
{
//The default x and y position value variables for player character.
int xPos, yPos;
//The default x and y direction of the player character
int xRail = 0, yRail = 0;
//variable for default image frame value for player character
int currentFrame = 0;
//varibale for checking of the player character is inside screen or not
boolean CharacterDropped = false;
//default constructor for player character which sets the default position of the player character
Character(int xPos, int yPos)
{
this.xPos = xPos;
this.yPos = yPos;
}
//function for the movement of player character accoriding to the x and y direction of the character
void move(int xDirection, int yDirection)
{
//checking if the movement of the character is in horizontal direction
if(this.xRail + xDirection <= 4 && this.xRail + xDirection >= -1)
{
//if the y direction value is zero then adding new letter in the followed direction and playing player character movement sound
if(yDirection == 0)
{
GradeLetters.AddLetter(new PVector(this.xPos + xRail * screenHeight/4, this.yPos + this.yRail * screenHeight/4 + 30), 20);
keyViewerActive(key, 10, screenHeight - 10);
CharacterMovementSoundEffect.play();
}
//moving one step forward the direction of player character in x direction
this.xRail += xDirection;
}
//checking if the movement of the character is in verticle direction
if(this.yRail + yDirection <= 1 && this.yRail + yDirection >= -1)
{
//if the x direction value is zero then adding new letter in the followed direction and playing player character movement sound
if(xDirection == 0)
{
GradeLetters.AddLetter(new PVector(this.xPos + xRail * screenHeight/4 + 20, this.yPos + this.yRail * screenHeight/4 + 30), 10);
keyViewerActive(key, 10, screenHeight - 10);
CharacterMovementSoundEffect.play();
}
//moving one step forward the direction of player character in y direction
this.yRail += yDirection;
}
}
//function to check if the player character is out screen which means the character died
//stopping the game background sound and playing main menu sound
void die()
{
this.xPos = -500;
this.yPos = -500;
this.CharacterDropped = true;
BackSoundEffect.stop();
SkipGradeLetterSound.play();
MainMenuSoundEffect.play();
}
//for rendering the player character in rectangular box structure on screen
void show()
{
rectMode(CENTER);
fill(255);
noStroke();
//showing player character image on screen
image(PlayerCharacter[currentFrame], this.xPos + xRail * screenHeight/4, this.yPos + this.yRail * screenHeight/4);
}
//for updating grade letters on screen
void UpdateLettersOnScreen()
{
//if the player character is in screen boundry
if(!CharacterDropped)
{
//shwoing the player character
this.show();
//updating the current frame value to render assests on screen
if(frameCount % 5 == 0)
{
currentFrame++;
if(currentFrame == 4) currentFrame = 0;
}
}
}
}
// class for checking if the player character eat or absorb any grade or not
class IntersectionWithLetter
{
// variable for the x postion
int xPos;
// varibales for the screen frames and its speed initialized by random values
int currentFrame = (int)random(0, 7), frameSpeed = (int)random(4, 6), empty = (int)random(-2, 2);
float speed, slowSpeed = 0;
//check if there is need to add gpa point or not
boolean canAddToScore = true;
//default constructor which takes x position of intersecting the grade letter and player character + the speed with which intersection occurs
IntersectionWithLetter(int xPos, float speed)
{
this.xPos = xPos;
this.speed = speed;
}
//function to check if the player character eat any grade letter or not
void Eat()
{
if(!Character.CharacterDropped && Character.yRail != this.empty && Character.xPos + Character.xRail * screenHeight/4 >= this.xPos -40 && Character.xPos + Character.xRail * screenHeight/4 <= this.xPos + 70)
{
Character.die();
}
}
//for showing grade letter on the current rendered frame
void show()
{
rectMode(CENTER);
noStroke();
//for loop which iterates one time and if the ith index is not empty then showing image of grade letter on current frame
for(int i = -1; i <= 1; i++)
{
if(i != empty) image(gradeLetters[currentFrame], this.xPos, screenHeight/2 + i * screenHeight/4);
}
}
//for updating letters on current rendered frame
void UpdateLettersOnScreen()
{
//updating the speed of grade letters
if(this.slowSpeed == 0) this.xPos -= this.speed;
else this.xPos -= this.slowSpeed;
this.Eat();
this.show();
// if the rendering is done with all frames then resetting the current frame value to zero
if(frameCount % frameSpeed == 0)
{
currentFrame++;
if(currentFrame == 8)
{
currentFrame = 0;
}
}
}
}
//for updating frames on screen after intersection
void UpdateFrames()
{
//looping to update letters on screen frame after intersection
for(IntersectionWithLetter IntersectionWithLetter : fframes)
{
IntersectionWithLetter.UpdateLettersOnScreen();
}
//checking if the top frame is first frame
if(fframes.size() > 0 && fframes.get(0).xPos < -128)
{
//removing the first frame from the screen
removeFirstFrame();
}
//checking if there is space on rendering more frame on screen
if(marginCounter <= 0 && !(gameFrame >= 2400 && gameFrame <= 3030))
{
//adding new frame on screen
addFrame();
}
SlowFrameSpeed();
}
//for removing the first frame from the screen
void removeFirstFrame()
{
fframes.remove(0);
}
//for adding new frame on screen
void addFrame()
{
fframes.add(new IntersectionWithLetter(screenWidth + 128, framespeed));
if(margin > screenWidth/4) margin *= 0.95;
marginCounter = margin;
if(framespeed < 20)
{
framespeed *= 1.015;
}
}
//for slowing the frame rendering speed
void SlowFrameSpeed()
{
//if there is space to render more frames on screen then setting the frame speed to 1
if(gameFrame >= 2400 && gameFrame <= 3030)
{
for(IntersectionWithLetter IntersectionWithLetter : fframes)
{
IntersectionWithLetter.slowSpeed = 1;
}
}
//if there is no space to render more frames on screen then setting the frame speed to 0
else
{
for(IntersectionWithLetter IntersectionWithLetter : fframes)
{
IntersectionWithLetter.slowSpeed = 0;
}
}
}
//for updating background of the game
void updateBackground()
{
// if the frame vlue is even then updating the background offset position
if(frameCount%2 == 0)
{
backgroundOffset++;
}
//if the background offset value is maximum then resetting the offset value to 0 and showing the background image
if(backgroundOffset == 128)
{
backgroundOffset = 0;
showBackground();
}
}
//for displaying background on screen
void showBackground()
{
//nested for loop to render the background image on each pixel on screen in x and y direction
for(int x = 0; x < backgroundRepeat[0]; x++)
{
for(int y = 0; y < backgroundRepeat[1]; y++)
{
image(background, x*background.width - backgroundOffset, y*background.height);
}
}
}
// for converting number to images
ArrayList<PImage> numberToArrayOfImages(int number)
{
ArrayList<PImage> images = new ArrayList<PImage>();
String numberS = str(number);
int len = numberS.length(), buffer;
//iterating till the number length
for(int index = 0; index < len; index++)
{
//switch for checking for the desired gpa point and if the case match then updating buffer
switch(numberS.charAt(index))
{
case '0':
buffer = 0;
break;
case '1':
buffer = 1;
break;
case '2':
buffer = 2;
break;
case '3':
buffer = 3;
break;
case '4':
buffer = 4;
break;
case '5':
buffer = 5;
break;
case '6':
buffer = 6;
break;
case '7':
buffer = 7;
break;
case '8':
buffer = 8;
break;
case '9':
buffer = 9;
break;
default:
buffer = 0;
break;
}
images.add(GPAScoreValues[buffer]);
}
return images;
}
//showing gpa score
void showScore()
{
fill(255);
textSize(16);
//rendering gpa score image
image(GPAScore, 0, 0);
ArrayList<PImage> images = numberToArrayOfImages(score);
int index = 0;
//iterating all gpa score images
for(PImage image : images)
{
int yOffset = 0;
//if the gpa score value matches with the image
if(image == GPAScoreValues[0]) yOffset = 4;
//then rendering the image on screen
image(image, 60 + index * 11, 10 - yOffset);
index++;
}
}
// for updating gpa score
void updateScore()
{
//checking if player is in screen boundry
if(!Character.CharacterDropped)
{
//checking if the
for(IntersectionWithLetter layer : fframes)
{
if(layer.canAddToScore == true && layer.xPos <= Character.xPos + (Character.xRail * screenHeight/4))
{
score++;
layer.canAddToScore = false;
}
}
}
}
//for displaying key viewer on screen
void keyViewer()
{
image(KeyControlsImage, 10, screenHeight - 10 - KeyControlsImage.height);
}
//for updating the position based on the active key press
void keyViewerActive(char keyName, int xPos, int yPos)
{
fill(50, 255, 50);
//if the key is w then drawing square to new required position
if(keyName == 'w')
{
square(xPos + 3 * 3 + 44 + 25, yPos + 3 * 3 - 44 * 2, 46);
}
//if the key is a then drawing square to new required position
else if(keyName == 'a')
{
square(xPos + 3 + 22, yPos - 3 - 22, 46);
}
//if the key is s then drawing square to new required position
else if(keyName == 's')
{
square(xPos + 3 * 3 + 44 + 25, yPos - 3 - 22, 46);
}
//if the key is d then drawing square to new required position
else if(keyName == 'd')
{
square(xPos + 3 * 5 + 44 * 2 + 28, yPos - 3 - 22, 46);
}
keyViewer();
}
// function for main menu screen
void mainScreen()
{
// filling up a rectangle with light color
fill(50, 150);
rect(screenWidth/2, screenHeight/2, screenWidth, screenHeight);
textSize(36);
fill(255);
imageMode(CENTER);
//prompting text on screen
image(MainPromptText, screenWidth/2, screenHeight/3);
imageMode(CORNER);
}
// for loading images and sound effect assests on screen
void loadAssets()
{
loadGraphics();
loadSound();
}
// for loading graphics on screen
void loadGraphics()
{
PlayerCharacter[0] = loadImage("C1.png");
PlayerCharacter[1] = loadImage("C2.png");
PlayerCharacter[2] = loadImage("C3.png");
PlayerCharacter[3] = loadImage("C4.png");
gradeLetters[0] = loadImage("A.png");
gradeLetters[1] = loadImage("B.png");
gradeLetters[2] = loadImage("C.png");
gradeLetters[3] = loadImage("D.png");
gradeLetters[4] = loadImage("F.png");
gradeLetters[5] = loadImage("B+.png");
gradeLetters[6] = loadImage("C+.png");
gradeLetters[7] = loadImage("D+.png");
GPAScoreValues[0] = loadImage("0.png");
GPAScoreValues[1] = loadImage("1.png");
GPAScoreValues[2] = loadImage("2.png");
GPAScoreValues[3] = loadImage("3.png");
GPAScoreValues[4] = loadImage("4.png");
background = loadImage("back.png");
KeyControlsImage = loadImage("Controls.png");
MainPromptText = loadImage("textprompt.png");
GPAScore = loadImage("gpascore.png");
}
//for loading sound effects
void loadSound()
{
//background sound effect
BackSoundEffect = new SoundFile(this, "backgroundsound.mp3");
//main menu sound effect
MainMenuSoundEffect = new SoundFile(this, "mainmenusound.mp3");
//skipping grade letter sound
SkipGradeLetterSound = new SoundFile(this, "dropsound.mp3");
//player character movement sound effect
CharacterMovementSoundEffect = new SoundFile(this, "cmovesound.mp3");
}
//for updating game
void updateGame()
{
//upodating frames count on screen
gameFrame++;
//updating grade letters on screen
Character.UpdateLettersOnScreen();
//updating frames on screen
UpdateFrames();
//updating gpa score
updateScore();
//for updating letters on screen
GradeLetters.UpdateLettersOnScreen();
//upodating frame speed
marginCounter -= framespeed;
}
//for showing gpa score and key viewer on game screen
void show()
{
//showing gpa score
showScore();
//if player character is out of screen then returning to main menu screen
if(Character.CharacterDropped)
{
mainScreen();
}
//for rendering key viewer on screen
keyViewer();
}
// for restarting the game.
void restart()
{
// the gpa score will be zero
score = 0;
//frame speed reset to 5 which means 5 frames will be rendered in one second
framespeed = 2;
//margin between player character and grade letters
margin = screenWidth/2;
marginCounter = margin;
//initializing player character to its default position
Character = new Character(230, height/2);
// resetting frames
fframes = new ArrayList<IntersectionWithLetter>();
fframes.add(new IntersectionWithLetter(screenWidth + 128, framespeed));
}


