From 0b20bb1a06f4b91ebef8e3eb10a7f2c58812a34b Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:05:09 -0400 Subject: [PATCH 01/25] Delete Circular Rotating Robot.png --- Circular Rotating Robot.png | Bin 69434 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Circular Rotating Robot.png diff --git a/Circular Rotating Robot.png b/Circular Rotating Robot.png deleted file mode 100644 index d5bab54f893fcd089958cfd080eab5ace4987b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69434 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 From 9761211bbbaf5f0a8bb9c3b8539fb55b1a5ae2b6 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:05:38 -0400 Subject: [PATCH 02/25] Delete Board (Vishwa) --- Board (Vishwa) | 91 -------------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 Board (Vishwa) diff --git a/Board (Vishwa) b/Board (Vishwa) deleted file mode 100644 index 1d85ee6..0000000 --- a/Board (Vishwa) +++ /dev/null @@ -1,91 +0,0 @@ -class Board { - Sword[] swords; - //int score; - boolean clear; - String diff; - int lev = 0; - float robotAngle = 0; - float robotSpeed = 0.01; - - Board(int swordCount /*might need parameters for level to display level text*/) { - swords = new Sword[swordCount]; - score = 0; - clear = false; - - for (int i=0; i < swordCount; i++) - swords[i]=new Sword(); - } - - int getScore() { - return score; - } - - - void Reset() { - //Also need to display score screen - score=0; - clear = false; - } - - void SetDifficulty(String difficulty) { - diff=difficulty; - } - - void IncreaseLev() { - if (clear) { - lev++; - //Display level text - } - } - - void placeBomb() { - //Need to check if previous sword has hit the robot. If it has, you can place a new sword. - for (int i=0; i < swords.length; i++) { - if (swords[i].getHit()) { - swords[i].rotateSword(); - } - } - } - - void displayBoard(PImage img) { - background(level); - pushMatrix(); - rotate(robotAngle); - imageMode(CENTER); - image(img, 0, 0); - robotAngle += robotSpeed; - popMatrix(); - } - - void clicked(int c) { - swords[c].shoot(); - //Temporary score counter for now; need to first check for collisions. - score+=1; - } - - void collisionCheck() { - for (int i = 0; i < swords.length; i++) { - if (swords[clickCount].getHit() && swords[i].getHit() && (i != clickCount)) { - System.out.println("Current sword placed coordinates: X - " + swords[clickCount].getX() + ", Y - " + swords[clickCount].getY()); - System.out.println("Checking sword at i: X - " + swords[i].getX() + ", Y - " + swords[i].getY()); - System.out.println("Distance: " + dist(swords[i].getX(), swords[i].getY(), swords[clickCount].getX(), swords[clickCount].getY())); - if (collided(swords[i].getX(), swords[i].getY(), swords[clickCount].getX(), swords[clickCount].getY())) { - println("COLLIDED!"); - clear = true; - //background(level); - } - } - } - } - - boolean collided(float x1, float y1, float x2, float y2) { - if (dist(x1, y1, x2, y2) <= 1) { - //System.out.println("Distance: " + dist(x1, y1, x2, y2)); - System.out.println("COLLIDED!"); - return true; - } - println(x1, x2 ,y1,y2); - - return false; - } -} From 26f63bee909fac7fc6fdf1875f44f9ce479d0cf0 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:05:51 -0400 Subject: [PATCH 03/25] Delete Board.pde (Aayesha) --- Board.pde (Aayesha) | 110 -------------------------------------------- 1 file changed, 110 deletions(-) delete mode 100644 Board.pde (Aayesha) diff --git a/Board.pde (Aayesha) b/Board.pde (Aayesha) deleted file mode 100644 index 4e042df..0000000 --- a/Board.pde (Aayesha) +++ /dev/null @@ -1,110 +0,0 @@ - -class Board { - Sword[] swords; - int score; - boolean clear; - String diff; - int lev = 1; - float robotAngle = 0; - float robotSpeed = 0.1; - int remBomb; - int scorefinal=0; - int scoredis=0; - - Board(int swordCount /*might need parameters for level to display level text*/) { - swords = new Sword[swordCount]; - score = 0; - clear = false; - - for (int i=0; i < swordCount; i++) - swords[i]=new Sword(); - } - - int getScore() { - return score; - } - - void addScore(boolean b) { - if (b) - score+=1; - } - - void Reset() { - //Also need to display score screen - //score=0; - // scoredis+=scorefinal; - b.IncreaseLev(); - clear = false; - int swordCount= int (random(7,15)); - swords = new Sword[swordCount]; - for (int i=0; i < swordCount; i++) - swords[i]=new Sword(); - - } - - void SetDifficulty(String difficulty) { - diff=difficulty; - } - - void IncreaseLev() { - if (clear) { - lev++; - //Display level text - } - } - - void placeBomb() { - for (int i=0; i < swords.length; i++) { - if (swords[i].getHit()) { - swords[i].rotateSword(); - } - } - } - - void displayBoard(PImage img) { - background(level); - pushMatrix(); - rotate(robotAngle); - imageMode(CENTER); - image(img, 0, 0); - robotAngle += robotSpeed; - popMatrix(); - } - - void clicked(int c) { - swords[c].shoot(); - score++; - } - void display() { - PFont mono; - mono = createFont("gamerfont3.otf", 128); - textFont(mono); - b.remBomb = b.swords.length - clickCount; - b.remBomb = Math.max(0, b.remBomb); - - - textSize(40); - text("Remaining Bombs: ", -380, -360); - text("Level ", -100, -260); - text("Current Score: ", 60, -360); - - textSize(40); - text(remBomb, -60, -360); - - text(lev, 50, -260); - text(score, 340, -360); - //score = clickCount; - /* - if(b.remBomb == 0){ - score = b.swords.length; - scorefinal = score; - println(scorefinal); - }*/ - // println(score); - - - } - int getremainingb(){ - return remBomb; - } -} From a3a243ea1276c3558caa0034a99b886db2de408f Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:06:01 -0400 Subject: [PATCH 04/25] Delete FPAhmedSword --- FPAhmedSword | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 FPAhmedSword diff --git a/FPAhmedSword b/FPAhmedSword deleted file mode 100644 index 79240a1..0000000 --- a/FPAhmedSword +++ /dev/null @@ -1,41 +0,0 @@ -class Sword { - float speed; - float pos; - boolean hit; - float circleAngle = 0; - float circleSpeed = 0.1; - - Sword() { - speed = 20; - pos = 350; - hit = false; - - } - - void shoot() { - while (pos >= 200) { - strokeWeight(3); - stroke(255, 187, 51); - fill(0, 255, 255); - ellipse(0, pos, 30, 30); - pos -= speed; - } - setHit(true); - } - - void setHit(boolean b) { - hit=b; - } - - boolean getHit() { - return hit; - } - - void rotateSword() { - pushMatrix(); - rotate(circleAngle); - circleAngle += circleSpeed; - ellipse(60, 200, 30, 30); - popMatrix(); - } -} From f1ddb64f9c4ab8883ba530d77271cae4dfe66e82 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:06:19 -0400 Subject: [PATCH 05/25] Delete FPAhmedboard --- FPAhmedboard | 88 ---------------------------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 FPAhmedboard diff --git a/FPAhmedboard b/FPAhmedboard deleted file mode 100644 index e31f420..0000000 --- a/FPAhmedboard +++ /dev/null @@ -1,88 +0,0 @@ -class Board { - Sword[] swords; - int score; - boolean clear; - String diff; - int lev = 0; - float robotAngle = 0; - float robotSpeed = 0.1; - int remBomb; - - Board(int swordCount /*might need parameters for level to display level text*/) { - swords = new Sword[swordCount]; - score = 0; - clear = false; - - for (int i=0; i < swordCount; i++) - swords[i]=new Sword(); - } - - int getScore() { - return score; - } - - void addScore(boolean b) { - if (b) - score+=1; - } - - void Reset() { - //Also need to display score screen - score=0; - clear = false; - } - - void SetDifficulty(String difficulty) { - diff=difficulty; - } - - void IncreaseLev() { - if (clear) { - lev++; - //Display level text - } - } - - void placeBomb() { - for (int i=0; i < swords.length; i++) { - if (swords[i].getHit()) { - swords[i].rotateSword(); - } - } - } - - void displayBoard(PImage img) { - background(level); - pushMatrix(); - rotate(robotAngle); - imageMode(CENTER); - image(img, 0, 0); - robotAngle += robotSpeed; - popMatrix(); - } - - void clicked(int c) { - swords[c].shoot(); - } - void display() { - b.remBomb = b.swords.length - clickCount; - b.remBomb = Math.max(0, b.remBomb); - - - textSize(30); - text("Remaining Bombs Left: ", -380, -360); - text("Current Score ", -380, -260); - - textSize(65); - text(remBomb, -70, -350); - - text(score, -70, -250); - score = clickCount; - if(b.remBomb == 0){ - score = b.swords.length; - } - println(score); - - - } -} From 28a6eb055422d043d5fead6617fb00a55b81c845 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:06:29 -0400 Subject: [PATCH 06/25] Delete FinalProject.pde --- FinalProject.pde | 81 ------------------------------------------------ 1 file changed, 81 deletions(-) delete mode 100644 FinalProject.pde diff --git a/FinalProject.pde b/FinalProject.pde deleted file mode 100644 index b1a21dd..0000000 --- a/FinalProject.pde +++ /dev/null @@ -1,81 +0,0 @@ -import processing.sound.*; -SoundFile file; -SoundFile hitsound; - -PImage robot; -PImage level; -Sword s; -Sword s2; -Board b; -float sp=20; -boolean click=false; -float robotAngle = 0; -float robotSpeed = 0.1; -float coor; -float r=0; -float x; -float y; - -int clickCount = 0; -void setup() { - size(800, 800); - s = new Sword(); - s2 = new Sword(); - frameRate(10); - level = loadImage("Level Background.png"); - robot = loadImage("Circular Rotating Robot.png"); - background(level); - - //file = new SoundFile(this, "Dystopian_Synthwave_Retrowave_-_Lost_City_Royalty_Free_Copyright_Safe_Music.mp3"); - //file.loop(); - hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); - - // noLoop(); -} -void draw() { - background(level); - pushMatrix(); - translate(width/2, height/2); - rotate(robotAngle); - imageMode(CENTER); - image(robot, 0, 0); - robotAngle += robotSpeed; - popMatrix(); - - if (s.getHit()) { - translate(width/2, height/2); - rotate(robotAngle); - //println("Sword 1 angle: " + robotAngle); - ellipseMode(CORNER); - ellipse(0, 200, 30, 30); - //rotate(robotAngle); - } - - if (s2.getHit()) { - //translate(width/2, height/2); - rotate(robotAngle); - //println("Sword 2 angle: " + robotAngle); - //ellipseMode(CORNER); - ellipse(0, 200, 30, 30); - rotate(robotAngle); - } - - -} - - -void mousePressed() { - clickCount++; - println("Current click count: " + clickCount); - //click=!click; - s.shoot(); - s.setHit(true); - - if (clickCount == 2) { - s2.shoot(); - s2.setHit(true); - } - - //s.shoot(); -} -//Class circle From 48db9d3a9f15c560892efcbedc2e50f15fb39a7b Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:06:38 -0400 Subject: [PATCH 07/25] Delete FinalProjectAayesha.pde --- FinalProjectAayesha.pde | 73 ----------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 FinalProjectAayesha.pde diff --git a/FinalProjectAayesha.pde b/FinalProjectAayesha.pde deleted file mode 100644 index 7deff50..0000000 --- a/FinalProjectAayesha.pde +++ /dev/null @@ -1,73 +0,0 @@ -import processing.sound.*; -SoundFile file; -SoundFile hitsound; - -PImage robot; -PImage level; -PImage menu; -boolean modeMenu; -boolean gameStart; -Board b; -int clickCount; - -void setup() { - size(800, 800); - clickCount = 0; - b = new Board(8); - frameRate(10); - level = loadImage("level.png"); - robot = loadImage("Circular_Rotating_Robot.png"); - menu = loadImage("Menu Screen.png"); - //background(level); - modeMenu=true; - gameStart=false; - //file = new SoundFile(this, "Dystopian_Synthwave_Retrowave_-_Lost_City_Royalty_Free_Copyright_Safe_Music.mp3"); - //file.loop(); - hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); -} -void draw() { -// println(mouseX,mouseY); - if(modeMenu){ - setbg(menu); - } - else{ - gameStart=true; - setbg(level); - translate(width/2, height/2); - - b.displayBoard(robot); - - //Goes through array and checks if a bomb has not been placed at the current index. - b.placeBomb(); - b.display(); - if(b.getremainingb()==0){ - b.clear=true; - clickCount=0; - b.Reset(); - //b.IncreaseLev(); - } - //println("lev",b.lev); - } -} - -void setbg(PImage img){ -background(img); -} -void mousePressed() { - if(modeMenu){ - if(mouseX>=248 && mouseX<=550 && mouseY>=360 && mouseY<=430){ - modeMenu=false; - } - else if (mouseX>=242 && mouseX<=550 && mouseY>=540 && mouseY<=596){ - exit(); - } - } - if(modeMenu==false && gameStart==true){ - if (clickCount < b.swords.length) { - println("Current click count: " + clickCount); - b.clicked(clickCount); - } - - clickCount++; - } -} From 3be25df83cc118e8d16fecbd0462d06965dcd3cb Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:06:53 -0400 Subject: [PATCH 08/25] Delete Main (Vishwa) --- Main (Vishwa) | 61 --------------------------------------------------- 1 file changed, 61 deletions(-) delete mode 100644 Main (Vishwa) diff --git a/Main (Vishwa) b/Main (Vishwa) deleted file mode 100644 index 6da8192..0000000 --- a/Main (Vishwa) +++ /dev/null @@ -1,61 +0,0 @@ -import processing.sound.*; -SoundFile file; -SoundFile hitsound; - -PImage robot; -PImage level; -PImage menu; - -Board b; -int clickCount; -int score; - -boolean setMainMenu = false; - -void setup() { - size(800, 800); - clickCount = 0; - score = 0; - b = new Board(int(random(5, 25))); //Create a new board object of random number of bombs from 5 - 25 - frameRate(32); - level = loadImage("Level Background.png"); - robot = loadImage("Circular Rotating Robot.png"); - background(level); - - //file = new SoundFile(this, "Dystopian_Synthwave_Retrowave_-_Lost_City_Royalty_Free_Copyright_Safe_Music.mp3"); - //file.loop(); - hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); -} -void draw() { - background(level); - translate(width/2, height/2); - - b.displayBoard(robot); - - //Goes through array and checks if a bomb has not been placed at the current index. - b.placeBomb(); - - if (setMainMenu) { - background(level); - exit(); - } -} - - -void mousePressed() { - if (clickCount < b.swords.length) { - println("Click Count: " + clickCount); - b.clicked(clickCount); - b.collisionCheck(); - if (b.clear) { - setMainMenu = true; - } - if (b.swords[clickCount].getHit()) { - hitsound.play(); - } - clickCount++; - println("Click Count: " + clickCount); - println("Current Score: " + b.getScore()); - } - //After every level, clickCount has to be reset to 0 -} From 0b6a75ca56ff806d918637a4b693fb24ba3d2398 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:07:06 -0400 Subject: [PATCH 09/25] Delete Sword (Vishwa) --- Sword (Vishwa) | 68 -------------------------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 Sword (Vishwa) diff --git a/Sword (Vishwa) b/Sword (Vishwa) deleted file mode 100644 index 828a331..0000000 --- a/Sword (Vishwa) +++ /dev/null @@ -1,68 +0,0 @@ -class Sword { - float speed; - float pos; - boolean hit; - float circleAngle = 0; - float circleSpeed = 0.01; - float x = 0; - float y = 200; - - Sword() { - speed = 20; - pos = 350; - hit = false; - } - - void shoot() { //Might also need shoot sound effect and hit sound effect - while (pos >= 200) { - strokeWeight(3); - stroke(255, 187, 51); //Outline of bomb - //fill(0, 255, 255); //Bomb color - fill(0); - ellipse(0, pos, 30, 30); - pos -= speed; - } - setHit(true); - } - - - void setHit(boolean b) { - hit=b; - } - - boolean getHit() { - return hit; - } - - void rotateSword() { - pushMatrix(); - rotate(circleAngle); - - circleAngle += circleSpeed; - if(circleSpeed==0.1){ - x += cos(circleAngle); - y += sin(circleAngle); - ellipse(0, 200, 30, 30); - - } - else if(circleSpeed==0.01){ - x += sin(circleAngle); - y += cos(circleAngle); - ellipse(-42, 200, 30, 30); - - - } - //ellipse(0, 200, 30, 30); - - //println("X-coord: " + x + ", Y-Coord: " + y * sin(circleAngle)); - popMatrix(); - } - - float getX() { - return x; - } - - float getY() { - return y; - } -} From 46e05b42fe982e6679d8f54199f4f959db7b0b5d Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:07:16 -0400 Subject: [PATCH 10/25] Delete Sword.pde --- Sword.pde | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 Sword.pde diff --git a/Sword.pde b/Sword.pde deleted file mode 100644 index 6ab538c..0000000 --- a/Sword.pde +++ /dev/null @@ -1,42 +0,0 @@ -class Sword { - float speed; - float pos; - boolean hit; - float circleAngle = 0; - float circleSpeed = 0.1; - - Sword() { - speed = 20; - pos = 350; - hit = false; - } - - void shoot() { - while (pos >= 200) { - strokeWeight(3); - stroke(255, 187, 51); - fill(0, 255, 255); - ellipse(0, pos, 30, 30); - pos -= speed; - } - setHit(true); - } - - - void setHit(boolean b) { - hit=b; - } - - boolean getHit() { - return hit; - } - - void rotateSword() { - pushMatrix(); - rotate(circleAngle); - circleAngle += circleSpeed; - ellipse(0, 200, 30, 30); - popMatrix(); - } -} - From 1ade34644d2c9cc9cb7eaa8b40f2bcab5e821114 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:07:26 -0400 Subject: [PATCH 11/25] Delete fpa --- fpa | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) delete mode 100644 fpa diff --git a/fpa b/fpa deleted file mode 100644 index 98515dd..0000000 --- a/fpa +++ /dev/null @@ -1,48 +0,0 @@ -import processing.sound.*; -SoundFile file; -SoundFile hitsound; -PImage robot; -PImage level; -PImage menu; - -Board b; -int clickCount; - -void setup() { - size(800, 800); - clickCount = 0; - b = new Board(int (random(5, 10)));//changes total number of shots available - frameRate(10); - level = loadImage("Level Background.png"); - robot = loadImage("Circular Rotating Robot.png"); - background(level); - - file = new SoundFile(this, "Dystopian_Synthwave_Retrowave_-_Lost_City_Royalty_Free_Copyright_Safe_Music.wav"); - file.loop(); - hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); -} -void draw() { - background(level); - - translate(width/2, height/2); - - b.displayBoard(robot); - - //Goes through array and checks if a bomb has not been placed at the current index. - b.placeBomb(); - b.display(); -} - - -void mousePressed() { - if (clickCount < b.swords.length) { - println("Current click count: " + clickCount); - b.clicked(clickCount); - - if (b.swords[clickCount].getHit()) { - - hitsound.play(); - } - } - clickCount++; -} From 2efa3ee0b94b0eb2475cab70be2bd4e7977471e3 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:07:54 -0400 Subject: [PATCH 12/25] Create Board.pde --- Board.pde | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 Board.pde diff --git a/Board.pde b/Board.pde new file mode 100644 index 0000000..9e985bb --- /dev/null +++ b/Board.pde @@ -0,0 +1,152 @@ + +class Board { + Bomb[] bombs; + int score; + boolean clear; + String diff; + int remainingBombs; + int wave = 1; + float robotAngle = PI/4; + float robotSpeed = random(0.025, 0.075); + boolean lose = false; + boolean mute = false; + + //Constructor + Board(int swordCount) { + bombs = new Bomb[swordCount]; + score = 0; + clear = false; + + for (int i=0; i < swordCount; i++) + bombs[i]=new Bomb(robotSpeed); + } + + //Displays board + void displayBoard(PImage img) { + PFont mono; + mono = createFont("Architype_Font.otf", 128); + textFont(mono); + pushMatrix(); + rotate(robotAngle); + imageMode(CENTER); + image(img, 0, 0); + robotAngle += robotSpeed; + popMatrix(); + + remainingBombs = bombs.length - clickCount; + remainingBombs = Math.max(0, remainingBombs); + + //Extra backround + //fill(48, 67, 186); + fill(17, 10, 97); + //fill(40, 48, 97); + boardText(-377, -172, 123, 313, -70, 55); + fill(255); + boardText(-380, -175, 120, 310, -75, 50); + } + + void placeBomb() { + //Need to check if previous sword has hit the robot. If it has, you can place a new sword. + for (int i=0; i < bombs.length; i++) { + if (bombs[i].getHit()) + bombs[i].rotateBomb(); + } + } + + void Reset() { + b.clear = true; + clickCount = 0; + wave++; + clear = false; + robotSpeed = random(0.025, 0.075); + println("Robot Speed: " + robotSpeed); + int swordCount = int (random(7, 15)); + bombs = new Bomb[swordCount]; + for (int i=0; i < swordCount; i++) + bombs[i]=new Bomb(robotSpeed); + } + + + void clicked(int c, SoundFile hit) { + bombs[c].shoot(); + //Temporary score counter for now; need to first check for collisions. + if(mute==false){ + hit.play(); + } + if(lose==false){ + score+=1; + } + } + + void collisionCheck() { + for (int i = 0; i < bombs.length; i++) { + if (bombs[clickCount].getHit() && bombs[i].getHit() && (i != clickCount)) { + + System.out.println("Current sword placed coordinates: X - " + bombs[clickCount].x + ", Y - " + bombs[clickCount].y); + System.out.println("Checking sword at i: X - " + bombs[i].x + ", Y - " + bombs[i].y); + System.out.println("Distance: " + dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)); + + + if (collided(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)) { + /*Lose condition*/ + println("COLLIDED!"); + lose = true; + clear = true; + } + } + } + } + + boolean collided(float x1, float y1, float x2, float y2) { + if (dist(x1, y1, x2, y2) <= 36) { + println("COLLIDED!"); + return true; + } + return false; + } + + + int getRemainingBombs() { + return remainingBombs; + } + + int getScore() { + return score; + } + + void SetDifficulty(String difficulty) { + diff=difficulty; + } + + void boardText(int x1, int x2, int x3, int x4, int x5, int x6) { + textSize(25); + text("REMAINING BOMBS: ", x1, -360); + text(" " + remainingBombs, x2, -360); + text("CURRENT SCORE: ", x3, -360); + text(" " + score, x4, -360); + + textSize(40); + text("WAVE ", x5, -260); + text(wave, x6, -260); + } + void EndScreen(){ + //translate(width/2,height/2); + PFont end; + end = createFont("Architype_Font.otf", 128); + textFont(end); + //print("end"); + textSize(90); + text("GAME OVER! ", 180, 160); + // text( score, 100, 260); + textSize(40); + fill(255); + // fill(17, 10, 97); + text("FINAL SCORE: ", 220, 350); + text( " "+score, 480, 350); + text("WAVES COMPLETED: ", 220, 450); + text( " "+wave, 600, 450); + text("HIGHEST SCORE: ", 220, 550); + text( " "+score, 520, 550); + + } +} From f65da26b20b7e045978ecc466a02d3207ca613c1 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:08:30 -0400 Subject: [PATCH 13/25] Create Sword.pde --- Sword.pde | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Sword.pde diff --git a/Sword.pde b/Sword.pde new file mode 100644 index 0000000..9efe127 --- /dev/null +++ b/Sword.pde @@ -0,0 +1,55 @@ +class Bomb { + float shootSpeed; + float pos; + boolean hit; + float circleAngle = PI/4; + float circleSpeed; + float x = 0; + float y = 200; + + Bomb(float tempCircleSpeed) { + shootSpeed = 20; + pos = 350; + hit = false; + circleSpeed = (tempCircleSpeed)/2.0; //somehow worked lol + } + + void shoot() { //Might also need shoot sound effect + while (pos >= 200) { + strokeWeight(3); + stroke(255, 187, 51); //Outline of bomb + //fill(0, 255, 255); //Bomb color + fill(0); + ellipse(0, pos, 30, 30); + pos -= shootSpeed; + } + setHit(true); + } + + void rotateBomb() { + pushMatrix(); + translate(width/2, height/2); + rotate(circleAngle); + popMatrix(); + + float tempX = 200 * cos(circleAngle); + float tempY = 200 * sin(circleAngle); + + //Rotate coordinates to coordinates with respect to entire screen + x = tempX * cos(circleAngle) - tempY * sin(circleAngle); + y = tempX * sin(circleAngle) + tempY * cos(circleAngle); + + //println(clickCount + ": Global X: " + x + ", Global Y: " + y); + + ellipse(x, y, 30, 30); + circleAngle += circleSpeed; + } + + void setHit(boolean b) { + hit=b; + } + + boolean getHit() { + return hit; + } +} From 458238907ed6d693f791c27cf87f1417c5cf3490 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:09:36 -0400 Subject: [PATCH 14/25] Create FinalProject.pde --- FinalProject.pde | 144 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 FinalProject.pde diff --git a/FinalProject.pde b/FinalProject.pde new file mode 100644 index 0000000..ce08e8c --- /dev/null +++ b/FinalProject.pde @@ -0,0 +1,144 @@ +//Sound files +import processing.sound.*; +SoundFile file; +SoundFile hitsound; +SoundFile mouseClick; +SoundFile robotSound; +Sound volume; + +//Images +PImage robot; +PImage menu; +PImage waveBackground; +PImage help; +PImage modes; +//Board-related items +Board b; +int clickCount; +int score; + +//Background booleans +boolean modeMenu; +boolean gameStart; +boolean helpBool = false; +boolean modesBool = false; +boolean easyMode = false; +boolean finScreen = false; + +void setup() { + size(800, 800); + frameRate(32); + + volume = new Sound(this); + volume.volume(0.05); + //if (b.mute==false){ + file = new SoundFile(this, "bgsound.wav"); + + file.loop(); + + hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); + mouseClick = new SoundFile(this, "Click_Sound.wav"); + robotSound = new SoundFile(this, "Robot_Sound.wav"); + // } + b = new Board(int(random(5, 25))); //Create a new board object of random number of bombs from 5 - 25 + clickCount = 0; + score = 0; + + waveBackground = loadImage("level.png"); + robot = loadImage("Circular_Rotating_Robot.png"); + menu = loadImage("Menu Screen.png"); + help = loadImage("Help_Screen.png"); + modes = loadImage("Gamemodes_Screen.png"); + + modeMenu = true; + gameStart = false; +} +void draw() { + + if (modeMenu) { + setBackground(menu); + if(helpBool){ + setBackground(help); + } + if(modesBool){ + setBackground(modes); + } + } + else if(b.lose){ + //print("lose"); + setBackground(waveBackground); + fill(255); + b.EndScreen(); + } + + else if(easyMode) { + gameStart = true; + + setBackground(waveBackground); + translate(width/2, height/2); + b.displayBoard(robot); + + b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. + if (b.getRemainingBombs() == 0) { + if(b.mute==false){ + robotSound.play(); + } + b.Reset(); + } + } +} + + +void mousePressed() { + println(mouseX," ",mouseY); + if (modeMenu) { + menuOptions(); + } + else if (gameStart) { + if (clickCount < b.bombs.length) { + b.clicked(clickCount, hitsound); + b.collisionCheck(); + clickCount++; + } + } +} + +void setBackground(PImage img) { + background(img); +} + +void menuOptions() { + //START BUTTON -> Goes to modes + if (modesBool==false && mouseX>=248 && mouseX<=550 && mouseY>=360 && mouseY<=430) { + if(b.mute==false){ + mouseClick.play(); + } + + modesBool = true; + println("modesbool",modesBool); + } + //QUIT BUTTON + else if (mouseX>=242 && mouseX<=550 && mouseY>=540 && mouseY<=596) { + if(b.mute==false){ + mouseClick.play(); + } + exit(); + } + else if(mouseX>=242 && mouseX<=555 && mouseY>=456 && mouseY<=520){ + helpBool=true; + } + else if(modesBool==true) { + if(mouseX<=391 && mouseX>=33 && mouseY>=365 &&mouseY<=431){ + easyMode = true; + } + } + if(helpBool==true && mouseX>=240 && mouseX<=524 && mouseY>=678 && mouseY<=735){ + helpBool=false; + } + + if(modesBool==true && easyMode==true){ + modeMenu=false; + + } + //Need one more condition for "HELP" button +} From 3892e5a23a9a1dd001751e15693884e5f81f7b08 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:41:13 -0400 Subject: [PATCH 15/25] Update FinalProject.pde --- FinalProject.pde | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FinalProject.pde b/FinalProject.pde index ce08e8c..eb61ec6 100644 --- a/FinalProject.pde +++ b/FinalProject.pde @@ -71,7 +71,7 @@ void draw() { b.EndScreen(); } - else if(easyMode) { + else { gameStart = true; setBackground(waveBackground); From 2f9ba13444e83c735f8e929f923c49a987ed5d40 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Sat, 8 Apr 2023 02:21:47 -0400 Subject: [PATCH 16/25] Update FinalProject.pde reset and highest score works --- FinalProject.pde | 104 ++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 46 deletions(-) diff --git a/FinalProject.pde b/FinalProject.pde index eb61ec6..56a77c8 100644 --- a/FinalProject.pde +++ b/FinalProject.pde @@ -15,7 +15,7 @@ PImage modes; //Board-related items Board b; int clickCount; -int score; +//int score; //Background booleans boolean modeMenu; @@ -24,25 +24,27 @@ boolean helpBool = false; boolean modesBool = false; boolean easyMode = false; boolean finScreen = false; +boolean endscreen; +boolean tryagain; void setup() { size(800, 800); frameRate(32); - + volume = new Sound(this); volume.volume(0.05); //if (b.mute==false){ file = new SoundFile(this, "bgsound.wav"); - + file.loop(); - + hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); mouseClick = new SoundFile(this, "Click_Sound.wav"); robotSound = new SoundFile(this, "Robot_Sound.wav"); - // } + // } b = new Board(int(random(5, 25))); //Create a new board object of random number of bombs from 5 - 25 - clickCount = 0; - score = 0; + //clickCount = 0; + // score = 0; waveBackground = loadImage("level.png"); robot = loadImage("Circular_Rotating_Robot.png"); @@ -57,21 +59,29 @@ void draw() { if (modeMenu) { setBackground(menu); - if(helpBool){ - setBackground(help); - } - if(modesBool){ - setBackground(modes); - } - } - else if(b.lose){ + if (helpBool) { + setBackground(help); + } + if (modesBool) { + setBackground(modes); + } + } else if (b.lose) { //print("lose"); - setBackground(waveBackground); - fill(255); - b.EndScreen(); - } - - else { + endscreen=true; + + fill(255); + if (endscreen) { + setBackground(waveBackground); + b.EndScreen(); + + if (b.restart) { + modeMenu=true; + modesBool=false; + easyMode=false; + b.ResetAfterLose(); + } + } + } else { gameStart = true; setBackground(waveBackground); @@ -80,9 +90,10 @@ void draw() { b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. if (b.getRemainingBombs() == 0) { - if(b.mute==false){ - robotSound.play(); + if (b.mute==false) { + robotSound.play(); } + b.Reset(); } } @@ -90,17 +101,20 @@ void draw() { void mousePressed() { - println(mouseX," ",mouseY); + println(mouseX, " ", mouseY); if (modeMenu) { menuOptions(); - } - else if (gameStart) { + } else if (gameStart) { if (clickCount < b.bombs.length) { b.clicked(clickCount, hitsound); b.collisionCheck(); clickCount++; } } + if (endscreen==true && mouseX>=277 && mouseX<=447 && mouseY>=691 && mouseY<=740) { + b.restart=true; + // b.lose=false; + } } void setBackground(PImage img) { @@ -109,36 +123,34 @@ void setBackground(PImage img) { void menuOptions() { //START BUTTON -> Goes to modes - if (modesBool==false && mouseX>=248 && mouseX<=550 && mouseY>=360 && mouseY<=430) { - if(b.mute==false){ - mouseClick.play(); + if (modesBool==false && mouseX>=248 && mouseX<=550 && mouseY>=360 && mouseY<=430) { + if (b.mute==false) { + mouseClick.play(); } - + modesBool = true; - println("modesbool",modesBool); - } + println("modesbool", modesBool); + } //QUIT BUTTON else if (mouseX>=242 && mouseX<=550 && mouseY>=540 && mouseY<=596) { - if(b.mute==false){ - mouseClick.play(); + if (b.mute==false) { + mouseClick.play(); } exit(); - } - else if(mouseX>=242 && mouseX<=555 && mouseY>=456 && mouseY<=520){ - helpBool=true; - } - else if(modesBool==true) { - if(mouseX<=391 && mouseX>=33 && mouseY>=365 &&mouseY<=431){ + } else if (mouseX>=242 && mouseX<=555 && mouseY>=456 && mouseY<=520) { + helpBool=true; + } else if (modesBool==true) { + if (mouseX<=391 && mouseX>=33 && mouseY>=365 &&mouseY<=431) { easyMode = true; } } - if(helpBool==true && mouseX>=240 && mouseX<=524 && mouseY>=678 && mouseY<=735){ - helpBool=false; + + if (helpBool==true && mouseX>=240 && mouseX<=524 && mouseY>=678 && mouseY<=735) { + helpBool=false; } - - if(modesBool==true && easyMode==true){ - modeMenu=false; - + + if (modesBool==true && easyMode==true) { + modeMenu=false; } //Need one more condition for "HELP" button } From 544b5b5620d77500908c27f9eafc197d8c8cdab6 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Sat, 8 Apr 2023 02:22:33 -0400 Subject: [PATCH 17/25] Update Board.pde updates highscore --- Board.pde | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/Board.pde b/Board.pde index 9e985bb..353bc75 100644 --- a/Board.pde +++ b/Board.pde @@ -2,6 +2,8 @@ class Board { Bomb[] bombs; int score; + int finalscore; + int highestscore; boolean clear; String diff; int remainingBombs; @@ -10,6 +12,7 @@ class Board { float robotSpeed = random(0.025, 0.075); boolean lose = false; boolean mute = false; + boolean restart; //Constructor Board(int swordCount) { @@ -54,6 +57,7 @@ class Board { } void Reset() { + b.clear = true; clickCount = 0; wave++; @@ -65,6 +69,26 @@ class Board { for (int i=0; i < swordCount; i++) bombs[i]=new Bomb(robotSpeed); } + void ResetAfterLose() { + lose=false; + /* + finalscore = score; + if(highestscore < finalscore){ + highestscore= finalscore; + }*/ + score=0; + clear = true; + clickCount = 0; + wave=1; + restart=false; + //clear = false; + robotSpeed = random(0.025, 0.075); + // println("Robot Speed: " + robotSpeed); + int swordCount = int (random(7, 15)); + bombs = new Bomb[swordCount]; + for (int i=0; i < swordCount; i++) + bombs[i]=new Bomb(robotSpeed); + } void clicked(int c, SoundFile hit) { @@ -82,14 +106,14 @@ class Board { for (int i = 0; i < bombs.length; i++) { if (bombs[clickCount].getHit() && bombs[i].getHit() && (i != clickCount)) { - System.out.println("Current sword placed coordinates: X - " + bombs[clickCount].x + ", Y - " + bombs[clickCount].y); - System.out.println("Checking sword at i: X - " + bombs[i].x + ", Y - " + bombs[i].y); - System.out.println("Distance: " + dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)); + // System.out.println("Current sword placed coordinates: X - " + bombs[clickCount].x + ", Y - " + bombs[clickCount].y); + // System.out.println("Checking sword at i: X - " + bombs[i].x + ", Y - " + bombs[i].y); + //System.out.println("Distance: " + dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)); if (collided(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)) { /*Lose condition*/ - println("COLLIDED!"); + // println("COLLIDED!"); lose = true; clear = true; } @@ -99,7 +123,7 @@ class Board { boolean collided(float x1, float y1, float x2, float y2) { if (dist(x1, y1, x2, y2) <= 36) { - println("COLLIDED!"); + // println("COLLIDED!"); return true; } return false; @@ -130,6 +154,10 @@ class Board { text(wave, x6, -260); } void EndScreen(){ + finalscore = score; + if(highestscore < finalscore){ + highestscore= finalscore; + } //translate(width/2,height/2); PFont end; end = createFont("Architype_Font.otf", 128); @@ -144,9 +172,17 @@ class Board { text("FINAL SCORE: ", 220, 350); text( " "+score, 480, 350); text("WAVES COMPLETED: ", 220, 450); - text( " "+wave, 600, 450); + text( " "+(wave-1), 600, 450); text("HIGHEST SCORE: ", 220, 550); + if(highestscore!=0){ + text( " "+highestscore, 520, 550); + } + else{ text( " "+score, 520, 550); + } + + // rect(277,691,170,40); + text("TRY AGAIN",277,730); } } From 1b568622cff6cddb848507bd0fe6cb092dfb304b Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Sat, 8 Apr 2023 02:30:18 -0400 Subject: [PATCH 18/25] Update FinalProject.pde gamemodes back button, restart game, highest score updates --- FinalProject.pde | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/FinalProject.pde b/FinalProject.pde index 56a77c8..0a07e69 100644 --- a/FinalProject.pde +++ b/FinalProject.pde @@ -148,7 +148,10 @@ void menuOptions() { if (helpBool==true && mouseX>=240 && mouseX<=524 && mouseY>=678 && mouseY<=735) { helpBool=false; } - + if (modesBool==true && mouseX>=271 && mouseX<=556 && mouseY>=474 && mouseY<=521) { + modesBool=false; + helpBool=false; + } if (modesBool==true && easyMode==true) { modeMenu=false; } From 7d78f81c6df7541e87061dbdb453e079ed2e7aca Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:30:05 -0400 Subject: [PATCH 19/25] Update Board.pde --- Board.pde | 135 ++++++++++++++++++++++++++---------------------------- 1 file changed, 65 insertions(+), 70 deletions(-) diff --git a/Board.pde b/Board.pde index 353bc75..d854f01 100644 --- a/Board.pde +++ b/Board.pde @@ -1,21 +1,29 @@ - class Board { Bomb[] bombs; - int score; + //int score; + boolean clear; + String difficulty; + + //int score; int finalscore; int highestscore; - boolean clear; - String diff; + + int swordCount; + float robotSpeed; + int remainingBombs; int wave = 1; float robotAngle = PI/4; - float robotSpeed = random(0.025, 0.075); + //float robotSpeed = random(0.025, 0.075); + boolean lose = false; boolean mute = false; - boolean restart; + //boolean restart; //Constructor - Board(int swordCount) { + Board(int _swordCount, float _robotSpeed) { + swordCount = _swordCount; + robotSpeed = _robotSpeed; bombs = new Bomb[swordCount]; score = 0; clear = false; @@ -26,9 +34,8 @@ class Board { //Displays board void displayBoard(PImage img) { - PFont mono; - mono = createFont("Architype_Font.otf", 128); - textFont(mono); + PFont f = createFont("Architype Font.otf", 128); + textFont(f); pushMatrix(); rotate(robotAngle); imageMode(CENTER); @@ -40,14 +47,13 @@ class Board { remainingBombs = Math.max(0, remainingBombs); //Extra backround - //fill(48, 67, 186); fill(17, 10, 97); - //fill(40, 48, 97); boardText(-377, -172, 123, 313, -70, 55); fill(255); boardText(-380, -175, 120, 310, -75, 50); } + //Bomb Placement void placeBomb() { //Need to check if previous sword has hit the robot. If it has, you can place a new sword. for (int i=0; i < bombs.length; i++) { @@ -56,13 +62,19 @@ class Board { } } - void Reset() { - - b.clear = true; + //Reset board for next level + void ResetNextLevel() { + clear = true; clickCount = 0; wave++; clear = false; - robotSpeed = random(0.025, 0.075); + if (easyMode) { + robotSpeed = random(0.025, 0.075); + } + else if (hardMode) { + robotSpeed = random(0.076, 0.1); + } + //robotSpeed = random(0.025, 0.075); println("Robot Speed: " + robotSpeed); int swordCount = int (random(7, 15)); bombs = new Bomb[swordCount]; @@ -80,40 +92,37 @@ class Board { clear = true; clickCount = 0; wave=1; - restart=false; + //restart=false; //clear = false; - robotSpeed = random(0.025, 0.075); + //robotSpeed = random(0.025, 0.075); // println("Robot Speed: " + robotSpeed); + if (easyMode) { + robotSpeed = random(0.025, 0.075); + } + else if (hardMode) { + robotSpeed = random(0.076, 0.1); + } int swordCount = int (random(7, 15)); bombs = new Bomb[swordCount]; for (int i=0; i < swordCount; i++) bombs[i]=new Bomb(robotSpeed); } - void clicked(int c, SoundFile hit) { + fill(0); bombs[c].shoot(); - //Temporary score counter for now; need to first check for collisions. - if(mute==false){ - hit.play(); - } - if(lose==false){ - score+=1; - } + if (!mute) + // hit.play(); + if (!lose) + score+=1; } +/*Lose condition*/ void collisionCheck() { for (int i = 0; i < bombs.length; i++) { if (bombs[clickCount].getHit() && bombs[i].getHit() && (i != clickCount)) { - - // System.out.println("Current sword placed coordinates: X - " + bombs[clickCount].x + ", Y - " + bombs[clickCount].y); - // System.out.println("Checking sword at i: X - " + bombs[i].x + ", Y - " + bombs[i].y); - //System.out.println("Distance: " + dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)); - - - if (collided(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y)) { - /*Lose condition*/ - // println("COLLIDED!"); + if (dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y) <=40) { + println("COLLIDED!"); lose = true; clear = true; } @@ -121,64 +130,50 @@ class Board { } } - boolean collided(float x1, float y1, float x2, float y2) { - if (dist(x1, y1, x2, y2) <= 36) { - // println("COLLIDED!"); - return true; - } - return false; - } - - - int getRemainingBombs() { - return remainingBombs; - } - - int getScore() { - return score; - } - - void SetDifficulty(String difficulty) { - diff=difficulty; - } - - void boardText(int x1, int x2, int x3, int x4, int x5, int x6) { + void boardText(int x1, int x2, int x3, int x4, int x5, int x6/*, int x7, int x8*/) { textSize(25); text("REMAINING BOMBS: ", x1, -360); text(" " + remainingBombs, x2, -360); text("CURRENT SCORE: ", x3, -360); text(" " + score, x4, -360); + + //textSize(20); + //text("HIGH SCORE: ", x5, -340); + //text(" " , highScore); textSize(40); - text("WAVE ", x5, -260); - text(wave, x6, -260); + text("WAVE ", x5, -260); //Change to x7 + text(wave, x6, -260); //Change to x8 } - void EndScreen(){ +void EndScreen(PImage p){ + background(p); finalscore = score; if(highestscore < finalscore){ highestscore= finalscore; } //translate(width/2,height/2); PFont end; - end = createFont("Architype_Font.otf", 128); + end = createFont("Architype Font.otf", 128); textFont(end); //print("end"); textSize(90); - text("GAME OVER! ", 180, 160); + // text("GAME OVER! ", -90, 160); // text( score, 100, 260); - textSize(40); + textSize(90); fill(255); // fill(17, 10, 97); - text("FINAL SCORE: ", 220, 350); - text( " "+score, 480, 350); - text("WAVES COMPLETED: ", 220, 450); - text( " "+(wave-1), 600, 450); - text("HIGHEST SCORE: ", 220, 550); + //text("FINAL SCORE: ", 220, 350); + text( " "+score, -55, 15); + textSize(30); + text( " "+score, 30, 140); + //text("WAVES COMPLETED: ", 220, 450); + text( " "+(wave-1), 30, 185); + //text("HIGHEST SCORE: ", 220, 550); if(highestscore!=0){ - text( " "+highestscore, 520, 550); + text( " "+highestscore, 30, 235); } else{ - text( " "+score, 520, 550); + text( " "+score, 30, 235); } // rect(277,691,170,40); From cb123a521dff8b67c6a7513cc6c8077fe3845d49 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:30:57 -0400 Subject: [PATCH 20/25] Update FinalProject.pde --- FinalProject.pde | 224 ++++++++++++++++++++++++++--------------------- 1 file changed, 126 insertions(+), 98 deletions(-) diff --git a/FinalProject.pde b/FinalProject.pde index 0a07e69..88adec2 100644 --- a/FinalProject.pde +++ b/FinalProject.pde @@ -8,23 +8,30 @@ Sound volume; //Images PImage robot; -PImage menu; +PImage menuScreen; PImage waveBackground; -PImage help; -PImage modes; +PImage helpScreen; +PImage modesScreen; +PImage endScreen; + //Board-related items -Board b; +Modes easy = new Modes("easy"); +Modes hard = new Modes("hard"); +//Board b; int clickCount; -//int score; +int score; + +int easyHighScore; +int hardHighScore; //Background booleans boolean modeMenu; +boolean gameModes; boolean gameStart; -boolean helpBool = false; -boolean modesBool = false; -boolean easyMode = false; -boolean finScreen = false; -boolean endscreen; +boolean help; +boolean easyMode; +boolean hardMode; +boolean endingScreen; boolean tryagain; void setup() { @@ -33,87 +40,90 @@ void setup() { volume = new Sound(this); volume.volume(0.05); - //if (b.mute==false){ - file = new SoundFile(this, "bgsound.wav"); - + file = new SoundFile(this, "AVA Background Music.wav"); file.loop(); + hitsound = new SoundFile(this, "Hard Hit Sound.mp3"); + mouseClick = new SoundFile(this, "Click Sound.wav"); + robotSound = new SoundFile(this, "Robot Sound.wav"); - hitsound = new SoundFile(this, "Hard_Hit_Sound_Effect.mp3"); - mouseClick = new SoundFile(this, "Click_Sound.wav"); - robotSound = new SoundFile(this, "Robot_Sound.wav"); - // } - b = new Board(int(random(5, 25))); //Create a new board object of random number of bombs from 5 - 25 - //clickCount = 0; - // score = 0; + //b = new Board(int(random(7, 15))); //Create a new board object of random number of bombs from 5 - 25 + clickCount = 0; + score = 0; + + waveBackground = loadImage("Level Background.png"); + robot = loadImage("Circular Rotating Robot.png"); + menuScreen = loadImage("Menu Screen.png"); + helpScreen = loadImage("Help Screen.png"); + modesScreen = loadImage("Gamemodes Screen.png"); + endScreen = loadImage("End Screen.png"); - waveBackground = loadImage("level.png"); - robot = loadImage("Circular_Rotating_Robot.png"); - menu = loadImage("Menu Screen.png"); - help = loadImage("Help_Screen.png"); - modes = loadImage("Gamemodes_Screen.png"); modeMenu = true; gameStart = false; + gameModes = false; + help = false; + easyMode = false; + hardMode = false; } void draw() { - if (modeMenu) { - setBackground(menu); - if (helpBool) { - setBackground(help); - } - if (modesBool) { - setBackground(modes); - } - } else if (b.lose) { - //print("lose"); - endscreen=true; - - fill(255); - if (endscreen) { - setBackground(waveBackground); - b.EndScreen(); - - if (b.restart) { - modeMenu=true; - modesBool=false; - easyMode=false; - b.ResetAfterLose(); - } - } - } else { + setBackground(menuScreen); + } + else if (help) { + setBackground(helpScreen); + } + else if (gameModes) { + setBackground(modesScreen); + } + else if (easyMode) { gameStart = true; setBackground(waveBackground); translate(width/2, height/2); - b.displayBoard(robot); - - b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. - if (b.getRemainingBombs() == 0) { - if (b.mute==false) { - robotSound.play(); - } - - b.Reset(); - } + easy.runningGame(robot, waveBackground); + //b.displayBoard(robot); + + //b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. + //if (b.remainingBombs == 0) { + // robotSound.play(); + // b.ResetNextLevel(); + //} + //else if (b.lose) { + // setBackground(waveBackground); + // b.EndScreen(); + // gameStart = false; + //} + } + else if (hardMode) { + gameStart = true; + setBackground(waveBackground); + translate(width/2, height/2); + hard.runningGame(robot, waveBackground); } } void mousePressed() { - println(mouseX, " ", mouseY); - if (modeMenu) { - menuOptions(); - } else if (gameStart) { - if (clickCount < b.bombs.length) { - b.clicked(clickCount, hitsound); - b.collisionCheck(); - clickCount++; - } + println(mouseX,mouseY); + //If the game has started, keep track of click count and number of bombs + if (gameStart && easyMode) { + easy.clickCountCheck(); } - if (endscreen==true && mouseX>=277 && mouseX<=447 && mouseY>=691 && mouseY<=740) { - b.restart=true; + else if (gameStart && hardMode) { + hard.clickCountCheck(); + } + else if (endingScreen==true && mouseX>=277 && mouseX<=447 && mouseY>=691 && mouseY<=740) { + if(easyMode){ + easy.restart=true; + println("restart", easy.restart); + } // b.lose=false; + else if (hardMode){ + hard.restart=true; + } + } + else { + options(); } } @@ -121,39 +131,57 @@ void setBackground(PImage img) { background(img); } -void menuOptions() { - //START BUTTON -> Goes to modes - if (modesBool==false && mouseX>=248 && mouseX<=550 && mouseY>=360 && mouseY<=430) { - if (b.mute==false) { +void options() { + if (modeMenu) { + //START BUTTON -> Goes to modes + if (mouseX>=248 && mouseX<=550 && mouseY>=360 && mouseY<=430) { mouseClick.play(); + modeMenu=false; + gameModes = true; } - - modesBool = true; - println("modesbool", modesBool); - } - //QUIT BUTTON - else if (mouseX>=242 && mouseX<=550 && mouseY>=540 && mouseY<=596) { - if (b.mute==false) { + //HELP BUTTON + else if (mouseX>=242 && mouseX<=555 && mouseY>=456 && mouseY<=520) { mouseClick.play(); + modeMenu = false; + gameModes = false; + help=true; } - exit(); - } else if (mouseX>=242 && mouseX<=555 && mouseY>=456 && mouseY<=520) { - helpBool=true; - } else if (modesBool==true) { + //QUIT BUTTON + else if (mouseX>=242 && mouseX<=550 && mouseY>=540 && mouseY<=596) { + mouseClick.play(); + exit(); + } + } + else if (gameModes) { + //EASY BUTTON if (mouseX<=391 && mouseX>=33 && mouseY>=365 &&mouseY<=431) { + mouseClick.play(); + modeMenu = false; + gameModes = false; easyMode = true; + hardMode = false; + } + //HARD BUTTON + else if (mouseX <=780 && mouseX >=416 && mouseY >=365 &&mouseY <=431) { + mouseClick.play(); + modeMenu = false; + gameModes = false; + easyMode = false; + hardMode = true; + } + //BACK BUTTON + else if (mouseX>=271 && mouseX<=550 && mouseY>=470 && mouseY<=525) { + mouseClick.play(); + gameModes = false; + modeMenu = true; + } + } + else if (help) { + //BACK BUTTON + if (mouseX>=240 && mouseX<=524 && mouseY>=678 && mouseY<=735) { + mouseClick.play(); + help=false; + modeMenu = true; } } - - if (helpBool==true && mouseX>=240 && mouseX<=524 && mouseY>=678 && mouseY<=735) { - helpBool=false; - } - if (modesBool==true && mouseX>=271 && mouseX<=556 && mouseY>=474 && mouseY<=521) { - modesBool=false; - helpBool=false; - } - if (modesBool==true && easyMode==true) { - modeMenu=false; - } - //Need one more condition for "HELP" button } From ad4ce9f102e8d3554bc93bdc25d3250276e59335 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:32:49 -0400 Subject: [PATCH 21/25] Create Modes.pde --- Modes.pde | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Modes.pde diff --git a/Modes.pde b/Modes.pde new file mode 100644 index 0000000..546ec19 --- /dev/null +++ b/Modes.pde @@ -0,0 +1,51 @@ +class Modes { + int highScore = 0; + Board b; + boolean easy; + boolean hard; + boolean restart; + Modes(String mode) { + if (mode == "easy") { + easy = true; + hard = false; + b = new Board((int(random(7, 15))), random(0.025, 0.075)); + } + else if (mode == "hard") { + easy = false; + hard = true; + b = new Board((int(random(20, 30))), random(0.076, 0.1)); + } + } + + void runningGame(PImage robot, PImage loseBackground) { + b.displayBoard(robot); + println("Robot Speed: " + b.robotSpeed); + + b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. + if (b.remainingBombs == 0) { + robotSound.play(); + b.ResetNextLevel(); + } + else if (b.lose) { + // background(loseBackground); + endingScreen=true; + b.EndScreen(endScreen); + gameStart = false; + if(restart==true){ + modeMenu=true; + gameModes=false; + easyMode=false; + b.ResetAfterLose(); + restart=false; + } + } + } + + void clickCountCheck() { + if (clickCount < b.bombs.length) { + b.clicked(clickCount, hitsound); + b.collisionCheck(); + clickCount++; + } + } +} From 767c01ba5f2469f021ddb48129ddf9175598ee70 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:01:20 -0400 Subject: [PATCH 22/25] Update FinalProject.pde --- FinalProject.pde | 89 ++++++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/FinalProject.pde b/FinalProject.pde index 88adec2..297161e 100644 --- a/FinalProject.pde +++ b/FinalProject.pde @@ -4,15 +4,26 @@ SoundFile file; SoundFile hitsound; SoundFile mouseClick; SoundFile robotSound; +SoundFile laserSound; +SoundFile explosionSound; Sound volume; //Images -PImage robot; +PImage easyRobot; +PImage hardRobot; PImage menuScreen; PImage waveBackground; PImage helpScreen; PImage modesScreen; -PImage endScreen; +PImage hardEndScreen; +PImage easyEndScreen; +PImage[] waves = new PImage[6]; +PImage waveBackdrop1; +PImage waveBackdrop2; +PImage waveBackdrop3; +PImage waveBackdrop4; +PImage waveBackdrop5; +PImage waveBackdrop6; //Board-related items Modes easy = new Modes("easy"); @@ -31,8 +42,11 @@ boolean gameStart; boolean help; boolean easyMode; boolean hardMode; -boolean endingScreen; -boolean tryagain; +boolean gameEnd; + +//Miscellaneous +int index; +boolean firstDisplayed = false; void setup() { size(800, 800); @@ -45,25 +59,43 @@ void setup() { hitsound = new SoundFile(this, "Hard Hit Sound.mp3"); mouseClick = new SoundFile(this, "Click Sound.wav"); robotSound = new SoundFile(this, "Robot Sound.wav"); + laserSound = new SoundFile(this, "Laser Sound.wav"); + explosionSound = new SoundFile(this, "Explosion Sound.wav"); //b = new Board(int(random(7, 15))); //Create a new board object of random number of bombs from 5 - 25 clickCount = 0; score = 0; - waveBackground = loadImage("Level Background.png"); - robot = loadImage("Circular Rotating Robot.png"); + easyRobot = loadImage("Easy Robot.png"); + hardRobot = loadImage("Hard Robot.png"); menuScreen = loadImage("Menu Screen.png"); helpScreen = loadImage("Help Screen.png"); modesScreen = loadImage("Gamemodes Screen.png"); - endScreen = loadImage("End Screen.png"); - - + easyEndScreen = loadImage("Easy End Screen.png"); + hardEndScreen = loadImage("Hard End Screen.png"); + waveBackdrop1 = loadImage("Level Backdrop 1.png"); + waveBackdrop2 = loadImage("Level Backdrop 2.png"); + waveBackdrop3 = loadImage("Level Backdrop 3.png"); + waveBackdrop4 = loadImage("Level Backdrop 4.png"); + waveBackdrop4 = loadImage("Level Backdrop 5.png"); + waveBackdrop5 = loadImage("Level Backdrop 6.png"); + + waves[0] = waveBackdrop1; + waves[1] = waveBackdrop2; + waves[2] = waveBackdrop3; + waves[3] = waveBackdrop4; + waves[4] = waveBackdrop5; + waves[5] = waveBackdrop6; + + modeMenu = true; gameStart = false; gameModes = false; help = false; easyMode = false; hardMode = false; + + index = (int) random(0, 5); } void draw() { if (modeMenu) { @@ -77,34 +109,22 @@ void draw() { } else if (easyMode) { gameStart = true; - - setBackground(waveBackground); + setBackground(waves[index]); translate(width/2, height/2); - easy.runningGame(robot, waveBackground); - //b.displayBoard(robot); - - //b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. - //if (b.remainingBombs == 0) { - // robotSound.play(); - // b.ResetNextLevel(); - //} - //else if (b.lose) { - // setBackground(waveBackground); - // b.EndScreen(); - // gameStart = false; - //} + easy.runningGame(easyRobot); } else if (hardMode) { gameStart = true; - setBackground(waveBackground); + setBackground(waves[index]); translate(width/2, height/2); - hard.runningGame(robot, waveBackground); + hard.runningGame(hardRobot); } } - +/*This functions deals with user interaction, and calls the respective +Modes objects and its functions depending on whether the user selects easy or hard node. +*/ void mousePressed() { - println(mouseX,mouseY); //If the game has started, keep track of click count and number of bombs if (gameStart && easyMode) { easy.clickCountCheck(); @@ -112,14 +132,13 @@ void mousePressed() { else if (gameStart && hardMode) { hard.clickCountCheck(); } - else if (endingScreen==true && mouseX>=277 && mouseX<=447 && mouseY>=691 && mouseY<=740) { + else if (gameEnd==true && mouseX>=277 && mouseX<=447 && mouseY>=691 && mouseY<=740) { + mouseClick.play(); if(easyMode){ - easy.restart=true; - println("restart", easy.restart); + easy.restart=true; } - // b.lose=false; else if (hardMode){ - hard.restart=true; + hard.restart=true; } } else { @@ -131,6 +150,8 @@ void setBackground(PImage img) { background(img); } +/*This function controls the menu functionality with the use of booleans. The specific coordinates of buttons trigger +the changing the state of the respective booleans which will then trigger functionality such as background change, game reset, etc*/ void options() { if (modeMenu) { //START BUTTON -> Goes to modes @@ -162,7 +183,7 @@ void options() { hardMode = false; } //HARD BUTTON - else if (mouseX <=780 && mouseX >=416 && mouseY >=365 &&mouseY <=431) { + else if (mouseX <=780 && mouseX >=416 && mouseY >=365 && mouseY <=431) { mouseClick.play(); modeMenu = false; gameModes = false; From b96b6799f4c42c587dc9a3c398d46cb4001e2d44 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:02:06 -0400 Subject: [PATCH 23/25] Update Board.pde --- Board.pde | 146 +++++++++++++++++++++++++++--------------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/Board.pde b/Board.pde index d854f01..7ac46f6 100644 --- a/Board.pde +++ b/Board.pde @@ -4,35 +4,36 @@ class Board { boolean clear; String difficulty; - //int score; - int finalscore; - int highestscore; - - int swordCount; + int finalScore; + int highScore; + + int bombCount; float robotSpeed; - + int remainingBombs; int wave = 1; float robotAngle = PI/4; - //float robotSpeed = random(0.025, 0.075); - + boolean lose = false; boolean mute = false; - //boolean restart; //Constructor - Board(int _swordCount, float _robotSpeed) { - swordCount = _swordCount; + /*Constructor parameters accept randomly generated values for number of bombs and robot speed, + and uses those values to make a new array of bombs and set their speed */ + Board(int _bombCount, float _robotSpeed) { + bombCount = _bombCount; robotSpeed = _robotSpeed; - bombs = new Bomb[swordCount]; + bombs = new Bomb[bombCount]; score = 0; clear = false; - for (int i=0; i < swordCount; i++) + for (int i=0; i < bombCount; i++) bombs[i]=new Bomb(robotSpeed); } //Displays board + /*This function takes in the board image as a parameter and rotates it according to the robot speed, + it also calculates the stats of the game and calls the function which displays them*/ void displayBoard(PImage img) { PFont f = createFont("Architype Font.otf", 128); textFont(f); @@ -49,20 +50,25 @@ class Board { //Extra backround fill(17, 10, 97); boardText(-377, -172, 123, 313, -70, 55); - fill(255); + fill(255); //Fill color of bomb boardText(-380, -175, 120, 310, -75, 50); } //Bomb Placement + /*This function controls the color of the bombs, and determines which bombs have hit the board and thus need to be rotated*/ void placeBomb() { - //Need to check if previous sword has hit the robot. If it has, you can place a new sword. + fill(158, 9, 146); + for (int i=0; i < bombs.length; i++) { if (bombs[i].getHit()) bombs[i].rotateBomb(); + fill(158, 9, 146); } } //Reset board for next level + /*This is a reset function for each wave, it determines a new robot speed, + a new background, makes a new array of bombs, and increments the wave*/ void ResetNextLevel() { clear = true; clickCount = 0; @@ -70,58 +76,59 @@ class Board { clear = false; if (easyMode) { robotSpeed = random(0.025, 0.075); + } else if (hardMode) { + robotSpeed = random(-0.076, 0.1); } - else if (hardMode) { - robotSpeed = random(0.076, 0.1); - } + + index = (int) random(0, 5); + background(waves[index]); //robotSpeed = random(0.025, 0.075); println("Robot Speed: " + robotSpeed); - int swordCount = int (random(7, 15)); - bombs = new Bomb[swordCount]; - for (int i=0; i < swordCount; i++) + int bombCount = int (random(7, 15)); + bombs = new Bomb[bombCount]; + for (int i=0; i < bombCount; i++) bombs[i]=new Bomb(robotSpeed); } +/*This is the reset function for the whole game, and is called if the game is lost. +It resets the stats, makes a new robot speed, and a new array of bombs*/ void ResetAfterLose() { lose=false; - /* - finalscore = score; - if(highestscore < finalscore){ - highestscore= finalscore; - }*/ score=0; clear = true; clickCount = 0; wave=1; - //restart=false; - //clear = false; - //robotSpeed = random(0.025, 0.075); - // println("Robot Speed: " + robotSpeed); - if (easyMode) { + if (easyMode) { + bombCount = int (random(7, 15)); robotSpeed = random(0.025, 0.075); + } else if (hardMode) { + bombCount = int (random(10, 30)); + robotSpeed = random(-0.076, 0.1); } - else if (hardMode) { - robotSpeed = random(0.076, 0.1); - } - int swordCount = int (random(7, 15)); - bombs = new Bomb[swordCount]; - for (int i=0; i < swordCount; i++) + bombs = new Bomb[bombCount]; + for (int i=0; i < bombCount; i++) bombs[i]=new Bomb(robotSpeed); } +/*The score is incremented within this function, along with the clicking sound. +Additionally, the shoot function is called here, which controls the movement of the bomb until it reaches the board*/ void clicked(int c, SoundFile hit) { - fill(0); bombs[c].shoot(); if (!mute) - // hit.play(); + hit.play(); if (!lose) - score+=1; + if (easyMode) + score+=1; + else if (hardMode) + score+=2; } -/*Lose condition*/ + /*Lose condition*/ + /*Check if a collision occured between two bombs by taking into account the distance between them. + If the distance is less than 36 (radius+stroke of two circles), the lose condition is set to true*/ void collisionCheck() { for (int i = 0; i < bombs.length; i++) { if (bombs[clickCount].getHit() && bombs[i].getHit() && (i != clickCount)) { - if (dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y) <=40) { + if (dist(bombs[i].x, bombs[i].y, bombs[clickCount].x, bombs[clickCount].y) <= 36) { println("COLLIDED!"); lose = true; clear = true; @@ -129,55 +136,48 @@ class Board { } } } - +/*Formatting the text for the stats, such as coordinates and text size*/ void boardText(int x1, int x2, int x3, int x4, int x5, int x6/*, int x7, int x8*/) { textSize(25); text("REMAINING BOMBS: ", x1, -360); text(" " + remainingBombs, x2, -360); text("CURRENT SCORE: ", x3, -360); text(" " + score, x4, -360); - - //textSize(20); - //text("HIGH SCORE: ", x5, -340); - //text(" " , highScore); textSize(40); text("WAVE ", x5, -260); //Change to x7 text(wave, x6, -260); //Change to x8 } -void EndScreen(PImage p){ - background(p); - finalscore = score; - if(highestscore < finalscore){ - highestscore= finalscore; +/*This function takes in an image as a parameter to set the image for the endscreen. +The highscore is calculated, and formatting is done to show the text for the stats such as text size, and coordinates*/ + void displayEndScreen(PImage p) { + background(p); + finalScore = score; + if (highScore < finalScore) { + highScore = finalScore; } - //translate(width/2,height/2); - PFont end; + PFont end; end = createFont("Architype Font.otf", 128); textFont(end); - //print("end"); textSize(90); - // text("GAME OVER! ", -90, 160); - // text( score, 100, 260); - textSize(90); fill(255); - // fill(17, 10, 97); - //text("FINAL SCORE: ", 220, 350); - text( " "+score, -55, 15); - textSize(30); - text( " "+score, 30, 140); - //text("WAVES COMPLETED: ", 220, 450); - text( " "+(wave-1), 30, 185); - //text("HIGHEST SCORE: ", 220, 550); - if(highestscore!=0){ - text( " "+highestscore, 30, 235); + //Bombs placed + if (easyMode) { + text( " " + score, -75, 15); } - else{ - text( " "+score, 30, 235); + else if (hardMode) { + text( " " + score/2, -75, 15); } + textSize(30); + //Total Score + text( " "+ score, 30, 140); + text( " "+ (wave-1), 30, 185); - // rect(277,691,170,40); - text("TRY AGAIN",277,730); - + if (highScore!=0) { + text( " " + highScore, 30, 235); + } + else { + text( " " + score, 30, 235); + } } } From 2aaa144b0543c995d5aa3fa5f5fd83670df09f4b Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:02:46 -0400 Subject: [PATCH 24/25] Update Modes.pde --- Modes.pde | 56 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/Modes.pde b/Modes.pde index 546ec19..4e609d6 100644 --- a/Modes.pde +++ b/Modes.pde @@ -1,9 +1,14 @@ class Modes { - int highScore = 0; + int easyHighScore = 0; + int hardHighScore; Board b; boolean easy; boolean hard; boolean restart; + boolean explosionPlayed = false; +/*Constructor takes in the mode as a parameter. +Based on that, it sets the easy or hard booleans for the board and makes a new board object with a randomized number of bombs and robot speed, +if the mode is hard, the number of bombs and robot speed is significantly higher.*/ Modes(String mode) { if (mode == "easy") { easy = true; @@ -13,34 +18,51 @@ class Modes { else if (mode == "hard") { easy = false; hard = true; - b = new Board((int(random(20, 30))), random(0.076, 0.1)); + b = new Board((int(random(10, 30))), random(0.076, 0.1)); } } - - void runningGame(PImage robot, PImage loseBackground) { +/*This function is called when the game starts. It displays the board along with rotation, places the bombs that have been shot, +checks whether the game is in a win or lose state, and continues or restarts the game based on those booleans*/ + void runningGame(PImage robot) { b.displayBoard(robot); println("Robot Speed: " + b.robotSpeed); b.placeBomb(); //Goes through array and checks if a bomb has not been placed at the current index. - if (b.remainingBombs == 0) { + if (b.remainingBombs == 0 && easy) { robotSound.play(); b.ResetNextLevel(); - } + } + else if (b.remainingBombs == 0 && hard) { + laserSound.play(); + b.ResetNextLevel(); + } else if (b.lose) { - // background(loseBackground); - endingScreen=true; - b.EndScreen(endScreen); + if (!explosionPlayed) { + explosionSound.play(); + } + + explosionPlayed = true; + gameEnd = true; + if (easy){ + b.displayEndScreen(easyEndScreen); + } + else if (hard){ + b.displayEndScreen(hardEndScreen); + } gameStart = false; - if(restart==true){ - modeMenu=true; - gameModes=false; - easyMode=false; - b.ResetAfterLose(); - restart=false; + + if (restart) { + modeMenu= true; + gameModes = false; + easyMode= false; + help = false; + b.ResetAfterLose(); + restart=false; + explosionPlayed = false; } - } + } } - +/*Increments clickcount while there are bombs left, checks for collisions, and calls clicked which has shooting and user interaction functionality*/ void clickCountCheck() { if (clickCount < b.bombs.length) { b.clicked(clickCount, hitsound); From ac9b15e92ba9aa95ae8ba3dfa9169f24aa36ac96 Mon Sep 17 00:00:00 2001 From: AayeshaIslam <92817486+AayeshaIslam@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:03:29 -0400 Subject: [PATCH 25/25] Update Sword.pde --- Sword.pde | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Sword.pde b/Sword.pde index 9efe127..9ee9cea 100644 --- a/Sword.pde +++ b/Sword.pde @@ -7,31 +7,33 @@ class Bomb { float x = 0; float y = 200; +/*Constructor takes in rotation speed as a parameter*/ Bomb(float tempCircleSpeed) { shootSpeed = 20; pos = 350; hit = false; - circleSpeed = (tempCircleSpeed)/2.0; //somehow worked lol + circleSpeed = (tempCircleSpeed)/2.0; } - - void shoot() { //Might also need shoot sound effect +/*Draws and Controls movement of each bomb from when it is first shor until +it reaches the board and sets the corresponding booleans*/ + void shoot() { while (pos >= 200) { strokeWeight(3); stroke(255, 187, 51); //Outline of bomb - //fill(0, 255, 255); //Bomb color - fill(0); + + fill(158, 9, 146); ellipse(0, pos, 30, 30); pos -= shootSpeed; } setHit(true); } - +/*Rotates the bombs with the board by Rotating coordinates to coordinates with respect to the entire screen*/ void rotateBomb() { pushMatrix(); translate(width/2, height/2); rotate(circleAngle); popMatrix(); - + //200 is the robot radius float tempX = 200 * cos(circleAngle); float tempY = 200 * sin(circleAngle); @@ -44,7 +46,7 @@ class Bomb { ellipse(x, y, 30, 30); circleAngle += circleSpeed; } - +/*Setter and getter for the hit boolean of each bomb*/ void setHit(boolean b) { hit=b; }