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 @@ - + + + + + + + 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"; }