diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 21596dc..d17ac35 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,7 +5,9 @@
-
+
+
+
@@ -44,9 +46,9 @@
"Application.GameLoop.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
- "git-widget-placeholder": "main",
+ "git-widget-placeholder": "TEST",
"kotlin-language-version-configured": "true",
- "last_opened_file_path": "C:/浏览器下载/2024-group-7-1.0",
+ "last_opened_file_path": "/Users/zilouli/Engineering Project Game/2024-group-7",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
@@ -118,7 +120,11 @@
-
+
+
+
+
+
@@ -148,6 +154,15 @@
+
+
+
+ file://$PROJECT_DIR$/Code/src/main/java/org/example/BreakableRock.java
+ 82
+
+
+
+
diff --git a/Code/src/main/java/org/example/Bomb.java b/Code/src/main/java/org/example/Bomb.java
index 737b718..c3dfa3b 100644
--- a/Code/src/main/java/org/example/Bomb.java
+++ b/Code/src/main/java/org/example/Bomb.java
@@ -2,6 +2,7 @@
import processing.core.PApplet;
import processing.core.PImage;
+import java.util.ArrayList;
import java.util.Iterator;
public class Bomb extends Objects{
@@ -10,7 +11,7 @@ public class Bomb extends Objects{
boolean bombActive;
double timer;
double setupTime;
- int duration = 3000;
+ public static int duration = 3000;
int attack = 1;
boolean showed;
Bomb(int x, int y, PApplet parent, PImage bombImage){
@@ -29,17 +30,45 @@ void render(){
parent.image(bombImage,x,y,30,30);
}
- public static void setBombIfPossible(PApplet parent){
- if (bomb) {
- if (findCurrentBombsNumber() < Character.players.get(0).getMaxBombs()) {
+ public static void setBombIfPossible1(PApplet parent){
+ if(parent.millis() - Player.players.get(0).setBombTime < 310){
+ return;
+ }
+ if (Player.players.get(0).bomb) {
+ if (findCurrentBombsNumber1() < Character.players.get(0).getMaxBombs()) {
int playerCenterX = Character.players.get(0).x() + tile / 2 - 15;
int playerCenterY = Character.players.get(0).y() + tile / 2 - 15;
- bombs.add(new Bomb(playerCenterX, playerCenterY, parent, ResourceManager.basicBomb));
+ Character.players.get(0).bombs.add(new Bomb(playerCenterX, playerCenterY, parent, ResourceManager.basicBomb));
+ Player.players.get(0).setBombTime = parent.millis();
+ }
+ Player.players.get(0).bomb = false;
+ }
+ if (findCurrentBombsNumber1()>0) {
+ for (Bomb bomb : Character.players.get(0).bombs) {
+ if (!bomb.hasExpired()) {
+ bomb.render();
+ } else {
+ bomb.showed = false;
+ }
+ }
+ }
+ }
+
+ public static void setBombIfPossible2(PApplet parent){
+ if(parent.millis() - Player.players.get(1).setBombTime < 310){
+ return;
+ }
+ if (Player.players.get(1).bomb) {
+ if (findCurrentBombsNumber2() < Character.players.get(1).getMaxBombs()) {
+ int playerCenterX = Character.players.get(1).x() + tile / 2 - 15;
+ int playerCenterY = Character.players.get(1).y() + tile / 2 - 15;
+ Character.players.get(1).bombs.add(new Bomb(playerCenterX, playerCenterY, parent, ResourceManager.basicBomb));
+ Player.players.get(0).setBombTime = parent.millis();
}
- bomb = false;
+ Player.players.get(1).bomb = false;
}
- if (findCurrentBombsNumber()>0) {
- for (Bomb bomb : bombs) {
+ if (findCurrentBombsNumber2()>0) {
+ for (Bomb bomb : Character.players.get(1).bombs) {
if (!bomb.hasExpired()) {
bomb.render();
} else {
@@ -73,7 +102,11 @@ public static int encodeCoordinate(int x, int y) {
}
public static void bombRender(){
- Iterator iterator = bombs.iterator();
+ ArrayList list = new ArrayList<>();
+ list.addAll(Player.players.get(0).bombs);
+ list.addAll(Player.players.get(1).bombs);
+
+ Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Bomb bomb = iterator.next();
int packedNumber = bomb.update();
@@ -90,9 +123,19 @@ public static void bombRender(){
}
}
- public static int findCurrentBombsNumber(){
+ public static int findCurrentBombsNumber1(){
+ int number =0;
+ for(Bomb bomb : Player.players.get(0).bombs){
+ if(bomb.showed){
+ number++;
+ }
+ }
+ return number;
+ }
+
+ public static int findCurrentBombsNumber2(){
int number =0;
- for(Bomb bomb : bombs){
+ for(Bomb bomb : Player.players.get(1).bombs){
if(bomb.showed){
number++;
}
diff --git a/Code/src/main/java/org/example/BreakableRock.java b/Code/src/main/java/org/example/BreakableRock.java
index 68ae99b..3290527 100644
--- a/Code/src/main/java/org/example/BreakableRock.java
+++ b/Code/src/main/java/org/example/BreakableRock.java
@@ -4,6 +4,7 @@
import processing.core.PImage;
import java.util.ArrayList;
+import java.util.Iterator;
public class BreakableRock extends Obstacle{
PImage rock;
@@ -30,14 +31,13 @@ public class BreakableRock extends Obstacle{
this.rockExist = true;
}
- public static ArrayList generateRocks(int rows, int cols, PApplet parent) {
- float chanceOfRock = 0.5F;
- ArrayList rocks = new ArrayList<>();
+ public static ArrayList generateRocks(int rows, int cols, PApplet parent, float chanceOfRock) {
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
// Randomly decide whether to place a rock in this grid cell
// Exclude the area around where player initially stand
- if (parent.random(1) < chanceOfRock && !Wall.isWallAt(i, j) && !(i <4 && j <4)) {
+ if (parent.random(1) < chanceOfRock && !Wall.isWallAt(i, j) &&
+ !(i <= 4 && j <= 4) && !(i >= cols - 4 && j >= rows - 4)) {
int x = 15 + i * tile;
int y = 75 + j * tile;
rocks.add(new BreakableRock(x, y, parent, ResourceManager.rock));
@@ -47,6 +47,46 @@ public static ArrayList generateRocks(int rows, int cols, PApplet
return rocks;
}
+ public static ArrayList generateLessRocks(int rows, int cols, PApplet parent, float chanceOfRock) {
+ for (int i = 0; i < cols; i++) {
+ for (int j = 0; j < rows; j++) {
+ // Randomly decide whether to place a rock in this grid cell
+ // Exclude the area around where player initially stand
+ if (parent.random(1) < chanceOfRock && !Wall.isWallAt(i, j) &&
+ !(i <= 4 && j <= 4) && !(i >= cols - 4 && j >= rows - 4)) {
+ int x = 15 + i * tile;
+ int y = 75 + j * tile;
+ lessRocks.add(new BreakableRock(x, y, parent, ResourceManager.rock));
+ }
+ }
+ }
+ return lessRocks;
+ }
+
+ // 移除被標記的岩石
+ public static void removeRocks() {
+ Iterator rockIterator = Obstacle.rocks.iterator();
+ while (rockIterator.hasNext()) {
+ BreakableRock rock = rockIterator.next();
+ if (rock.isMarkedForRemoval()) {
+ Obstacle.removeRockFromObstacleGrid(rock);
+ rockIterator.remove();
+ }
+ }
+ }
+
+ public static void removeLessRocks() {
+ Iterator rockIterator = Obstacle.lessRocks.iterator();
+ while (rockIterator.hasNext()) {
+ BreakableRock rock = rockIterator.next();
+ if (rock.isMarkedForRemoval()) {
+ Obstacle.removeRockFromObstacleGridPVP(rock);
+ rockIterator.remove();
+ }
+ }
+ }
+
+
public void ifDestroyRock(){
//handle the interaction between rocks and flames
if (Flame.flameCheck(this.x(), this.y())) {
@@ -129,4 +169,13 @@ public static void rocksRender(){
rock.ifDestroyRock();
}
}
+
+ public static void lessRocksRender(){
+ for (BreakableRock rock : lessRocks) {
+ if (rock.rockExist) {
+ rock.render();
+ }
+ rock.ifDestroyRock();
+ }
+ }
}
diff --git a/Code/src/main/java/org/example/Character.java b/Code/src/main/java/org/example/Character.java
index 4e0365f..25ba64f 100644
--- a/Code/src/main/java/org/example/Character.java
+++ b/Code/src/main/java/org/example/Character.java
@@ -11,8 +11,8 @@ public class Character extends GameLoop{
int speed;
boolean exist;
public int direction;
- public static ArrayList players;
- public static ArrayList enemies;
+ public static ArrayList players = new ArrayList<>();
+ public static ArrayList enemies = new ArrayList<>();
public static int enemyNumber = 5;
double damageTime = 0;
public boolean collisionDetect() {
@@ -54,7 +54,66 @@ public boolean collisionDetect() {
return false;
}
- for (Bomb bomb : Objects.bombs) {
+ for (Bomb bomb : Player.players.get(0).bombs) {
+ if (bomb.showed && bomb.bombActive &&
+ dist(x, y, bomb.x() + (float) tile / 2, bomb.y() + (float) tile / 2) <= tile) {
+ return false;
+ }
+ }
+ /*for (int i = 0; i < enemyNumber; i++) {
+ if (i < totEnemies && dist(x, y, enemies.get(i).x() + (float) tile / 2, enemies.get(i).y() + (float) tile / 2) < tile) {
+ collision = true;
+ }
+ }*/
+ return true;
+ }
+
+ public boolean collisionDetectPVP() {
+ int x = px, y = py;
+ if (direction == 0) {
+ x = this.x() + tile / 2;
+ y = this.y() + tile / 2 - this.getSpeed();
+ }
+ if (direction == 2) {
+ x = this.x() + tile / 2;
+ y = this.y() + tile / 2 + this.getSpeed();
+ }
+ if (direction == 3) {
+ x = this.x() + tile / 2 - this.getSpeed();
+ y = this.y() + tile / 2;
+ }
+ if (direction == 1) {
+ x = this.x() + tile / 2 + this.getSpeed();
+ y = this.y() + tile / 2;
+ }
+
+ int width = tile;
+ int height = tile;
+
+ int leftX = x - width / 2;
+ int rightX = x + width / 2 - 1;
+ int topY = y - height / 2;
+ int bottomY = y + height / 2 - 1;
+
+ int leftGridX = (leftX - 15) / tile;
+ int topGridY = (topY - 75) / tile;
+ int rightGridX = (rightX - 15) / tile;
+ int bottomGridY = (bottomY - 75) / tile;
+
+ if (Obstacle.obstacleGridPVP[leftGridX][topGridY] ||
+ Obstacle.obstacleGridPVP[rightGridX][topGridY] ||
+ Obstacle.obstacleGridPVP[leftGridX][bottomGridY] ||
+ Obstacle.obstacleGridPVP[rightGridX][bottomGridY]) {
+ return false;
+ }
+
+ for (Bomb bomb : Character.players.get(0).bombs) {
+ if (bomb.showed && bomb.bombActive &&
+ dist(x, y, bomb.x() + (float) tile / 2, bomb.y() + (float) tile / 2) <= tile) {
+ return false;
+ }
+ }
+ for (Bomb bomb : Character.players.get(1).bombs) {
if (bomb.showed && bomb.bombActive &&
dist(x, y, bomb.x() + (float) tile / 2, bomb.y() + (float) tile / 2) <= tile) {
return false;
@@ -71,6 +130,7 @@ public boolean collisionDetect() {
public void ifDamageCharacter(){
//handle the interaction between rocks and flames
if (Flame.flameCheck(px, py) && parent.millis() - damageTime > 1000) {
+ System.out.println(this.health);
this.health -= 1;
damageTime = parent.millis();
if (this.health == 0) {
diff --git a/Code/src/main/java/org/example/Enemy.java b/Code/src/main/java/org/example/Enemy.java
index f73522c..e8a33aa 100644
--- a/Code/src/main/java/org/example/Enemy.java
+++ b/Code/src/main/java/org/example/Enemy.java
@@ -25,7 +25,6 @@ public class Enemy extends Character{
}
public static ArrayList generateEnemies(PApplet parent) {
- ArrayList enemies = new ArrayList<>();
int number =0;
Random random = new Random();
while(number < enemyNumber){
diff --git a/Code/src/main/java/org/example/Flame.java b/Code/src/main/java/org/example/Flame.java
index e5322a0..d7bf793 100644
--- a/Code/src/main/java/org/example/Flame.java
+++ b/Code/src/main/java/org/example/Flame.java
@@ -10,14 +10,14 @@ public class Flame extends Objects{
PApplet parent;
PImage frameImage;
boolean showed;
- int startTime, duration;
+ public int startTime, duration;
Flame(int x, int y, PApplet parent, PImage frameImage){
this.x = x;
this.y = y;
this.parent =parent;
this.frameImage = frameImage;
this.showed = false;
- this.duration = 1000;
+ this.duration = 200;
}
void render(){
diff --git a/Code/src/main/java/org/example/GameLoop.java b/Code/src/main/java/org/example/GameLoop.java
index 366069c..293a0f9 100644
--- a/Code/src/main/java/org/example/GameLoop.java
+++ b/Code/src/main/java/org/example/GameLoop.java
@@ -8,13 +8,14 @@ public class GameLoop extends PApplet{
public static final int fps=60;
public static final int width=960;
public static final int height=540;
- public static boolean menu=true, play=false, settings=false;
- public static boolean move=false, up=false, down=false, left=false, right=false;
+ public static boolean menu=true, PVE=false, PVP=false, settings=false;
+// public static boolean move=false, up=false, down=false, left=false, right=false;
public static int rows = 15, cols = 31;
public static boolean gameWon = false;
public static boolean gameLost = false;
static char upKey1 = 'w';static char downKey1 = 's';static char leftKey1 = 'a';static char rightKey1 = 'd';static char bombKey1 = 'c';
- static char upKey2 = 'i';static char downKey2 = 'k';static char leftKey2 = 'j';static char rightKey2 = 'l';static char bombKey2 = 'p';
+
+
public void settings() {
size(width, height);
}
@@ -26,17 +27,18 @@ public void setup(){
//generate walls
Obstacle.walls = Wall.generateWalls(rows, cols, this);
//generate rocks
- Obstacle.rocks = BreakableRock.generateRocks(rows,cols, this);
-
- //Bomb.initializeBombs(this);
+ Obstacle.rocks = BreakableRock.generateRocks(rows,cols, this, 0.5f);
+ Obstacle.lessRocks = BreakableRock.generateLessRocks(rows,cols, this, 0.3f);
Flame.initializeFlames(this);
- Obstacle.initializeObstacleGrid(rows, cols);
+ Obstacle.initializeObstacleGrid();
+ Obstacle.initializeObstacleGridPVP();
Character.enemies = Enemy.generateEnemies(this);
Character.players = Player.setPlayer1(this);
+ Character.players = Player.setPlayer2(this);
Items.doorKey = new DoorKey(0,0,this);
Items.doorKey.setKey(this);
@@ -67,15 +69,15 @@ public void draw() {
textFont(Daruma, 35);
textAlign(CENTER);
fill(250, 236, 0);
- text("Play", 0, 450, ((float) width / 4), 100);
- text("Character", ((float) width / 4), 450, ((float) width / 4), 100);
+ text("PVE", 0, 450, ((float) width / 4), 100);
+ text("PVP", ((float) width / 4), 450, ((float) width / 4), 100);
text("Achievements", ((float) width / 4 * 2), 450, ((float) width / 4), 100);
text("Settings", ((float) width / 4 * 3), 450, ((float) width / 4), 100);
textSize(100);
text("Dungeon", 0, 250, width, 100);
}
- if (play) {
+ if (PVE) {
menu = false;
background(165, 165, 165);
fill(87, 108, 164);
@@ -86,6 +88,7 @@ public void draw() {
Wall.wallsRender();
BreakableRock.rocksRender();
+
DoorKey.doorKeyRender(this);
Door.doorRender(this);
@@ -93,7 +96,7 @@ public void draw() {
Player.player1Render();
- gameEndDetect();
+ gameEndDetectPVE();
BombPowerUp.getPowerUp(this);
ExtraBomb.getExtraBomb(this);
@@ -103,18 +106,55 @@ public void draw() {
Bomb.bombRender();
Flame.flameRender();
+ BreakableRock.removeRocks();
Items.removeMarkedObjects();
- Player.player1Movement(/*Player.players.get(0).direction*/);
+ Player.player1Movement();
Enemy.enemiesMove();
- Player.absorbToIntersection();
+ Player.absorb1ToIntersection();
+
+ Bomb.setBombIfPossible1(this);
+ }
+
+ if(PVP){
+ menu = false;
+ background(165, 165, 165);
+ fill(87, 108, 164);
+ noStroke();
+ rect(15, 75, 930, 450);
+ fill(93, 88, 95);
+
+ Wall.wallsRender();
+ BreakableRock.lessRocksRender();
+
+ Player.player1Render();
+ Player.player2Render();
+
+ Player.players.get(0).PVPEnhancement();
+ Player.players.get(1).PVPEnhancement();
+
+ Bomb.bombRender();
+ Flame.flameRender();
+
+ BreakableRock.removeLessRocks();
+
+ Player.player1Movement();
+ Player.player2Movement();
+
+ Player.absorb1ToIntersection();
+ Player.absorb2ToIntersection();
+
+ Bomb.setBombIfPossible1(this);
+ Bomb.setBombIfPossible2(this);
- Bomb.setBombIfPossible(this);
+ gameEndDetectPVP();
}
+
if (settings) {
menu = false;
- play = false;
+ PVE = false;
+ PVP = false;
background(87, 108, 164);
Settings settingsMenu = new Settings(this);
@@ -126,7 +166,6 @@ public void draw() {
fill(250, 236, 0);
text("Settings", 150, 30, (float) width / 4, height);
text("P1", 350, 30, (float) width / 4, height);
- text("P2", 550, 30, (float) width / 4, height);
textSize(30);
fill(0); // Set color for dropdown text
@@ -143,11 +182,7 @@ public void draw() {
text(String.valueOf(leftKey1), 350, 260, (float) width / 4, height);
text(String.valueOf(rightKey1), 350, 340, (float) width / 4, height);
text(String.valueOf(bombKey1), 350, 420, (float) width / 4, height);
- text(String.valueOf(upKey2), 550, 100, (float) width / 4, height);
- text(String.valueOf(downKey2), 550, 180, (float) width / 4, height);
- text(String.valueOf(leftKey2), 550, 260, (float) width / 4, height);
- text(String.valueOf(rightKey2), 550, 340, (float) width / 4, height);
- text(String.valueOf(bombKey2), 550, 420, (float) width / 4, height);
+
textSize(30);
textAlign(CENTER);
@@ -161,7 +196,10 @@ public void mouseClicked() {
link("https://github.com/UoB-COMSM0110/2024-group-7");
}
if (mouseX>=0 && mouseX<(width/4) && mouseY>=450 && mouseY<540) {
- play=true;
+ PVE=true;
+ }
+ if (mouseX>=(width/4) && mouseX<(width/2) && mouseY>=450 && mouseY<540) {
+ PVP=true;
}
if (mouseX>=(3*width/4) && mouseX=450 && mouseY<540) {
settings=true;
@@ -176,41 +214,73 @@ public void mouseClicked() {
public void keyPressed() {
if (key == upKey1) {
- up = true;
+ Player.players.get(0).up = true;
Player.players.get(0).direction = 0;
} else if (key == downKey1) {
- down = true;
+ Player.players.get(0).down = true;
Player.players.get(0).direction = 2;
} else if (key == leftKey1) {
- left = true;
+ Player.players.get(0).left = true;
Player.players.get(0).direction = 3;
} else if (key == rightKey1) {
- right = true;
+ Player.players.get(0).right = true;
Player.players.get(0).direction = 1;
- } else if (key == bombKey1 && Player.players.get(0).getMaxBombs() >= Bomb.findCurrentBombsNumber()) {
- Objects.bomb = true;
+ } else if (key == bombKey1 && Player.players.get(0).getMaxBombs() >= Bomb.findCurrentBombsNumber1()) {
+ Player.players.get(0).bomb = true;
+ }
+ Player.players.get(0).move = Player.players.get(0).up || Player.players.get(0).down
+ || Player.players.get(0).left || Player.players.get(0).right;
+
+ if(PVP) {
+ if (keyCode == UP) {
+ Player.players.get(1).up = true;
+ Player.players.get(1).direction = 0;
+ } else if (keyCode == DOWN) {
+ Player.players.get(1).down = true;
+ Player.players.get(1).direction = 2;
+ } else if (keyCode == LEFT) {
+ Player.players.get(1).left = true;
+ Player.players.get(1).direction = 3;
+ } else if (keyCode == RIGHT) {
+ Player.players.get(1).right = true;
+ Player.players.get(1).direction = 1;
+ } else if (keyCode == ENTER && Player.players.get(0).getMaxBombs() >= Bomb.findCurrentBombsNumber2()) {
+ Player.players.get(1).bomb = true;
+ }
+ Player.players.get(1).move = Player.players.get(1).up || Player.players.get(1).down
+ || Player.players.get(1).left || Player.players.get(1).right;
}
- move = up || down || left || right;
-
}
public void keyReleased() {
- if (key == upKey1) {
- up = false;
- } else if (key == downKey1) {
- down = false;
- } else if (key == leftKey1) {
- left = false;
- } else if (key == rightKey1) {
- right = false;
+ if (key==upKey1){
+ Player.players.get(0).up = false;
+ }else if (key==downKey1){
+ Player.players.get(0).down = false;
+ }else if (key==leftKey1){
+ Player.players.get(0).left = false;
+ }else if (key==rightKey1){
+ Player.players.get(0).right = false;
+ }
+ Player.players.get(0).move = Player.players.get(0).up || Player.players.get(0).down
+ || Player.players.get(0).left || Player.players.get(0).right;
+
+ if(PVP){
+ if (keyCode==UP){
+ Player.players.get(1).up = false;
+ }else if (keyCode==DOWN){
+ Player.players.get(1).down = false;
+ }else if (keyCode==LEFT){
+ Player.players.get(1).left = false;
+ }else if (keyCode==RIGHT){
+ Player.players.get(1).right = false;
+ }
+ Player.players.get(1).move = Player.players.get(1).up || Player.players.get(1).down
+ || Player.players.get(1).left || Player.players.get(1).right;
}
- move = up || down || left || right;
- /*if(key == 'w' || key == 's' || key == 'a' || key == 'd'){
- Player.players.get(0).direction = -1;
- }*/
}
- private static void gameEndDetect(){
+ private static void gameEndDetectPVE(){
if(gameLost){
System.out.println("GameOver");
}
@@ -231,4 +301,12 @@ private static void gameEndDetect(){
}
}
}
+
+ private static void gameEndDetectPVP() {
+ if(Player.players.get(0).otherPlayerWon){
+ System.out.println("Player 2 won!");
+ }else if(Player.players.get(1).otherPlayerWon){
+ System.out.println("Player 1 won!");
+ }
+ }
}
\ No newline at end of file
diff --git a/Code/src/main/java/org/example/Items.java b/Code/src/main/java/org/example/Items.java
index 4d4fac0..94c77aa 100644
--- a/Code/src/main/java/org/example/Items.java
+++ b/Code/src/main/java/org/example/Items.java
@@ -29,8 +29,13 @@ public static boolean isDoorOrKeyAt(int col, int row) {
public static boolean checkAndHandleBreakable(int col, int row) {
boolean handled = false;
-
- for (BreakableRock rock : Obstacle.rocks) {
+ ArrayList theRocks = new ArrayList<>();
+ if(PVP){
+ theRocks = BreakableRock.lessRocks;
+ }else{
+ theRocks = BreakableRock.rocks;
+ }
+ for (BreakableRock rock : theRocks) {
int rockCol = (rock.x() - 15) / tile;
int rockRow = (rock.y() - 75) / tile;
if (rockCol == col && rockRow == row && rock.rockExist) {
diff --git a/Code/src/main/java/org/example/Objects.java b/Code/src/main/java/org/example/Objects.java
index 9f1c9e9..3aa9528 100644
--- a/Code/src/main/java/org/example/Objects.java
+++ b/Code/src/main/java/org/example/Objects.java
@@ -5,10 +5,10 @@
public class Objects extends GameLoop{
int x, y;
/*public static int totBombs=0;*/
- public static boolean bomb=false;
+ //public static boolean bomb=false;
public static Flame [][] flames = new Flame[cols][rows];
//public static Bomb [][] bombs = new Bomb [cols][rows];
- public static ArrayList bombs = new ArrayList<>();
+ /*public static ArrayList bombs = new ArrayList<>();*/
public static ArrayList activeFlames = new ArrayList<>();
int x(){return x;}
diff --git a/Code/src/main/java/org/example/Obstacle.java b/Code/src/main/java/org/example/Obstacle.java
index 291d18a..da4442f 100644
--- a/Code/src/main/java/org/example/Obstacle.java
+++ b/Code/src/main/java/org/example/Obstacle.java
@@ -9,10 +9,12 @@ public class Obstacle extends GameLoop{
int px;
int py;
public static ArrayList walls;
- public static ArrayList rocks;
- public static boolean[][]obstacleGrid = new boolean[cols][rows];//need to be fixed!!!!!
+ public static ArrayList rocks = new ArrayList<>();
+ public static ArrayList lessRocks = new ArrayList<>();
+ public static boolean[][]obstacleGrid = new boolean[cols][rows];
+ public static boolean[][]obstacleGridPVP = new boolean[cols][rows];
- public static void initializeObstacleGrid(int rows, int cols) {
+ public static void initializeObstacleGrid() {
for (BreakableRock rock : Obstacle.rocks) {
int gridX = (rock.x() - 15) / tile;
int gridY = (rock.y() - 75) / tile;
@@ -25,14 +27,31 @@ public static void initializeObstacleGrid(int rows, int cols) {
}
}
+ public static void initializeObstacleGridPVP() {
+ for (BreakableRock rock : Obstacle.lessRocks) {
+ int gridX = (rock.x() - 15) / tile;
+ int gridY = (rock.y() - 75) / tile;
+ obstacleGridPVP[gridX][gridY] = true;
+ }
+ for (Wall wall : Obstacle.walls) {
+ int gridX = (wall.x() - 15) / tile;
+ int gridY = (wall.y() - 75) / tile;
+ obstacleGridPVP[gridX][gridY] = true;
+ }
+ }
+
public static void removeRockFromObstacleGrid(BreakableRock rock) {
int gridX = (rock.x() - 15) / tile;
int gridY = (rock.y() - 75) / tile;
- // 确保坐标在辅助数组的范围内
- /*if (gridX >= 0 && gridX < obstacleGrid.length && gridY >= 0 && gridY < obstacleGrid[gridX].length) {*/
- obstacleGrid[gridX][gridY] = false; // 移除rock
- /*}*/
+ obstacleGrid[gridX][gridY] = false;
+ }
+
+ public static void removeRockFromObstacleGridPVP(BreakableRock rock) {
+ int gridX = (rock.x() - 15) / tile;
+ int gridY = (rock.y() - 75) / tile;
+ //System.out.println("x = "+ gridX + " y = "+ gridY);
+ obstacleGridPVP[gridX][gridY] = false;
}
public static boolean areThereRocks(int x, int y) {
diff --git a/Code/src/main/java/org/example/Player.java b/Code/src/main/java/org/example/Player.java
index b2d2fa0..dd61e33 100644
--- a/Code/src/main/java/org/example/Player.java
+++ b/Code/src/main/java/org/example/Player.java
@@ -8,11 +8,19 @@
public class Player extends Character {
PImage playerImage;
+ public int playerNumber = 0;
private int explosionDistance;
private int maxBombs;
- /*public int direction; // 0 = up,1 = right,2 = down, 3 = left*/
+ boolean bomb=false;
+ public ArrayList bombs = new ArrayList<>();
+ boolean move=false, up=false, down=false, left=false, right=false;
- Player(int x, int y, PApplet parent, PImage playerImage){
+ boolean otherPlayerWon = false;
+
+ public double setBombTime = 0;
+
+ Player(int playerNumber, int x, int y, PApplet parent, PImage playerImage){
+ this.playerNumber = playerNumber;
this.parent =parent;
this.px=x;
this.py=y;
@@ -26,26 +34,26 @@ public class Player extends Character {
}
public static ArrayList setPlayer1(PApplet parent) {
- ArrayList players = new ArrayList<>();
int x = 15 + tile;
- int y = 15 + 3*tile;
- players.add(new Player(x, y, parent, ResourceManager.pinkBomber));
+ int y = 75 + tile;
+ players.add(new Player(1, x, y, parent, ResourceManager.pinkBomber));
+ return players;
+ }
+
+ public static ArrayList setPlayer2(PApplet parent) {
+ int x = 885;
+ int y = 465;
+ players.add(new Player(2, x, y, parent, ResourceManager.pinkBomber));
return players;
}
+ public void PVPEnhancement(){
+ speed = 3;
+ maxBombs = 3;
+ explosionDistance = 3;
+ }
+
public void playerMove(){
- /*if (direction == 0) {
- this.up();
- }
- if (direction == 2) {
- this.down();
- }
- if (direction == 3) {
- this.left();
- }
- if (direction == 1) {
- this.right();
- }*/
if (up) {
this.up();
}
@@ -60,10 +68,23 @@ public void playerMove(){
}
}
- private void playerBombActivation(){
- for (Bomb bomb : Objects.bombs) {
+ private static void playerBombActivation(){
+ for (Bomb bomb : Player.players.get(0).bombs) {
if (bomb.showed && !bomb.bombActive &&
- dist(px + (float) tile / 2, py + (float) tile / 2, bomb.x() + (float) tile / 2, bomb.y() + (float) tile / 2) >= tile) {
+ dist(Player.players.get(0).px + (float) tile / 2,
+ Player.players.get(0).py + (float) tile / 2,
+ bomb.x() + (float) tile / 2,
+ bomb.y() + (float) tile / 2) >= tile) {
+ bomb.bombActive = true;
+ /*System.out.println("the bomb is active");*/
+ }
+ }
+ for (Bomb bomb : Player.players.get(1).bombs) {
+ if (bomb.showed && !bomb.bombActive &&
+ dist(Player.players.get(1).px + (float) tile / 2,
+ Player.players.get(1).py + (float) tile / 2,
+ bomb.x() + (float) tile / 2,
+ bomb.y() + (float) tile / 2) >= tile) {
bomb.bombActive = true;
/*System.out.println("the bomb is active");*/
}
@@ -71,17 +92,39 @@ private void playerBombActivation(){
}
public static void player1Movement(){
- Character.players.get(0).playerBombActivation();
- if(Character.players.get(0).collisionDetect()) {
- Character.players.get(0).playerMove();
+ playerBombActivation();
+ if(PVP) {
+ if (Character.players.get(0).collisionDetectPVP()) {
+ Character.players.get(0).playerMove();
+// System.out.println("x = " + Character.players.get(0).px + " y = " + Character.players.get(0).py);
+ }
+ }else{
+ if (Character.players.get(0).collisionDetect()) {
+ Character.players.get(0).playerMove();
+// System.out.println("x = " + Character.players.get(0).px + " y = " + Character.players.get(0).py);
+ }
+ }
+ }
+
+ public static void player2Movement(){
+ playerBombActivation();
+ if(Character.players.get(1).collisionDetectPVP()) {
+ Character.players.get(1).playerMove();
// System.out.println("x = " + Character.players.get(0).px + " y = " + Character.players.get(0).py);
}
}
- public static void absorbToIntersection(){
- if(!(up || right || left || down)) {
- Character.players.get(0).px = Math.round(Character.players.get(0).px / 15.0f) * 15;
- Character.players.get(0).py = Math.round(Character.players.get(0).py / 15.0f) * 15;
+ public static void absorb1ToIntersection(){
+ if(!(players.get(0).up || players.get(0).right || players.get(0).left || players.get(0).down)) {
+ players.get(0).px = Math.round(Character.players.get(0).px / 15.0f) * 15;
+ players.get(0).py = Math.round(Character.players.get(0).py / 15.0f) * 15;
+ }
+ }
+
+ public static void absorb2ToIntersection(){
+ if(!(players.get(1).up || players.get(1).right || players.get(1).left || players.get(1).down)) {
+ players.get(1).px = Math.round(Character.players.get(1).px / 15.0f) * 15;
+ players.get(1).py = Math.round(Character.players.get(1).py / 15.0f) * 15;
}
}
@@ -129,6 +172,17 @@ public static void player1Render(){
Character.players.get(0).render();
}else {
GameLoop.gameLost = true;
+ players.get(0).otherPlayerWon = true;
+ }
+ }
+
+ public static void player2Render(){
+ players.get(1).ifDamageCharacter();
+ //players.get(1).ifTouchEnemy();
+ if(Character.players.get(1).exist){
+ Character.players.get(1).render();
+ }else {
+ players.get(1).otherPlayerWon = true;
}
}
}
diff --git a/Code/src/main/java/org/example/Settings.java b/Code/src/main/java/org/example/Settings.java
index e3afbcd..16d226c 100644
--- a/Code/src/main/java/org/example/Settings.java
+++ b/Code/src/main/java/org/example/Settings.java
@@ -41,42 +41,27 @@ public void dealOperation(String op, char keyInput) {
System.out.println("changeUpKey1");
GameLoop.upKey1 = keyInput;
break;
- case "changeUpKey2":
- System.out.println("changeUpKey2");
- GameLoop.upKey2 = keyInput;
- break;
+
case "changeDownKey1":
System.out.println("changeDownKey1");
GameLoop.downKey1 = keyInput;
break;
- case "changeDownKey2":
- System.out.println("changeDownKey2");
- GameLoop.downKey2 = keyInput;
- break;
+
case "changeLeftKey1":
System.out.println("changeLeftKey1");
GameLoop.leftKey1 = keyInput;
break;
- case "changeLeftKey2":
- System.out.println("changeLeftKey2");
- GameLoop.leftKey2 = keyInput;
- break;
+
case "changeRightKey1":
System.out.println("changeRightKey1");
GameLoop.rightKey1 = keyInput;
break;
- case "changeRightKey2":
- System.out.println("changeRightKey2");
- GameLoop.rightKey2 = keyInput;
- break;
+
case "changeBombKey1":
System.out.println("changeBombKey1");
GameLoop.bombKey1 = keyInput;
break;
- case "changeBombKey2":
- System.out.println("changeBombKey2");
- GameLoop.bombKey2 = keyInput;
- break;
+
default:
break;
}
@@ -85,33 +70,23 @@ public String settingsMouseClicked(int x, int y) {
if (x>=400 && x<550 && y>=90 && y<=130) {
return "changeUpKey1";
}
- if (x>=600 && x<750 && y>=90 && y<=130) {
- return "changeUpKey2";
- }
+
if (x>=400 && x<550 && y>=170 && y<=210) {
return "changeDownKey1";
}
- if (x>=600 && x<750 && y>=170 && y<=210) {
- return "changeDownKey2";
- }
+
if (x>=400 && x<550 && y>=250 && y<=290) {
return "changeLeftKey1";
}
- if (x>=600 && x<750 && y>=250 && y<=290) {
- return "changeLeftKey2";
- }
+
if (x>=400 && x<550 && y>=330 && y<=370) {
return "changeRightKey1";
}
- if (x>=600 && x<750 && y>=330 && y<=370) {
- return "changeRightKey2";
- }
+
if (x>=400 && x<550 && y>=410 && y<=450) {
return "changeBombKey1";
}
- if (x>=600 && x<750 && y>=410 && y<=450) {
- return "changeBombKey2";
- }
+
if (x>=420 && x<=560 && y>=480 && y<=520) {
return "close";
}