From 8cd32163b0da55ec81b04d571e7c0e9fa9687f1f Mon Sep 17 00:00:00 2001 From: "Hannah.Morken" Date: Wed, 27 Apr 2022 21:54:27 +0200 Subject: [PATCH 1/4] multiplayer, men spiller 2 kan ikke falle --- src/main/java/core/CollisionCheck.java | 162 ++++---- src/main/java/core/GamePanel.java | 76 ++-- src/main/java/core/Highscore.java | 2 +- src/main/java/core/KeyHandler.java | 82 ++++- src/main/java/enemies/EntityEnemy.java | 13 +- src/main/java/enemies/Unicef.java | 4 +- src/main/java/entity/Background.java | 6 +- src/main/java/entity/Entity.java | 9 +- src/main/java/entity/Player.java | 161 ++++---- src/main/java/entity/Player2.java | 348 ++++++++++++++++++ src/main/java/entity/Score.java | 9 +- src/main/java/gameState/GameState.java | 1 + src/main/java/gameState/InfoScreen.java | 15 +- src/main/java/gameState/LevelsMenu.java | 15 +- src/main/java/gameState/MultiPlayerMenu.java | 46 +++ src/main/java/timer/Time.java | 6 +- src/main/resources/maps/easy.txt | 4 +- src/main/resources/maps/hard.txt | 1 - .../{player => player1}/Proggy_default1.png | Bin .../{player => player1}/Proggy_default2.png | Bin .../Proggy_gold_default1.png | Bin .../Proggy_gold_default2.png | Bin .../{player => player1}/Proggy_gold_left1.png | Bin .../{player => player1}/Proggy_gold_left2.png | Bin .../Proggy_gold_right1.png | Bin .../Proggy_gold_right2.png | Bin .../{player => player1}/Proggy_gold_up1.png | Bin .../{player => player1}/Proggy_gold_up2.png | Bin .../{player => player1}/Proggy_left1.png | Bin .../{player => player1}/Proggy_left2.png | Bin .../Proggy_mask_default1.png | Bin .../Proggy_mask_default2.png | Bin .../{player => player1}/Proggy_mask_left1.png | Bin .../{player => player1}/Proggy_mask_left2.png | Bin .../Proggy_mask_right1.png | Bin .../Proggy_mask_right2.png | Bin .../{player => player1}/Proggy_mask_up1.png | Bin .../{player => player1}/Proggy_mask_up2.png | Bin .../{player => player1}/Proggy_right1.png | Bin .../{player => player1}/Proggy_right2.png | Bin .../{player => player1}/Proggy_up1.png | Bin .../{player => player1}/Proggy_up2.png | Bin .../Proggy_voi_default1.png | Bin .../Proggy_voi_default2.png | Bin .../{player => player1}/Proggy_voi_left2.png | Bin .../{player => player1}/Proggy_voi_right2.png | Bin .../{player => player1}/Proggy_voi_up1.png | Bin .../{player => player1}/Proggy_voi_up2.png | Bin .../resources/player2/Proggy2_default1.png | Bin 0 -> 825 bytes .../resources/player2/Proggy2_default2.png | Bin 0 -> 837 bytes .../player2/Proggy2_gold_default1.png | Bin 0 -> 861 bytes .../player2/Proggy2_gold_default2.png | Bin 0 -> 861 bytes .../player2/Proggy2_gold_left1.png.png | Bin 0 -> 828 bytes .../resources/player2/Proggy2_gold_right1.png | Bin 0 -> 843 bytes .../resources/player2/Proggy2_gold_right2.png | Bin 0 -> 855 bytes .../resources/player2/Proggy2_gold_up1.png | Bin 0 -> 885 bytes .../resources/player2/Proggy2_gold_up2.png | Bin 0 -> 870 bytes src/main/resources/player2/Proggy2_left1.png | Bin 0 -> 807 bytes src/main/resources/player2/Proggy2_left2.png | Bin 0 -> 816 bytes .../player2/Proggy2_mask_default1.png | Bin 0 -> 861 bytes .../player2/Proggy2_mask_default2.png | Bin 0 -> 873 bytes .../resources/player2/Proggy2_mask_left1.png | Bin 0 -> 852 bytes .../resources/player2/Proggy2_mask_left2.png | Bin 0 -> 861 bytes .../resources/player2/Proggy2_mask_right1.png | Bin 0 -> 843 bytes .../resources/player2/Proggy2_mask_right2.png | Bin 0 -> 870 bytes .../resources/player2/Proggy2_mask_up1.png | Bin 0 -> 888 bytes .../resources/player2/Proggy2_mask_up2.png | Bin 0 -> 909 bytes src/main/resources/player2/Proggy2_right1.png | Bin 0 -> 810 bytes src/main/resources/player2/Proggy2_right2.png | Bin 0 -> 828 bytes src/main/resources/player2/Proggy2_up1.png | Bin 0 -> 855 bytes src/main/resources/player2/Proggy2_up2.png | Bin 0 -> 855 bytes .../resources/player2/Proggy2_voi_left.png | Bin 0 -> 876 bytes .../resources/player2/Proggy2_voi_right.png | Bin 0 -> 858 bytes .../resources/player2/Proggy_gold_left2.png | Bin 0 -> 855 bytes src/test/java/entityTest/PlayerItemsTest.java | 28 +- .../java/entityTest/PlayerMovementTest.java | 14 +- src/test/java/tileTest/LoaderTest.java | 2 +- src/test/java/tileTest/ScoreTest.java | 13 +- 78 files changed, 735 insertions(+), 282 deletions(-) create mode 100644 src/main/java/entity/Player2.java create mode 100644 src/main/java/gameState/MultiPlayerMenu.java rename src/main/resources/{player => player1}/Proggy_default1.png (100%) rename src/main/resources/{player => player1}/Proggy_default2.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_default1.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_default2.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_left1.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_left2.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_right1.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_right2.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_up1.png (100%) rename src/main/resources/{player => player1}/Proggy_gold_up2.png (100%) rename src/main/resources/{player => player1}/Proggy_left1.png (100%) rename src/main/resources/{player => player1}/Proggy_left2.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_default1.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_default2.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_left1.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_left2.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_right1.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_right2.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_up1.png (100%) rename src/main/resources/{player => player1}/Proggy_mask_up2.png (100%) rename src/main/resources/{player => player1}/Proggy_right1.png (100%) rename src/main/resources/{player => player1}/Proggy_right2.png (100%) rename src/main/resources/{player => player1}/Proggy_up1.png (100%) rename src/main/resources/{player => player1}/Proggy_up2.png (100%) rename src/main/resources/{player => player1}/Proggy_voi_default1.png (100%) rename src/main/resources/{player => player1}/Proggy_voi_default2.png (100%) rename src/main/resources/{player => player1}/Proggy_voi_left2.png (100%) rename src/main/resources/{player => player1}/Proggy_voi_right2.png (100%) rename src/main/resources/{player => player1}/Proggy_voi_up1.png (100%) rename src/main/resources/{player => player1}/Proggy_voi_up2.png (100%) create mode 100644 src/main/resources/player2/Proggy2_default1.png create mode 100644 src/main/resources/player2/Proggy2_default2.png create mode 100644 src/main/resources/player2/Proggy2_gold_default1.png create mode 100644 src/main/resources/player2/Proggy2_gold_default2.png create mode 100644 src/main/resources/player2/Proggy2_gold_left1.png.png create mode 100644 src/main/resources/player2/Proggy2_gold_right1.png create mode 100644 src/main/resources/player2/Proggy2_gold_right2.png create mode 100644 src/main/resources/player2/Proggy2_gold_up1.png create mode 100644 src/main/resources/player2/Proggy2_gold_up2.png create mode 100644 src/main/resources/player2/Proggy2_left1.png create mode 100644 src/main/resources/player2/Proggy2_left2.png create mode 100644 src/main/resources/player2/Proggy2_mask_default1.png create mode 100644 src/main/resources/player2/Proggy2_mask_default2.png create mode 100644 src/main/resources/player2/Proggy2_mask_left1.png create mode 100644 src/main/resources/player2/Proggy2_mask_left2.png create mode 100644 src/main/resources/player2/Proggy2_mask_right1.png create mode 100644 src/main/resources/player2/Proggy2_mask_right2.png create mode 100644 src/main/resources/player2/Proggy2_mask_up1.png create mode 100644 src/main/resources/player2/Proggy2_mask_up2.png create mode 100644 src/main/resources/player2/Proggy2_right1.png create mode 100644 src/main/resources/player2/Proggy2_right2.png create mode 100644 src/main/resources/player2/Proggy2_up1.png create mode 100644 src/main/resources/player2/Proggy2_up2.png create mode 100644 src/main/resources/player2/Proggy2_voi_left.png create mode 100644 src/main/resources/player2/Proggy2_voi_right.png create mode 100644 src/main/resources/player2/Proggy_gold_left2.png diff --git a/src/main/java/core/CollisionCheck.java b/src/main/java/core/CollisionCheck.java index 4cb9283..77f4db3 100644 --- a/src/main/java/core/CollisionCheck.java +++ b/src/main/java/core/CollisionCheck.java @@ -2,12 +2,12 @@ package core; import enemies.EntityEnemy; import entity.Entity; -import entity.Player; import entity.PlayerState; import gameState.GameState; public class CollisionCheck { - GamePanel gp; + //GamePanel gp; + Entity player; // The two corners of proggy to be checked for collision for each case int cornerOne, cornerTwo; @@ -25,8 +25,9 @@ public class CollisionCheck { private boolean pickedUpPowerUp = false; - public CollisionCheck(GamePanel gp) { - this.gp = gp; + public CollisionCheck(Entity player) { + //this.gp = gp; + this.player = player; } @@ -48,13 +49,13 @@ public class CollisionCheck { * @return true if colliding with a block that can be picked up */ private boolean pickUpGeneric(int x1, int y1, int x2, int y2, int tilenum) { - if (gp.loader.tiles[cornerOne] == gp.loader.tiles[tilenum]) { + if (player.gp.loader.tiles[cornerOne] == player.gp.loader.tiles[tilenum]) { // If Proggy collides with object, it turns the tile into tile[0] which is nothing - gp.loader.numOfTiles[x1][y1] = 0; + player.gp.loader.numOfTiles[x1][y1] = 0; return true; } - else if (gp.loader.tiles[cornerTwo] == gp.loader.tiles[tilenum]) { - gp.loader.numOfTiles[x2][y2] = 0; + else if (player.gp.loader.tiles[cornerTwo] == player.gp.loader.tiles[tilenum]) { + player.gp.loader.numOfTiles[x2][y2] = 0; return true; } return false; @@ -66,23 +67,23 @@ public class CollisionCheck { private void pickUpMoney(int x1, int y1, int x2, int y2) { // Pick up 100 kroner if (pickUpGeneric(x1, y1, x2, y2, 7)) { - gp.playSoundEffect(1); + player.gp.playSoundEffect(1); coins += 10; } // pick up 200-kroner if (pickUpGeneric(x1, y1, x2, y2, 8)) { - gp.playSoundEffect(2); + player.gp.playSoundEffect(2); coins += 20; } } //Enemy collission - public boolean unicefLooseMoney(Player player, EntityEnemy[] enemy) { - if (gp.getPlayerState() != PlayerState.INVISIBLE) { + public boolean unicefLooseMoney(EntityEnemy[] enemy) { + if (this.player.playerState != PlayerState.INVISIBLE) { for (int i = 0; i < enemy.length; i++) { if(enemy[i] != null) { - if(gp.player.worldY == enemy[i].worldY) { - if(gp.player.worldX <= enemy[i].worldX + 10 && gp.player.worldX >= enemy[i].worldX - 10) { + if(player.worldY == enemy[i].worldY) { + if(player.worldX <= enemy[i].worldX + 10 && player.worldX >= enemy[i].worldX - 10) { coins --; if(coins < 0) { coins = 0; @@ -98,19 +99,18 @@ public class CollisionCheck { } private void homelessLooseMoney(int x1, int y1, int x2, int y2) { - - gp.getPlayerState(); + //player.gp.getPlayerState(); int loosingMoney = 15; - if (gp.getPlayerState() != PlayerState.INVISIBLE) { + if (player.playerState != PlayerState.INVISIBLE) { if (coins >= loosingMoney) { - if (gp.loader.tiles[cornerOne] == gp.loader.tiles[9]) { - gp.loader.numOfTiles[x1][y1] = 10; + if (player.gp.loader.tiles[cornerOne] == player.gp.loader.tiles[9]) { + player.gp.loader.numOfTiles[x1][y1] = 10; coins -= loosingMoney; } } else if (coins>0 && coins < loosingMoney) { - if (gp.loader.tiles[cornerOne] == gp.loader.tiles[9]) { - gp.loader.numOfTiles[x1][y1] = 10; + if (player.gp.loader.tiles[cornerOne] == player.gp.loader.tiles[9]) { + player.gp.loader.numOfTiles[x1][y1] = 10; coins = 0; } } @@ -123,10 +123,11 @@ public class CollisionCheck { to the state of the belonging power up, starts timer on power up and updates the graphics */ private void powerUpSequence(int soundEffectNr, PlayerState state) { pickedUpPowerUp = true; - gp.playSoundEffect(soundEffectNr); - gp.setPlayerState(state); - gp.truePowerUpTimer(); - gp.player.getPlayerImage(); + player.gp.playSoundEffect(soundEffectNr); + player.playerState = state; + player.gp.truePowerUpTimer(); + player.gp.player.getPlayerImage(); + player.gp.player2.getPlayerImage(); } /** * Picks up mask and sets player state to invisible @@ -171,10 +172,10 @@ public class CollisionCheck { */ private void pickUpBeer(int x1, int y1, int x2, int y2) { if(coins >= 100) { //check for winning - if (pickUpGeneric(x1, y1, x2, y2, 16)) { - gp.playSoundEffect(4); - gp.gameState = GameState.WIN_SCREEN; //switches to winning screen - } + if (pickUpGeneric(x1, y1, x2, y2, 16)) { + player.gp.playSoundEffect(4); + player.gp.gameState = GameState.WIN_SCREEN; //switches to winning screen + } } } @@ -185,7 +186,7 @@ public class CollisionCheck { pickUpMoney(x1, y1, x2, y2); pickUpMask(x1, y1, x2, y2); pickUpShoes(x1, y1, x2, y2); - unicefLooseMoney(gp.player, gp.unicef); + unicefLooseMoney(player.gp.unicef); homelessLooseMoney(x1, y1, x2, y2); pickUpScooter(x1, y1, x2, y2); pickUpBeer(x1, y1, x2, y2); @@ -212,10 +213,10 @@ public class CollisionCheck { * So the player gets game over if the player falls in water */ public void fellInWater() { - if (gp.loader.tiles[cornerOne] == gp.loader.tiles[17]) { + if (player.gp.loader.tiles[cornerOne] == player.gp.loader.tiles[17]) { this.outOfBounds = true; } - else if (gp.loader.tiles[cornerTwo] == gp.loader.tiles[17]) { + else if (player.gp.loader.tiles[cornerTwo] == player.gp.loader.tiles[17]) { this.outOfBounds = true; } else { @@ -243,29 +244,30 @@ public class CollisionCheck { } - public void checkCollisionOnTile(Entity unit) { + public void checkCollisionOnTile() { // Creating the sides of the solid area of Proggy. If these sides hit a solid block, it will create a collision. - int unitLeftSide = unit.playerSolid.x + unit.worldX; - int unitRightSide = unit.playerSolid.width + unit.worldX; - int unitTopSide = unit.playerSolid.y + unit.worldY; - int unitBottomSide = unit.worldY - unit.playerSolid.y + unit.playerSolid.height; + int unitLeftSide = player.playerSolid.x + player.worldX; + int unitRightSide = player.playerSolid.width + player.worldX; + int unitTopSide = player.playerSolid.y + player.worldY; + int unitBottomSide = player.worldY - player.playerSolid.y + player.playerSolid.height; // This must be adjusted for tilesize to find the columns and rows they are at - int unitLeftCol = unitLeftSide / gp.tileSize; - int unitRightCol = unitRightSide / gp.tileSize; - int unitTopRow = unitTopSide / gp.tileSize; - int unitBottomRow = unitBottomSide / gp.tileSize; + int unitLeftCol = unitLeftSide / this.player.gp.tileSize; + //System.out.println(unitLeftCol); + int unitRightCol = unitRightSide / this.player.gp.tileSize; + int unitTopRow = unitTopSide / this.player.gp.tileSize; + int unitBottomRow = unitBottomSide / this.player.gp.tileSize; try { - switch(unit.direction) { + switch(player.direction) { case "up": //If Proggy moves in an upwards direction, the two corners that needs to be checked is top right and left corners - unitTopRow = (unitTopSide - unit.speed) / gp.tileSize; //predictiong which tile Proggy tries to go into - cornerOne = gp.loader.numOfTiles[unitLeftCol][unitTopRow]; // Top left corner - cornerTwo = gp.loader.numOfTiles[unitRightCol][unitTopRow]; // Top right corner - if (gp.loader.tiles[cornerOne].collission == true || gp.loader.tiles[cornerTwo].collission == true) { + unitTopRow = (unitTopSide - player.speed) / this.player.gp.tileSize; //predictiong which tile Proggy tries to go into + cornerOne = this.player.gp.loader.numOfTiles[unitLeftCol][unitTopRow]; // Top left corner + cornerTwo = this.player.gp.loader.numOfTiles[unitRightCol][unitTopRow]; // Top right corner + if (this.player.gp.loader.tiles[cornerOne].collission == true || this.player.gp.loader.tiles[cornerTwo].collission == true) { // if one of these corners collide, collision is true - unit.colliding = true; + player.colliding = true; } this.pickUp(unitLeftCol,unitTopRow, unitRightCol, unitTopRow); @@ -275,14 +277,14 @@ public class CollisionCheck { case "down": //If Proggy moves in an downwards direction, the two corners that needs to be checked is bottom right and left corners - unitBottomRow = (unitBottomSide + unit.speed) / gp.tileSize; //predictiong which tile Proggy tries to go into - cornerOne = gp.loader.numOfTiles[unitLeftCol][unitBottomRow]; // Bottom left corner - cornerTwo = gp.loader.numOfTiles[unitRightCol][unitBottomRow]; // Bottom right corner - if (gp.loader.tiles[cornerOne].collission == true || gp.loader.tiles[cornerTwo].collission == true) { - unit.colliding = true; + unitBottomRow = (unitBottomSide + player.speed) / this.player.gp.tileSize; //predictiong which tile Proggy tries to go into + cornerOne = this.player.gp.loader.numOfTiles[unitLeftCol][unitBottomRow]; // Bottom left corner + cornerTwo = this.player.gp.loader.numOfTiles[unitRightCol][unitBottomRow]; // Bottom right corner + if (this.player.gp.loader.tiles[cornerOne].collission == true || this.player.gp.loader.tiles[cornerTwo].collission == true) { + player.colliding = true; // We also introduce a boolean to check if Proggy is colliding with the ground. // This is used to check if porggy is allowed to jump again. - unit.onGround = true; + player.onGround = true; } this.pickUp(unitLeftCol,unitBottomRow, unitRightCol, unitBottomRow); @@ -291,11 +293,11 @@ public class CollisionCheck { break; case "left": - unitLeftCol = (unitLeftSide - unit.speed) / gp.tileSize; - cornerOne = gp.loader.numOfTiles[unitLeftCol][unitTopRow]; - cornerTwo = gp.loader.numOfTiles[unitLeftCol][unitBottomRow]; - if (gp.loader.tiles[cornerOne].collission == true || gp.loader.tiles[cornerTwo].collission == true) { - unit.colliding = true; + unitLeftCol = (unitLeftSide - player.speed) / this.player.gp.tileSize; + cornerOne = this.player.gp.loader.numOfTiles[unitLeftCol][unitTopRow]; + cornerTwo = this.player.gp.loader.numOfTiles[unitLeftCol][unitBottomRow]; + if (this.player.gp.loader.tiles[cornerOne].collission == true || this.player.gp.loader.tiles[cornerTwo].collission == true) { + player.colliding = true; } // Will pick up whatever is in the new tile this.pickUp(unitLeftCol,unitTopRow, unitLeftCol, unitBottomRow); @@ -303,11 +305,11 @@ public class CollisionCheck { break; case "right": - unitRightCol = (unitRightSide + unit.speed) / gp.tileSize; - cornerOne = gp.loader.numOfTiles[unitRightCol][unitTopRow]; - cornerTwo = gp.loader.numOfTiles[unitRightCol][unitBottomRow]; - if (gp.loader.tiles[cornerOne].collission == true || gp.loader.tiles[cornerTwo].collission == true) { - unit.colliding = true; + unitRightCol = (unitRightSide + player.speed) / this.player.gp.tileSize; + cornerOne = this.player.gp.loader.numOfTiles[unitRightCol][unitTopRow]; + cornerTwo = this.player.gp.loader.numOfTiles[unitRightCol][unitBottomRow]; + if (this.player.gp.loader.tiles[cornerOne].collission == true || this.player.gp.loader.tiles[cornerTwo].collission == true) { + player.colliding = true; } // Will pick up whatever is in the new tile this.pickUp(unitRightCol,unitTopRow, unitRightCol, unitBottomRow); @@ -318,7 +320,7 @@ public class CollisionCheck { // If proggy falls out of bounds this is triggered catch(ArrayIndexOutOfBoundsException e) { outOfBounds = true; - gp.player.setGravity(0); //setting gravity equal to 0 so that Proggy doesn't fall to infinity + this.player.gp.player.setGravity(0); //setting gravity equal to 0 so that Proggy doesn't fall to infinity } } @@ -330,10 +332,10 @@ public class CollisionCheck { int enemybottomworldy = entityEnemy.worldY + entityEnemy.enemySolid.y + entityEnemy.enemySolid.height; // This must be adjusted for tilesize to find the columns and rows they are at - int enemyLeftCol = enemyleftworldx / gp.tileSize; - int enemyRightCol = enemyrightworldx / gp.tileSize; - int enemyTopRow = enemytopworldy / gp.tileSize; - int enemyBottomRow = enemybottomworldy / gp.tileSize; + int enemyLeftCol = enemyleftworldx / player.gp.tileSize; + int enemyRightCol = enemyrightworldx / player.gp.tileSize; + int enemyTopRow = enemytopworldy / player.gp.tileSize; + int enemyBottomRow = enemybottomworldy / player.gp.tileSize; @@ -342,30 +344,30 @@ public class CollisionCheck { case "down": //If Proggy moves in an downwards direction, the two corners that needs to be checked is bottom right and left corners - enemyBottomRow = (enemybottomworldy + entityEnemy.speed) / gp.tileSize; //predictiong which tile Proggy tries to go into - enemyCor1 = gp.loader.numOfTiles[enemyLeftCol][enemyBottomRow]; // Bottom left corner - enemyCor2 = gp.loader.numOfTiles[enemyRightCol][enemyBottomRow]; // Bottom right corner - if (gp.loader.tiles[enemyCor1].collission == true || gp.loader.tiles[enemyCor2].collission == true) { + enemyBottomRow = (enemybottomworldy + entityEnemy.speed) / player.gp.tileSize; //predictiong which tile Proggy tries to go into + enemyCor1 = player.gp.loader.numOfTiles[enemyLeftCol][enemyBottomRow]; // Bottom left corner + enemyCor2 = player.gp.loader.numOfTiles[enemyRightCol][enemyBottomRow]; // Bottom right corner + if (player.gp.loader.tiles[enemyCor1].collission == true || player.gp.loader.tiles[enemyCor2].collission == true) { entityEnemy.colliding = true; entityEnemy.onGround = true; } break; case"enemyLeft": - enemyLeftCol = (enemyleftworldx - entityEnemy.speed) / gp.tileSize; //predictiong which tile Enemy tries to go into - enemyCor1 = gp.loader.numOfTiles[enemyLeftCol][enemyTopRow]; // Top left corner - enemyCor2 = gp.loader.numOfTiles[enemyLeftCol][enemyBottomRow]; // Top right corner - if(gp.loader.tiles[enemyCor1].collission == true) { + enemyLeftCol = (enemyleftworldx - entityEnemy.speed) / player.gp.tileSize; //predictiong which tile Enemy tries to go into + enemyCor1 = player.gp.loader.numOfTiles[enemyLeftCol][enemyTopRow]; // Top left corner + enemyCor2 = player.gp.loader.numOfTiles[enemyLeftCol][enemyBottomRow]; // Top right corner + if(player.gp.loader.tiles[enemyCor1].collission == true) { entityEnemy.colliding = true; } break; case"enemyRight": - enemyRightCol = (enemyrightworldx - entityEnemy.speed) / gp.tileSize; //predictiong which tile Enemy tries to go into - enemyCor1 = gp.loader.numOfTiles[enemyRightCol][enemyTopRow]; // Top left corner - enemyCor2 = gp.loader.numOfTiles[enemyRightCol][enemyBottomRow]; // Top right corner - if(gp.loader.tiles[enemyCor1].collission == true) { + enemyRightCol = (enemyrightworldx - entityEnemy.speed) / player.gp.tileSize; //predictiong which tile Enemy tries to go into + enemyCor1 = player.gp.loader.numOfTiles[enemyRightCol][enemyTopRow]; // Top left corner + enemyCor2 = player.gp.loader.numOfTiles[enemyRightCol][enemyBottomRow]; // Top right corner + if(player.gp.loader.tiles[enemyCor1].collission == true) { entityEnemy.colliding = true; } diff --git a/src/main/java/core/GamePanel.java b/src/main/java/core/GamePanel.java index d175778..b6e46e0 100644 --- a/src/main/java/core/GamePanel.java +++ b/src/main/java/core/GamePanel.java @@ -9,23 +9,9 @@ import java.util.ArrayList; import javax.swing.JPanel; import enemies.EnemySetter; -import enemies.Unicef; import enemies.EntityEnemy; -import entity.Background; -import entity.Player; -import entity.PlayerState; -import entity.Score; -import gameState.GameControls; -import gameState.GameOver; -import gameState.GameState; -import gameState.InfoScreen; -import gameState.LanguageScreen; -import gameState.Languages; -import gameState.LevelsMenu; -import gameState.Paused; -import gameState.StartMenu; -import gameState.WinScreen; -import gameState.WinScreen2; +import entity.*; +import gameState.*; import sound.Sound; import tile.TileLoader; import timer.TimerDisplay; @@ -50,7 +36,7 @@ public class GamePanel extends JPanel implements Runnable{ public final int worldWidth = tileSize * maxWorldCol; public final int worldHeight = tileSize * maxWorldRow; - private PlayerState playerState = PlayerState.NORMAL; + //private PlayerState playerState; //Map @@ -63,10 +49,12 @@ public class GamePanel extends JPanel implements Runnable{ int FPS = 60; //CollisionCheck - public CollisionCheck collisionChecker; + public CollisionCheck collisionChecker1; + public CollisionCheck collisionChecker2; KeyHandler keyH = new KeyHandler(this); public Player player; + public Player2 player2; public EntityEnemy unicef[] = new EntityEnemy[50]; public Background bg; public TileLoader loader; @@ -98,7 +86,10 @@ public class GamePanel extends JPanel implements Runnable{ public void truePowerUpTimer() { timerDisplay.startPowerUpTimerTrue(); } - + + //Multiplayer screen + public MultiPlayerMenu multiMenu; + //Score private Score score; @@ -119,6 +110,8 @@ public class GamePanel extends JPanel implements Runnable{ //Show controls public GameControls ctrls; + + public boolean multiGame; //Game Over if there is no time left private GameOver gO; @@ -131,7 +124,7 @@ public class GamePanel extends JPanel implements Runnable{ return gameO; } public boolean getOutOfBounds() { - boolean out = collisionChecker.isOutOfBounds(); + boolean out = collisionChecker1.isOutOfBounds(); return out; } @@ -153,8 +146,9 @@ public class GamePanel extends JPanel implements Runnable{ bg = new Background(this, keyH); //setter player state til normal før nytt player objekt blir laget - playerState = PlayerState.NORMAL; + //playerState = PlayerState.NORMAL; player = new Player(this, keyH); + player2 = new Player2(this, keyH); //get the language chosen by player lang = getLang(); @@ -170,8 +164,11 @@ public class GamePanel extends JPanel implements Runnable{ levels = new LevelsMenu(this); wS = new WinScreen(this); wS2 = new WinScreen2(this); - collisionChecker = new CollisionCheck(this); + multiMenu = new MultiPlayerMenu(this); + collisionChecker1 = new CollisionCheck(player); + collisionChecker2 = new CollisionCheck(player2); eSetter.setHobo(); + multiGame = false; } @@ -195,22 +192,22 @@ public class GamePanel extends JPanel implements Runnable{ // Will trigger a countdown of 10 seconds that makes the powerUp disappear when it ends public boolean pickedUpPowerUp() { - if (collisionChecker.getPickedUpPowerUp() == true) { + if (collisionChecker1.getPickedUpPowerUp() == true) { return true; } return false; } // public void setPickedUpPowerUp(boolean pickedUpPowerUp) { - this.collisionChecker.setPickedUpPowerUp(pickedUpPowerUp); + this.collisionChecker1.setPickedUpPowerUp(pickedUpPowerUp); } // Gets coins from CollisionChecker and is in this class so that it can be used in Time.java public int getCoinsInCollisionChecker() { - return this.collisionChecker.getCoins(); + return this.collisionChecker1.getCoins(); } // Calls on the method from CollisionChecker that reduces coins by 1 and is in this class so that it can be used in Time.java public void reduceCoinByOne() { - this.collisionChecker.reduceCoins(); + this.collisionChecker1.reduceCoins(); } public void startGameThread() { @@ -219,14 +216,17 @@ public class GamePanel extends JPanel implements Runnable{ } // Making it possible to read playerState - public PlayerState getPlayerState() { + /*public PlayerState getPlayerState() { return this.playerState; - } + + */ // Making it possible to modify playerState - public void setPlayerState(PlayerState playerState) { + /*public void setPlayerState(PlayerState playerState) { this.playerState = playerState; } + + */ public void setMap(String mapPath) { is = getClass().getResourceAsStream(mapPath); @@ -292,7 +292,13 @@ public class GamePanel extends JPanel implements Runnable{ if(!gO.gameOver()) { score.showScore(); if(!(gameState == GameState.GAME_OVER || gameState == GameState.WIN_SCREEN)) { - player.update(); + player.update(); + if (gameState == GameState.RUNNING_GAME && multiGame) { + player2.update(); + if (keyH.leftPressed1 || keyH.rightPressed1 || keyH.upPressed1) { + + } + } } } if(!gO.gameOverBounds()) { @@ -332,9 +338,12 @@ public class GamePanel extends JPanel implements Runnable{ loader.draw(g2, player.worldX); player.draw(g2); - if (playerState == PlayerState.NORMAL) { + if (player.playerState == PlayerState.NORMAL) { this.player.getPlayerImage(); } + if (player2.playerState == PlayerState.NORMAL) { + this.player2.getPlayerImage(); + } for(int i = 0; i < unicef.length; i++) { if(unicef[i] != null) { @@ -366,10 +375,15 @@ public class GamePanel extends JPanel implements Runnable{ else if (gameState == GameState.WIN_SCREEN2) { wS2.draw(g2); } + else if (gameState == GameState.MULTIPLAYER_MENU) { + multiMenu.draw(g2); + } else { timerDisplay.draw(g2); score.draw(g2); gO.draw(g2); + if (multiGame) + player2.draw(g2); } g2.dispose(); diff --git a/src/main/java/core/Highscore.java b/src/main/java/core/Highscore.java index a21d72b..0a176c4 100644 --- a/src/main/java/core/Highscore.java +++ b/src/main/java/core/Highscore.java @@ -17,7 +17,7 @@ public class Highscore { * @return */ private int calculateScore() { - int score = gp.collisionChecker.getCoins(); + int score = gp.collisionChecker1.getCoins(); String[] strArr = gp.getTimerDisplay().timeLeft().split(":"); boolean minutesDone = false; for(String s: strArr) { diff --git a/src/main/java/core/KeyHandler.java b/src/main/java/core/KeyHandler.java index ba5724f..fc65792 100644 --- a/src/main/java/core/KeyHandler.java +++ b/src/main/java/core/KeyHandler.java @@ -10,7 +10,7 @@ import entity.PlayerState; public class KeyHandler implements KeyListener{ - public boolean upPressed, downPressed, leftPressed, rightPressed; + public boolean upPressed1, upPressed2, downPressed, leftPressed1, rightPressed1, leftPressed2, rightPressed2; public float jumpSpeed; private GamePanel gp; String mapPath; @@ -137,6 +137,34 @@ public class KeyHandler implements KeyListener{ code = KeyEvent.KEY_RELEASED; } + if (gp.gameState == GameState.MULTIPLAYER_MENU) { + if (code == KeyEvent.VK_DOWN) { + gp.playSoundEffect(0); + gp.multiMenu.cmd++; + if (gp.multiMenu.cmd > 1) { + gp.multiMenu.cmd = 0; + } + } + if (code == KeyEvent.VK_UP) { + gp.playSoundEffect(0); + gp.multiMenu.cmd--; + if (gp.multiMenu.cmd < 0) { + gp.multiMenu.cmd = 1; + } + } + if (code == KeyEvent.VK_ENTER) { + if (gp.multiMenu.cmd == 0) { + gp.multiGame = false; + gp.gameState = GameState.RUNNING_GAME; + System.out.println("he"); + } + if (gp.multiMenu.cmd == 1) { + gp.multiGame = true; + gp.gameState = GameState.RUNNING_GAME; + } + } + } + if (gp.gameState == GameState.INFO_SCREEN) { if (code == KeyEvent.VK_RIGHT) { gp.playSoundEffect(0); @@ -211,18 +239,28 @@ public class KeyHandler implements KeyListener{ if (gp.gameState == GameState.RUNNING_GAME) { // Up-arrow or space-button is pressed - if (code == KeyEvent.VK_UP || code == KeyEvent.VK_SPACE || e.getKeyChar() == 'w') { - upPressed = true; + if (code == KeyEvent.VK_UP || code == KeyEvent.VK_SPACE) { + upPressed1 = true; } - // left-arrow is pressed - if (code == KeyEvent.VK_LEFT || e.getKeyChar() == 'a') { - leftPressed = true; + if (e.getKeyChar() == 'w') + upPressed2 = true; + // left-arrow is pressed + if (code == KeyEvent.VK_LEFT) { + leftPressed1 = true; } + if (e.getKeyChar() == 'a') + leftPressed2 = true; + + // right-arrow is pressed - if (code == KeyEvent.VK_RIGHT || e.getKeyChar() == 'd') { - rightPressed = true; + if (code == KeyEvent.VK_RIGHT) { + rightPressed1 = true; } + if (e.getKeyChar() == 'd') + rightPressed2 = true; + + if ((gp.getGameOver() == false || gp.getOutOfBounds() == false) && code == KeyEvent.VK_ESCAPE) { gp.gameState = GameState.PAUSED_GAME; } @@ -282,9 +320,9 @@ public class KeyHandler implements KeyListener{ } if (gp.gameState == GameState.PAUSED_GAME) { - pS = gp.getPlayerState(); + pS = gp.player.playerState; gp.stopTimer(); - gp.setPlayerState(PlayerState.INVISIBLE); + gp.player.playerState = PlayerState.INVISIBLE; if (code == KeyEvent.VK_DOWN) { gp.playSoundEffect(0); gp.pause.cmd++; @@ -301,7 +339,7 @@ public class KeyHandler implements KeyListener{ } if(gp.pause.cmd == 0 && code == KeyEvent.VK_ENTER) { gp.playSoundEffect(0); - gp.setPlayerState(pS); + gp.player.playerState = pS; gp.gameState = GameState.RUNNING_GAME; gp.startTimer(); } @@ -326,19 +364,25 @@ public class KeyHandler implements KeyListener{ int code = e.getKeyCode(); // space-button or up-arrow is released - if (code == KeyEvent.VK_UP || code == KeyEvent.VK_SPACE || e.getKeyChar() == 'w') { - upPressed = false; + if (code == KeyEvent.VK_UP || code == KeyEvent.VK_SPACE) { + upPressed1 = false; } + if (e.getKeyChar() == 'w') + upPressed2 = false; // left arrow is released - if (code == KeyEvent.VK_LEFT || e.getKeyChar() == 'a') { - leftPressed = false; - + if (code == KeyEvent.VK_LEFT) { + leftPressed1 = false; } + if (e.getKeyChar() == 'a') + leftPressed2 = false; + //right-arrow is released - if (code == KeyEvent.VK_RIGHT || e.getKeyChar() == 'd') { - rightPressed = false; + if (code == KeyEvent.VK_RIGHT) { + rightPressed1 = false; } + if (e.getKeyChar() == 'd') + rightPressed2 = false; } @@ -353,7 +397,7 @@ public class KeyHandler implements KeyListener{ gp.setMap(mapPath); gp.resetLoader(); gp.setGame(); - gp.gameState = GameState.RUNNING_GAME; + gp.gameState = GameState.MULTIPLAYER_MENU; gp.startTimer(); } diff --git a/src/main/java/enemies/EntityEnemy.java b/src/main/java/enemies/EntityEnemy.java index e3dff5e..f2addc2 100644 --- a/src/main/java/enemies/EntityEnemy.java +++ b/src/main/java/enemies/EntityEnemy.java @@ -1,11 +1,8 @@ package enemies; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Random; import core.GamePanel; -import core.KeyHandler; import entity.PlayerState; import java.awt.Graphics2D; @@ -46,7 +43,8 @@ public class EntityEnemy { setAction(); colliding = false; - gp.collisionChecker.checkEnemyOnTile(this); + gp.collisionChecker1.checkEnemyOnTile(this); + gp.collisionChecker2.checkEnemyOnTile(this); if (colliding == false) { switch(direction) { @@ -78,7 +76,8 @@ public class EntityEnemy { public void fall() { String originalDir = direction; direction = "down"; - gp.collisionChecker.checkEnemyOnTile(this); + gp.collisionChecker1.checkEnemyOnTile(this); + gp.collisionChecker2.checkEnemyOnTile(this); if(colliding == false || onGround == false) { onGround = false; direction = originalDir; @@ -99,9 +98,9 @@ public class EntityEnemy { BufferedImage image = null; int screenX = worldX - gp.player.worldX + gp.player.playerX; - int screenY = worldY - gp.player.worldY + gp.player.playerY ; + int screenY = worldY - gp.player.worldY + gp.player.playerY; - if(worldX + gp.tileSize > gp.player.worldX - gp.player.playerX && + if(worldX + gp.tileSize > gp.player.worldX - gp.player.playerX && worldX - gp.tileSize < gp.player.worldX + gp.player.playerX && worldY + gp.tileSize > gp.player.worldY - gp.player.playerY && worldY - gp.tileSize < gp.player.worldY + gp.player.playerY) { diff --git a/src/main/java/enemies/Unicef.java b/src/main/java/enemies/Unicef.java index e9237e3..1b689f0 100644 --- a/src/main/java/enemies/Unicef.java +++ b/src/main/java/enemies/Unicef.java @@ -43,9 +43,7 @@ public class Unicef extends EntityEnemy{ } public void setAction() { - - - + movementCount ++; //the higher the movementcount, the longer between change of direction diff --git a/src/main/java/entity/Background.java b/src/main/java/entity/Background.java index 61505ea..6d52b62 100644 --- a/src/main/java/entity/Background.java +++ b/src/main/java/entity/Background.java @@ -41,12 +41,12 @@ public class Background extends Entity { } public void update() { - if (keyH.leftPressed == true || keyH.rightPressed == true) { + if (keyH.leftPressed1 == true || keyH.rightPressed1 == true) { - if (keyH.leftPressed == true) { + if (keyH.leftPressed1 == true) { direction = "left"; worldX += speed; - } else if (keyH.rightPressed == true) { + } else if (keyH.rightPressed1 == true) { direction = "right"; worldX -= speed; } diff --git a/src/main/java/entity/Entity.java b/src/main/java/entity/Entity.java index e0fd8f3..b9a5a06 100644 --- a/src/main/java/entity/Entity.java +++ b/src/main/java/entity/Entity.java @@ -1,5 +1,7 @@ package entity; +import core.GamePanel; + import java.awt.image.BufferedImage; import java.awt.Rectangle; @@ -7,7 +9,8 @@ import java.awt.Rectangle; public class Entity { - + public PlayerState playerState; + public GamePanel gp; public int worldX, worldY; public int playerX, playerY; public int speed; @@ -23,11 +26,11 @@ public class Entity { public boolean onGround = true; - - //brukes til å skape animasjon på spiller og fiender public int spriteCounter = 0; public int spriteNum = 1; + + } diff --git a/src/main/java/entity/Player.java b/src/main/java/entity/Player.java index 1d10dcd..01dbe09 100644 --- a/src/main/java/entity/Player.java +++ b/src/main/java/entity/Player.java @@ -10,9 +10,9 @@ import core.GamePanel; import core.KeyHandler; import java.awt.Rectangle; + public class Player extends Entity{ - GamePanel gp; KeyHandler keyH; private int weight; private int gravity; @@ -30,7 +30,7 @@ public class Player extends Entity{ We set this to the whole character since it only scrolls vertically */ playerSolid = new Rectangle(14 ,2,gp.tileSize-14, gp.tileSize-2); - + setDefaultValues(); getPlayerImage(); } @@ -46,84 +46,84 @@ public class Player extends Entity{ weight = 3; jumpStrength = 0; gravity = weight; - + playerState = PlayerState.NORMAL; } - +/* + public PlayerState getPlayerState() { + return this.playerState; + } + + */ + public void getPlayerImage() { - if (gp.getPlayerState() == PlayerState.NORMAL) { + if (playerState == PlayerState.NORMAL) { try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_right2.png")); - - // bakgrunn = ImageIO.read(getClass().getResourceAsStream("/graphics/bakgrunn.jpg")); + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_right2.png")); + }catch(IOException e) { e.printStackTrace(); } - } else if (gp.getPlayerState() == PlayerState.INVISIBLE) { + } else if (playerState == PlayerState.INVISIBLE) { try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_right2.png")); - - // bakgrunn = ImageIO.read(getClass().getResourceAsStream("/graphics/bakgrunn.jpg")); + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_right2.png")); + }catch(IOException e) { e.printStackTrace(); } - } else if (gp.getPlayerState() == PlayerState.FASTER) { + } else if (playerState == PlayerState.FASTER) { try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_right2.png")); - - // bakgrunn = ImageIO.read(getClass().getResourceAsStream("/graphics/bakgrunn.jpg")); + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_right2.png")); }catch(IOException e) { e.printStackTrace(); } - } else if (gp.getPlayerState() == PlayerState.VOI) { + } else if (playerState == PlayerState.VOI) { try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_default2.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_default1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_right2.png")); - - // bakgrunn = ImageIO.read(getClass().getResourceAsStream("/graphics/bakgrunn.jpg")); + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default2.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_right2.png")); }catch(IOException e) { e.printStackTrace(); } } - + } public void update() { - if(keyH.upPressed == true || keyH.downPressed == true || keyH.leftPressed == true || keyH.rightPressed == true) { - if(keyH.upPressed == true ) { + if(keyH.upPressed1 == true || keyH.downPressed == true || keyH.leftPressed1 == true || keyH.rightPressed1 == true) { + if(keyH.upPressed1 == true ) { previousDirection = direction; direction = "up"; @@ -133,12 +133,12 @@ public class Player extends Entity{ direction = "down"; } - else if(keyH.leftPressed == true) { + else if(keyH.leftPressed1 == true) { previousDirection = direction; direction = "left"; } - else if(keyH.rightPressed == true) { + else if(keyH.rightPressed1 == true) { previousDirection = direction; direction = "right"; } @@ -147,7 +147,18 @@ public class Player extends Entity{ colliding = false; // updates to be true if Proggy collides with a solid tile - gp.collisionChecker.checkCollisionOnTile(this); + gp.collisionChecker1.checkCollisionOnTile(); + + //System.out.println("Player 1: " + worldX); + + int rightCol = ((playerSolid.width + worldX) + speed) / gp.tileSize; + int topRow = (playerSolid.y + worldY) / gp.tileSize; + int bottomRow = (worldY - playerSolid.y + playerSolid.height) / gp.tileSize; + //System.out.println("left: " + leftCol); + //System.out.println("top: " + topRow); + int cornerOne = this.gp.loader.numOfTiles[rightCol][topRow]; + int cornerTwo = this.gp.loader.numOfTiles[rightCol][bottomRow]; + System.out.println("[" + rightCol + "]" + "[" + bottomRow + "]: " + cornerTwo); // Checks playerState and sets the correct abilities to match the power-up PowerUp(); @@ -163,12 +174,12 @@ public class Player extends Entity{ fall(); break; case "right": - worldX += speed; + worldX += speed; jump(); //jump instead of fall seems to give better results currently break; case "left": - worldX -= speed; + worldX -= speed; jump(); break; @@ -191,16 +202,16 @@ public class Player extends Entity{ // gives abilities on player for the different power-ups public void PowerUp() { - if (this.gp.getPlayerState() == PlayerState.VOI) { + if (playerState == PlayerState.VOI) { speed=7; } - if (this.gp.getPlayerState() == PlayerState.FASTER) { + if (playerState == PlayerState.FASTER) { speed=7; } - if(this.gp.getPlayerState() == PlayerState.NORMAL) { + if(playerState == PlayerState.NORMAL) { speed = 5; } - if(this.gp.getPlayerState() == PlayerState.INVISIBLE) { + if(playerState == PlayerState.INVISIBLE) { speed = 5; } } @@ -208,7 +219,7 @@ public class Player extends Entity{ // jump function that makes proggy collide also when jumping public void jump() { // Proggy needs to be on the ground while button is pressed in order to jump - if(keyH.upPressed == true || (jumpStrength <= 0 && !onGround)) { + if(keyH.upPressed1 == true || (jumpStrength <= 0 && !onGround)) { //jump is initialized and depending on the previous direction we need different image sprites if(previousDirection == "right") { jumpImg = up1; @@ -217,24 +228,24 @@ public class Player extends Entity{ jumpImg = up2; } - gp.collisionChecker.checkCollisionOnTile(this); + gp.collisionChecker1.checkCollisionOnTile(); if(colliding == false) { if(onGround == true) { gp.playSoundEffect(3); // How fast the jump is upwards jumpStrength = 15; - worldY -= jumpStrength; + worldY -= jumpStrength; jumpStrength +=12; onGround = false; } else if(onGround == false && jumpStrength > 0) { - - worldY -= jumpStrength; + + worldY -= jumpStrength; jumpStrength -=1; } - gp.collisionChecker.checkCollisionOnTile(this); + gp.collisionChecker1.checkCollisionOnTile(); if(jumpStrength <=0 || colliding == true) { // setting jumpStrengt to 0 if you hit your head, so you dont keep going up jumpStrength = 0; @@ -253,22 +264,20 @@ public class Player extends Entity{ public void fall() { String originalDir = direction; direction = "down"; - gp.collisionChecker.checkCollisionOnTile(this); + gp.collisionChecker1.checkCollisionOnTile(); if(colliding == false || onGround == false) { onGround = false; direction = originalDir; - worldY += gravity; + worldY += gravity; if(gravity < 18) { gravity += 1; } - - } else { onGround = true; jumpStrength = 0; - worldY = ((worldY + speed)/gp.tileSize) *gp.tileSize; + worldY = ((worldY + speed)/gp.tileSize) *gp.tileSize; direction = originalDir; gravity = weight; @@ -278,21 +287,21 @@ public class Player extends Entity{ private void moveWhileJumping () { String originalDir = previousDirection; int moveInAir = 0; - if(keyH.leftPressed == true || keyH.rightPressed == true) { + if(keyH.leftPressed1 == true || keyH.rightPressed1 == true) { - if(keyH.leftPressed == true ) { + if(keyH.leftPressed1 == true ) { originalDir = direction; direction = "left"; moveInAir = -speed; } - if(keyH.rightPressed == true ) { + if(keyH.rightPressed1 == true ) { originalDir = direction; direction = "right"; moveInAir = speed; } - gp.collisionChecker.checkCollisionOnTile(this); + gp.collisionChecker1.checkCollisionOnTile(); if(colliding == false) { - worldX += moveInAir; + worldX += moveInAir; } } direction = originalDir; diff --git a/src/main/java/entity/Player2.java b/src/main/java/entity/Player2.java new file mode 100644 index 0000000..72b675d --- /dev/null +++ b/src/main/java/entity/Player2.java @@ -0,0 +1,348 @@ +package entity; + +import core.GamePanel; +import core.KeyHandler; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; + + +public class Player2 extends Entity { + + //public GamePanel gp; + public KeyHandler keyH; + private int weight; + private int gravity; + //int x; + //int y; + BufferedImage jumpImg = null; + + public Player2(GamePanel gp, KeyHandler keyH) { + this.gp = gp; + this.keyH = keyH; + + playerX = 520; + playerY = 515; + + /* specifying where on the character it will collide with tiles. + We set this to the whole character since it only scrolls vertically */ + playerSolid = new Rectangle(14 ,2,gp.tileSize-14, gp.tileSize-2); + + setDefaultValues(); + getPlayerImage(); + } + + private void setDefaultValues() { + worldX = 64; + worldY = 704; + speed = 5; + direction = "right"; + previousDirection = direction; + weight = 3; + jumpStrength = 0; + gravity = weight; + playerState = PlayerState.NORMAL; + } + + public void getPlayerImage() { + if (playerState == PlayerState.NORMAL) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.INVISIBLE) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.FASTER) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.VOI) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy_voi_right.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + } + } + + public void update() { + if (keyH.leftPressed2 || keyH.rightPressed2 || keyH.upPressed2) { + if (keyH.rightPressed2) { + previousDirection = direction; + direction = "right"; + //worldX += speed; + } + else if (keyH.leftPressed2) { + previousDirection = direction; + direction = "left"; + //worldX -= speed; + } + if (keyH.upPressed2) { + previousDirection = direction; + direction = "up"; + jump(); + } + + // Is the tile Proggy is located in solid? default setting is false + colliding = false; + + // updates to be true if Proggy collides with a solid tile + gp.collisionChecker2.checkCollisionOnTile(); + //System.out.println("Player 2: " + worldX); + + + int rightCol = ((playerSolid.width + worldX) + speed) / gp.tileSize; + int topRow = (playerSolid.y + worldY) / gp.tileSize; + int bottomRow = (worldY - playerSolid.y + playerSolid.height) / gp.tileSize; + //System.out.println("left: " + leftCol); + //System.out.println("top: " + topRow); + int cornerOne = this.gp.loader.numOfTiles[rightCol][topRow]; + int cornerTwo = this.gp.loader.numOfTiles[rightCol][bottomRow]; + System.out.println("[" + rightCol + "]" + "[" + bottomRow + "]: " + cornerTwo); + + PowerUp(); + + if (colliding == false) { + switch(direction) { + case "up": + jump(); + //moveWhileJumping(); + break; + case "down": + fall(); + break; + case "right": + //playerX += speed; + worldX += speed; + jump();//jump instead of fall seems to give better results currently + break; + case "left": + //playerX -= speed; + worldX -= speed; + jump(); + break; + } + } + + // Updates picture that is used for player + spriteCounter++; + if(spriteCounter>15) { + if(spriteNum == 1) { + spriteNum = 2; + } + else if(spriteNum == 2) { + spriteNum = 1; + } + spriteCounter = 0; + } + } +/* + if (keyH.rightPressed1 || keyH.leftPressed1 || keyH.upPressed1) { + //if (worldX <= gp.worldWidth && 0 <= worldX) { + int oldY = playerY; + if (keyH.leftPressed1) + //playerX += speed; + if (keyH.rightPressed1) + //playerX -= speed; + + if (keyH.upPressed1) { + if (jumpStrength <= 0) { + jumpStrength = 15; + worldY += jumpStrength; + jumpStrength -= 12; + } + if (jumpStrength > 0) { + worldY += jumpStrength; + jumpStrength +=1; + } + } + + + } + } + + */ + } + + // gives abilities on player for the different power-ups + public void PowerUp() { + if (playerState == PlayerState.VOI) { + speed=7; + } + if (playerState == PlayerState.FASTER) { + speed=7; + } + if(playerState == PlayerState.NORMAL) { + speed = 5; + } + if(playerState == PlayerState.INVISIBLE) { + speed = 5; + } + } + + // jump function that makes proggy collide also when jumping + public void jump() { + // Proggy needs to be on the ground while button is pressed in order to jump + if(keyH.upPressed2 == true || (jumpStrength <= 0 && !onGround)) { + //jump is initialized and depending on the previous direction we need different image sprites + if(previousDirection == "right") { + jumpImg = up1; + } + if(previousDirection == "left"){ + jumpImg = up2; + } + + gp.collisionChecker2.checkCollisionOnTile(); + if(colliding == false) { + if(onGround == true) { + gp.playSoundEffect(3); + // How fast the jump is upwards + jumpStrength = 15; + //playerY -= jumpStrength; + worldY -= jumpStrength; + jumpStrength +=12; + onGround = false; + } + if (onGround == false && jumpStrength > 0) { + //playerY -= jumpStrength; + worldY -= jumpStrength; + jumpStrength -=1; + } + + gp.collisionChecker2.checkCollisionOnTile(); + + if(jumpStrength <=0 || colliding == true) { + // setting jumpStrengt to 0 if you hit your head, so you dont keep going up + jumpStrength = 0; + + // how fast Proggy falls after hitting the maximum height + gravity = weight; + fall(); + } + } + } + } + + /* + public void fall() { + String originalDir = direction; + direction = "down"; + gp.collisionChecker2.checkCollisionOnTile(); + if(colliding == false || onGround == false) { + onGround = false; + direction = originalDir; + playerY += gravity; + worldY += gravity; + + if(gravity < 18) { + gravity += 1; + } + } + else { + onGround = true; + jumpStrength = 0; + playerY = ((playerY + speed)/gp.tileSize) * gp.tileSize; + worldY = ((worldY + speed)/gp.tileSize) * gp.tileSize; + direction = originalDir; + gravity = weight; + + } + } + + */ + + public void fall() { + String originalDir = direction; + direction = "down"; + gp.collisionChecker2.checkCollisionOnTile(); + if(colliding == false || onGround == false) { + onGround = false; + direction = originalDir; + worldY += weight; + + } + else { + onGround = true; + worldY = ((worldY + speed)/gp.tileSize) * gp.tileSize; + direction = originalDir; + gravity = weight; + + } + } + + public void draw(Graphics2D g2) { + BufferedImage image = null; + + int screenX = worldX - gp.player.worldX + gp.player.playerX; + int screenY = worldY - gp.player.worldY + gp.player.playerY; + + switch (direction) { + case "right": + if (spriteNum == 1) + image = right1; + if (spriteNum == 2) + image = right2; + break; + + case "left": + if(spriteNum == 1) { + image = left1; + } + if(spriteNum == 2) { + image = left2; + } + break; + case "up": + image = jumpImg; + break; + } + g2.drawImage(image, screenX, screenY, gp.tileSize,gp.tileSize, null); + } + + + +} diff --git a/src/main/java/entity/Score.java b/src/main/java/entity/Score.java index ecee40e..33fe3c2 100644 --- a/src/main/java/entity/Score.java +++ b/src/main/java/entity/Score.java @@ -20,15 +20,12 @@ public class Score extends DisplayText{ } public void showScore() { - /*if(!gp.loader.tiles[5].collission) { - coins = 50; - }*/ - + int score = gp.collisionChecker1.getCoins() + gp.collisionChecker2.getCoins(); if(gp.getLang() == Languages.NORWEGIAN) { - showScore = "Proggys ølpenger: " + gp.collisionChecker.getCoins(); + showScore = "Proggys ølpenger: " + score; } else { - showScore = "Proggy's beer money: " + gp.collisionChecker.getCoins(); + showScore = "Proggy's beer money: " + score; } } diff --git a/src/main/java/gameState/GameState.java b/src/main/java/gameState/GameState.java index a90620e..bdd9434 100644 --- a/src/main/java/gameState/GameState.java +++ b/src/main/java/gameState/GameState.java @@ -10,6 +10,7 @@ public enum GameState { PAUSED_GAME, GAME_CONTROLS, LEVELS_MENU, + MULTIPLAYER_MENU, WIN_SCREEN, WIN_SCREEN2 } diff --git a/src/main/java/gameState/InfoScreen.java b/src/main/java/gameState/InfoScreen.java index 9399a4d..093f2b0 100644 --- a/src/main/java/gameState/InfoScreen.java +++ b/src/main/java/gameState/InfoScreen.java @@ -10,8 +10,8 @@ import java.io.IOException; public class InfoScreen extends GameScreen { - Image proggyGif, shop; - BufferedImage beggar, unicef, shoes, voi, mask, proggyShoes, proggyVoi, proggyMask, proggy; + Image proggyGif; + BufferedImage beggar, unicef, shoes, voi, mask, proggyShoes, proggyVoi, proggyMask, proggy, proggy2; public int page = 1; public InfoScreen(GamePanel gp) { @@ -22,14 +22,15 @@ public class InfoScreen extends GameScreen { proggyGif = new ImageIcon(getClass().getResource("/graphics/Proggy.gif")).getImage(); try { beggar = ImageIO.read(getClass().getResourceAsStream("/enemies/uteligger.png")); - proggy = ImageIO.read(getClass().getResourceAsStream("/Player/Proggy_default1.png")); + proggy = ImageIO.read(getClass().getResourceAsStream("/Player1/Proggy_default1.png")); unicef = ImageIO.read(getClass().getResourceAsStream("/enemies/Unicef_right1.png")); shoes = ImageIO.read(getClass().getResourceAsStream("/graphics/goldshoes_powerup.png")); voi = ImageIO.read(getClass().getResourceAsStream("/graphics/voi.png")); mask = ImageIO.read(getClass().getResourceAsStream("/graphics/mask_powerup.png")); - proggyMask = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_mask_default1.png")); - proggyShoes = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_gold_default1.png")); - proggyVoi = ImageIO.read(getClass().getResourceAsStream("/player/Proggy_voi_default1.png")); + proggyMask = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default1.png")); + proggyShoes = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default1.png")); + proggyVoi = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); + proggy2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default1.png")); } catch (IOException e) { e.printStackTrace(); } @@ -76,7 +77,7 @@ public class InfoScreen extends GameScreen { line5 = "afford enough beer."; line6 = "It is important to avoid meeting Unicef charity workers with their collecting tins since"; line7 = "they won't leave him alone, even though he keeps telling them he already gives donations"; - line8 = "regularly. There are also several beggars in the streets asking for money. Proggy cannot"; + line8 = "regularly. There are also a few beggars in the streets asking for money. Proggy cannot"; line9 = "say no when they ask him, so he has to avoid them if he's going to afford any beer."; line10 = "To make things easier, there are luckily several power ups to be found in Bergen. Each"; line11 = "power up has a time limit of 10 seconds. There are scooters that boosts Proggy's speed"; diff --git a/src/main/java/gameState/LevelsMenu.java b/src/main/java/gameState/LevelsMenu.java index 5ef37e5..45af6f2 100644 --- a/src/main/java/gameState/LevelsMenu.java +++ b/src/main/java/gameState/LevelsMenu.java @@ -9,7 +9,8 @@ public class LevelsMenu extends GameScreen { public LevelsMenu(GamePanel gp) { this.gp = gp; } - + + @Override public void draw(Graphics g2) { this.setGp(gp); this.setGraphics(g2); @@ -18,9 +19,17 @@ public class LevelsMenu extends GameScreen { if (gp.getLang() == Languages.NORWEGIAN) { s5 = "ESC - Tilbake til hovedmeny"; + s1 = "NIVÅER"; + s2 = "Nivå 1 - Lett"; + s3 = "Nivå 2 - Middels"; + s4 = "Nivå 3 - Vanskelig"; } else { s5 = "ESC - Back to main menu"; + s1 = "LEVELS"; + s2 = "Level 1 - Easy"; + s3 = "Level 2 - Medium"; + s4 = "Level 3 - Hard"; } Color tranparent = new Color(0, 0, 0, 200); @@ -28,26 +37,22 @@ public class LevelsMenu extends GameScreen { g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight); this.draw(100); - s1 = "LEVELS"; g2.setColor(Color.BLACK); g2.drawString(s1, centerText(s1)-8, gp.tileSize*2); g2.setColor(Color.WHITE); g2.drawString(s1, centerText(s1), gp.tileSize*2); this.draw(50); - s2 = "Level 1 - Easy"; g2.drawString(s2, centerText(s2), gp.tileSize*5); if (cmd == 0) { g2.drawString(">", centerText(s2)-gp.tileSize, gp.tileSize*5); } - s3 = "Level 2 - Medium"; g2.drawString(s3, centerText(s3), gp.tileSize*6); if (cmd == 1) { g2.drawString(">", centerText(s3)-gp.tileSize, gp.tileSize*6); } - s4 = "Level 3 - Hard"; g2.drawString(s4, centerText(s4), gp.tileSize*7); if (cmd == 2) { g2.drawString(">", centerText(s4)-gp.tileSize, gp.tileSize*7); diff --git a/src/main/java/gameState/MultiPlayerMenu.java b/src/main/java/gameState/MultiPlayerMenu.java new file mode 100644 index 0000000..98cbb62 --- /dev/null +++ b/src/main/java/gameState/MultiPlayerMenu.java @@ -0,0 +1,46 @@ +package gameState; + +import core.GamePanel; + +import java.awt.*; + +public class MultiPlayerMenu extends GameScreen { + + public MultiPlayerMenu(GamePanel gp) { + this.gp = gp; + } + + @Override + public void draw(Graphics g2) { + this.setGp(gp); + this.setGraphics(g2); + + String oneP, twoP; + + if (gp.getLang() == Languages.NORWEGIAN) { + oneP = "En spiller"; + twoP = "To spillere"; + } + else { + oneP = "One player"; + twoP = "Two players"; + } + + Color tranparent = new Color(0, 0, 0, 200); + g2.setColor(tranparent); + g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight); + + g2.setColor(Color.WHITE); + this.draw(75); + g2.drawString(oneP, centerText(oneP), gp.tileSize*5); + if (cmd == 0) { + g2.drawString(">", centerText(oneP)-gp.tileSize, gp.tileSize*5); + } + + g2.setColor(Color.WHITE); + g2.drawString(twoP, centerText(twoP), gp.tileSize*8); + if (cmd == 1) { + g2.drawString(">", centerText(twoP)-gp.tileSize, gp.tileSize*8); + } + } +} diff --git a/src/main/java/timer/Time.java b/src/main/java/timer/Time.java index 12b23d9..4ed7a38 100644 --- a/src/main/java/timer/Time.java +++ b/src/main/java/timer/Time.java @@ -64,7 +64,7 @@ public class Time implements ActionListener{ } powerUpSeconds--; // Reduce coins by 1 for each second on a VOI - if (gp.getPlayerState() == PlayerState.VOI) { + if (gp.player.playerState == PlayerState.VOI) { // The coins before deducting int originalCoins = gp.getCoinsInCollisionChecker(); // Makes sure coins are not negative @@ -73,7 +73,7 @@ public class Time implements ActionListener{ } // If proggy has no money left, the voi trip ends if (gp.getCoinsInCollisionChecker() <= 0) { - gp.setPlayerState(PlayerState.NORMAL); + gp.player.playerState = PlayerState.NORMAL; } @@ -81,7 +81,7 @@ public class Time implements ActionListener{ if(powerUpSeconds == 0) { powerUpSeconds = 10; startPowerUpTimer = false; - gp.setPlayerState(PlayerState.NORMAL); + gp.player.playerState = PlayerState.NORMAL; gp.playSoundEffect(6); System.out.println("normal speed"); } diff --git a/src/main/resources/maps/easy.txt b/src/main/resources/maps/easy.txt index 31a2718..77bb849 100644 --- a/src/main/resources/maps/easy.txt +++ b/src/main/resources/maps/easy.txt @@ -6,10 +6,10 @@ 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 8 7 9 0 0 0 0 0 0 0 0 0 0 0 1 1 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 8 0 0 0 0 0 1 1 0 0 2 2 2 2 2 0 0 1 1 0 0 1 1 1 0 0 0 15 15 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 -15 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 +15 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 5 3 3 3 6 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 15 15 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 4 4 4 4 4 14 0 0 7 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 15 -15 0 0 0 0 0 0 0 0 0 7 8 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 3 3 3 3 3 3 3 4 0 2 7 8 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 16 6 15 +15 0 0 0 0 0 12 0 0 0 7 8 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 3 3 3 3 3 3 3 4 0 2 7 8 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 16 6 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 4 4 4 4 4 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 9 7 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 4 4 4 4 4 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 4 4 4 4 4 15 diff --git a/src/main/resources/maps/hard.txt b/src/main/resources/maps/hard.txt index 4a0a0b6..6137c1a 100644 --- a/src/main/resources/maps/hard.txt +++ b/src/main/resources/maps/hard.txt @@ -1,7 +1,6 @@ 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 -<<<<<<< HEAD 15 12 0 0 0 0 0 0 0 0 0 11 1 0 0 0 0 0 8 0 0 0 0 0 1 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 7 0 15 15 1 0 7 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 12 0 0 0 0 0 0 0 0 0 0 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 9 0 0 0 0 0 0 2 0 0 0 0 15 diff --git a/src/main/resources/player/Proggy_default1.png b/src/main/resources/player1/Proggy_default1.png similarity index 100% rename from src/main/resources/player/Proggy_default1.png rename to src/main/resources/player1/Proggy_default1.png diff --git a/src/main/resources/player/Proggy_default2.png b/src/main/resources/player1/Proggy_default2.png similarity index 100% rename from src/main/resources/player/Proggy_default2.png rename to src/main/resources/player1/Proggy_default2.png diff --git a/src/main/resources/player/Proggy_gold_default1.png b/src/main/resources/player1/Proggy_gold_default1.png similarity index 100% rename from src/main/resources/player/Proggy_gold_default1.png rename to src/main/resources/player1/Proggy_gold_default1.png diff --git a/src/main/resources/player/Proggy_gold_default2.png b/src/main/resources/player1/Proggy_gold_default2.png similarity index 100% rename from src/main/resources/player/Proggy_gold_default2.png rename to src/main/resources/player1/Proggy_gold_default2.png diff --git a/src/main/resources/player/Proggy_gold_left1.png b/src/main/resources/player1/Proggy_gold_left1.png similarity index 100% rename from src/main/resources/player/Proggy_gold_left1.png rename to src/main/resources/player1/Proggy_gold_left1.png diff --git a/src/main/resources/player/Proggy_gold_left2.png b/src/main/resources/player1/Proggy_gold_left2.png similarity index 100% rename from src/main/resources/player/Proggy_gold_left2.png rename to src/main/resources/player1/Proggy_gold_left2.png diff --git a/src/main/resources/player/Proggy_gold_right1.png b/src/main/resources/player1/Proggy_gold_right1.png similarity index 100% rename from src/main/resources/player/Proggy_gold_right1.png rename to src/main/resources/player1/Proggy_gold_right1.png diff --git a/src/main/resources/player/Proggy_gold_right2.png b/src/main/resources/player1/Proggy_gold_right2.png similarity index 100% rename from src/main/resources/player/Proggy_gold_right2.png rename to src/main/resources/player1/Proggy_gold_right2.png diff --git a/src/main/resources/player/Proggy_gold_up1.png b/src/main/resources/player1/Proggy_gold_up1.png similarity index 100% rename from src/main/resources/player/Proggy_gold_up1.png rename to src/main/resources/player1/Proggy_gold_up1.png diff --git a/src/main/resources/player/Proggy_gold_up2.png b/src/main/resources/player1/Proggy_gold_up2.png similarity index 100% rename from src/main/resources/player/Proggy_gold_up2.png rename to src/main/resources/player1/Proggy_gold_up2.png diff --git a/src/main/resources/player/Proggy_left1.png b/src/main/resources/player1/Proggy_left1.png similarity index 100% rename from src/main/resources/player/Proggy_left1.png rename to src/main/resources/player1/Proggy_left1.png diff --git a/src/main/resources/player/Proggy_left2.png b/src/main/resources/player1/Proggy_left2.png similarity index 100% rename from src/main/resources/player/Proggy_left2.png rename to src/main/resources/player1/Proggy_left2.png diff --git a/src/main/resources/player/Proggy_mask_default1.png b/src/main/resources/player1/Proggy_mask_default1.png similarity index 100% rename from src/main/resources/player/Proggy_mask_default1.png rename to src/main/resources/player1/Proggy_mask_default1.png diff --git a/src/main/resources/player/Proggy_mask_default2.png b/src/main/resources/player1/Proggy_mask_default2.png similarity index 100% rename from src/main/resources/player/Proggy_mask_default2.png rename to src/main/resources/player1/Proggy_mask_default2.png diff --git a/src/main/resources/player/Proggy_mask_left1.png b/src/main/resources/player1/Proggy_mask_left1.png similarity index 100% rename from src/main/resources/player/Proggy_mask_left1.png rename to src/main/resources/player1/Proggy_mask_left1.png diff --git a/src/main/resources/player/Proggy_mask_left2.png b/src/main/resources/player1/Proggy_mask_left2.png similarity index 100% rename from src/main/resources/player/Proggy_mask_left2.png rename to src/main/resources/player1/Proggy_mask_left2.png diff --git a/src/main/resources/player/Proggy_mask_right1.png b/src/main/resources/player1/Proggy_mask_right1.png similarity index 100% rename from src/main/resources/player/Proggy_mask_right1.png rename to src/main/resources/player1/Proggy_mask_right1.png diff --git a/src/main/resources/player/Proggy_mask_right2.png b/src/main/resources/player1/Proggy_mask_right2.png similarity index 100% rename from src/main/resources/player/Proggy_mask_right2.png rename to src/main/resources/player1/Proggy_mask_right2.png diff --git a/src/main/resources/player/Proggy_mask_up1.png b/src/main/resources/player1/Proggy_mask_up1.png similarity index 100% rename from src/main/resources/player/Proggy_mask_up1.png rename to src/main/resources/player1/Proggy_mask_up1.png diff --git a/src/main/resources/player/Proggy_mask_up2.png b/src/main/resources/player1/Proggy_mask_up2.png similarity index 100% rename from src/main/resources/player/Proggy_mask_up2.png rename to src/main/resources/player1/Proggy_mask_up2.png diff --git a/src/main/resources/player/Proggy_right1.png b/src/main/resources/player1/Proggy_right1.png similarity index 100% rename from src/main/resources/player/Proggy_right1.png rename to src/main/resources/player1/Proggy_right1.png diff --git a/src/main/resources/player/Proggy_right2.png b/src/main/resources/player1/Proggy_right2.png similarity index 100% rename from src/main/resources/player/Proggy_right2.png rename to src/main/resources/player1/Proggy_right2.png diff --git a/src/main/resources/player/Proggy_up1.png b/src/main/resources/player1/Proggy_up1.png similarity index 100% rename from src/main/resources/player/Proggy_up1.png rename to src/main/resources/player1/Proggy_up1.png diff --git a/src/main/resources/player/Proggy_up2.png b/src/main/resources/player1/Proggy_up2.png similarity index 100% rename from src/main/resources/player/Proggy_up2.png rename to src/main/resources/player1/Proggy_up2.png diff --git a/src/main/resources/player/Proggy_voi_default1.png b/src/main/resources/player1/Proggy_voi_default1.png similarity index 100% rename from src/main/resources/player/Proggy_voi_default1.png rename to src/main/resources/player1/Proggy_voi_default1.png diff --git a/src/main/resources/player/Proggy_voi_default2.png b/src/main/resources/player1/Proggy_voi_default2.png similarity index 100% rename from src/main/resources/player/Proggy_voi_default2.png rename to src/main/resources/player1/Proggy_voi_default2.png diff --git a/src/main/resources/player/Proggy_voi_left2.png b/src/main/resources/player1/Proggy_voi_left2.png similarity index 100% rename from src/main/resources/player/Proggy_voi_left2.png rename to src/main/resources/player1/Proggy_voi_left2.png diff --git a/src/main/resources/player/Proggy_voi_right2.png b/src/main/resources/player1/Proggy_voi_right2.png similarity index 100% rename from src/main/resources/player/Proggy_voi_right2.png rename to src/main/resources/player1/Proggy_voi_right2.png diff --git a/src/main/resources/player/Proggy_voi_up1.png b/src/main/resources/player1/Proggy_voi_up1.png similarity index 100% rename from src/main/resources/player/Proggy_voi_up1.png rename to src/main/resources/player1/Proggy_voi_up1.png diff --git a/src/main/resources/player/Proggy_voi_up2.png b/src/main/resources/player1/Proggy_voi_up2.png similarity index 100% rename from src/main/resources/player/Proggy_voi_up2.png rename to src/main/resources/player1/Proggy_voi_up2.png diff --git a/src/main/resources/player2/Proggy2_default1.png b/src/main/resources/player2/Proggy2_default1.png new file mode 100644 index 0000000000000000000000000000000000000000..4d026a164a9910e45e8a8c3b62f426fb80d545e4 GIT binary patch literal 825 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz_i%Y#W5s; zb8D!fzo?_YJ>@-3ZKt@B7c}-=5d6ccW@aW977*l+>)^A7=h%&?8&S7!>^Tyzuu!?= zh6hJW)AR|~BQh-B-!8wu@8-^%d#!tB-+BA)jrsi=6_@%zR z$DVwfdyr$(mxN<~_v|d5VYuPggzBVSTrX7`B#kEY&#DZ3(*7`4`@hOmo|$}nMK;m; zajop{ZWOQE#DDeUu`{bf6}|cSSn4+awsJPNjJjLX>8fq+u(@Jso9G_3?|RGU-~WAc z(^8AAwzrw$G%O5@*`D?oud_USt#r#Y&QJ&c-xI!PI&Nb+(PY1Tb@yjK&#ODG9r3s( z8DTl){=IiQTHU+vg>yH_Zc}HMFT6L?yqr_|f0bR)S0@FQCr_QLwT~z&%5ZCIxJuDd=A-!v6%sjUATkMC43~Yun+-a$ETt8|?Ju0>fJlrq8 z?{muQ>D6i56prRjZ`pKy;-oBRyBpzi|GQ*&{IzUb{MGSh#h`L=PF-v7{`0+Y3Ac&+;`gNmr`Ip(sLyN^6L@QU zP&sCAX2?0Fm(~h~f!`Lr5lUVc$@w`zGMFjo)!Ivwg}ygthj)8?WQpn8u;!RZ2unmn z%i)TPx6do}c&OAH3MTzzDAV5`!ku#G|E_=ByNnejExrd!gOaVMtDnm{r-UW|rkG*@ literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_default2.png b/src/main/resources/player2/Proggy2_default2.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0eaf8a6f4a18cadb5044558e25528756293138 GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz_iZO#W5s; zb8VPycc`I&ub6I*SfZ|r;P#7o8-@R}9?H(qS+ix!g(AT}41yv@qqw89rKJzXFUV0Z z%Ui4y5t*C3aL8=*Crpi7%0^v(4X?|+u3%` zlg2qU2X1stxs|+hm)3;lL)**O=lsd|`{nCqNAIdt21+X}CNStNsEe3hV_|u#ZGC9# zI#2m8Oh;60=FF4^IntU#l}sh-Ar-Tgbh96hry$;nlHV#mxA zetT{d)XV9}u4+(R-li*h@MYuU#u+wlRm$xOnS8V5!&`s-F17S^&q|8Cvp9tBBy}8S)K?C7F1;$?Ft7ViPvWJ=)7wpW^`$lh^#G-c?^ED>cD?NYT-(r)W?4ho+g}Kf)w==uwGD`;c zrV3578!A59JWF5aHNJh=pmq1 z-iS_K(b%fP+Pb0Zt6l3F-MlW1SL<3-mCy95q#gabrD5y!y#MS>X_jRiw;#U)rC?82 LKbLh*2~7+D0kUI7 literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_gold_default1.png b/src/main/resources/player2/Proggy2_gold_default1.png new file mode 100644 index 0000000000000000000000000000000000000000..c55339f62562e5ef126b24d7de170ce8cec3ecb8 GIT binary patch literal 861 zcmV-j1ETziP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>$4Nv%R9Fe6S3QhPK@^^cEnZ(!M$vBnS8Ga38*HIm{SX zW5_*YYK2q@V1*>|tc3?f-k*H$#h;c^0Mq0E$LG?88}Wm5>^Zm9$L@Gz;nAy*tp^5( zZ(qGtfSbA&E?&c;7aKvl@W>5|Jb?R@H;?c6*|Oy@wY_)*yiiDD< zLKkqRL%@d|L9qj(Vt8q)0 zu=A_uncD}5K*-C7>r;@Aw(j%%n7kY5!%_vswEhSI8zAs$kXv6M)NSO(*Z9)1I1{y_`Mce-65Bu zB_UFoZ~gqFbT1`reobMrklb-3his7}QB;s;6&`U3h1Fgr0(6K}jjC9gj?3+9;u8TR zF%n0t%J3!p6fNURImv;q?z`*37C&D%s|6@-y9AWyoG58G#Djgo`B$_Kv0ukXv|cF3 zjz4oNOXm`hxyh`FL+=WJI^P1m^$YX* z@*0ZxpCix$l6`?Zi3^)f=d2)o2V_iAy=c3PG1u&b=~Tv?fSh`(^@PNI;MxTdIh+`m zy@Wqso^*eYzV(5-$J2j3F{`jxd-SBuJ00@;1QA)`mZJeV$N0nx_v6>H-v%L84*c87 n%XWYQHea1`JGmJ!*XI2Lj;Sn7S1xjG00000NkvXXu0mjfF}ir% literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_gold_default2.png b/src/main/resources/player2/Proggy2_gold_default2.png new file mode 100644 index 0000000000000000000000000000000000000000..d3156cc4d5790d18ef7af0e981c905c936d2176d GIT binary patch literal 861 zcmV-j1ETziP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>#z{m$R9FeERy}AHK@i@H3MvwW zScnp|(Jt7Dc7lcQ8XF5MEiJSZAu5RAAJ$sfTHDwNf(WTh(utjE6d{#WEMB3!^S*sM zlkevC?;s2Jc6Rog@0*?3J6_{Pj%()^TM2o$xzq5P{bHBqrUa0E2%SE*;C}p`Im{Ta zF?cN)B9wS$3Imda0}0>)>VtL6hm)gicuG~MY5^xCRgf8bV$1yK&O;wkb8q&% z1(NK_jeD*;J?>6cV@w5_?O#8IKRXMqBo2~nb`h2K7 z-Vfy10TBqI%oyms_=rotn86oKDC#5GSI&-K3hMXF_OSFUn^v|ddr>3KUsV2y41T6x=2EhogqYGinXmOCcvdu zmW%;B#Wb-bIDGedv$wN}L{1N~UTaK<#@LGn9P@EpGJ(yLFBG@p<{un&kYR~qtrCoI zGG8(Q(&(8eDfiI|Uby()t$(@7F-?a_{+CE4&~%?!{*>z5a^~zCw>7z?0uUTCH^g$b8VB=`+9HxADmxzVsRPp2g*eS`j{SaMexME=y9SBu2$$ nUqhT2W9sI!W>7H3#Qg`#OiAu21U(u60000s* literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_gold_left1.png.png b/src/main/resources/player2/Proggy2_gold_left1.png.png new file mode 100644 index 0000000000000000000000000000000000000000..5e86c3fc97e96f3c0e6b8d71603f3c30d2582c2a GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz_iTM#W5s; zb8XoEY%xcHyWL!FDoZv99c);ep!`zgpkC|L4zYinjvShQq&!n~TqgYCEK8cIG?n9) zWDZNTqhiETj*UB%CVjqlZ|~VVZ{EK+P`lgO+W7t1H+Sw`pTV_r|DFpM|J;3-*!=U? zsig18|8K0Cu6K6kbZd6rH#_`)-^ge_Vz$!Vf#teV<3{!C3X9%4zgAMVnAF0;$-0EE zOf}TPyZy?EOZGKi&dl0-iAnQzW$x35b8@Vu*S)x?*C85Wv_Z;RQbJ`(k8iqIS=%DH zT3becK~2?!gXizgFy>j)WR>9ARs7WW;2fP73y$?gdfGNOg{(Y~uJW#+*jIvuJ%Qtg z$&ynq(=YKf%CGx#vO@GuNNr1oXwXGQy?(urx*y@83R49ceq?+QxfsKLVEaqvUEu-K zXJtz)()S2@wQ>1jo-cRX~_NkYpYl`tn~b{O2f}rxXRH%jlr#H z!*l1k=GO#1%n594+0h?Fom}1-qUd!fS$A=7@#{akYxAb3+wC_Oe^+zB=2>*AJhxHO z?7joy=g<56{;2oWP-yG7pY}^nNL-qgSi++;IqLWRSFL6OPPc=-Kq=SL)z4*}Q$iB} D{SaFJ literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_gold_right1.png b/src/main/resources/player2/Proggy2_gold_right1.png new file mode 100644 index 0000000000000000000000000000000000000000..311bdbf3bb9855e6eeed20b7ee80ca6bf8234aab GIT binary patch literal 843 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 LPDHLkV1fVum!Eu; literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_gold_up2.png b/src/main/resources/player2/Proggy2_gold_up2.png new file mode 100644 index 0000000000000000000000000000000000000000..deed917db7f2d78c3a7fb5da043d744b1d9b2df2 GIT binary patch literal 870 zcmV-s1DX7ZP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>&`Cr=R9FeERKIH#K@gscTG#|J zf*^u|tzaW5EmFS1N<<6)gohv^rjb;}N|5{sc4B2A2nu4CU?W%>h#-QX77W4U{1KsCOABjJ>GOpzojOhT1x@Vg=<<#jj!Xjh> z8wB>t>yMx|VIM|hPw-JeiU25rf@m`Yv!_iB^A~ZjD`NE>an1qU`rXmZB{^813AzB` zsiCtYI6dO5ASZ~$Q&Zm%39PN$k^RYU1R=&PKc6@2*SlFlLQ(uHv|SiSyIlhwOtEfM zLZA{raSD?9pd`T`*U%NTx+<*%;^{5o z?)$0y#Rx1!(=A96R*s*P+^G@t?fVyv1u-wltkscuwRWHjpbC*Yb+0($nnsY}G-z_Z zIL6_AzFy;XiYt70;4}U~z%jQ#fnL4%AcwYJTF}^PKN|Pr;J(PVb^kvd;0{taUCsYb wOccD*+8E<2HP1h`uR^a6SjuBu$-hwM58dH~qddH#`Tzg`07*qoM6N<$g54Hz9RL6T literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_left1.png b/src/main/resources/player2/Proggy2_left1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ff2e71efd80ca8b5f5460b692bb781e4f49903 GIT binary patch literal 807 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_mask_left1.png b/src/main/resources/player2/Proggy2_mask_left1.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd392c5d39ab5250a61b9538dc874bc55c2692b GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz_iEH#W5s; zb8VP)wt%C+J#Ud7*9i~!4Q{k3L}wnj4(Qwf0H+R2}LiF<(zm&R?Xm=kE~0~{|RwVS{x=BI684=HphF4 z_8BOcZvJvT-zFe$b+&es(c^@}2HK%TB6YE$Qoq~gZkcYTcYb}wOs0ld>l_vT{q-}S z9>0G6Ld&nFcefZgq|;0?`Wy=R8Fu)tF)R4@EZ1?SHP_7oot<_oloXbV%)e)&o>pRK zzFlLM+tPE-^s}6lV)y+I^6~Kt7A^0qz4~eL{pQ;3U$tc;+x(O&U*6-+oi$_5rBCnr z^P~QKcp>&=(Vb9HhieimGTY;=e_Zns^3*G<{1U6`BL6_cz$YN=!QaEIg*BxiYv130 z8+XyGGh|8Efg6wCZEZYqJ#Mcs3#&tXnc=>RqF*0;W|*fG^m{SYzG-7n4bALXB$p>`XyPis+yxF|C_&> z)}@(#AzQfm<}YQsW3wyZr(i&6Pn<9TUI z^4Z#~gu@r^-dK5Y_b;JG-R%dzH*#jU&5A$8ZSAeLqdh!`(Rll$owI8THPZC%OVd`mOdP zr8pml>2eSJe)`(^F5wCklFK%Z)?c0QhqEx{U&ZP_#Vk>G7-z5;xO-grB`)9C`8WRQ a{tdqB9#8Eu6hZ0P)78&qol`;+0|Nj)vSQ)@ literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_mask_left2.png b/src/main/resources/player2/Proggy2_mask_left2.png new file mode 100644 index 0000000000000000000000000000000000000000..f20310d2aca596be394e8e852d08980051414675 GIT binary patch literal 861 zcmV-j1ETziP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>#Ysd#R9FeER=sN%K@i=G3ThEV zEG-lp5y3)9r=1q5#ShRwAw(rYR1gvT0D~V`S}G|10YS9WPP7n$*oYREB9bP8lJ(x) zzRBEX_ipcW;C?$hGyC4#*}MB)Z(XiB<}1&tCAfF0?Dc`nAT^>v}>2&@oxfg^JCIUR~|^plClFY zZ_K)_w>Lv z?KnlgJpHFt3en*>`GmMwfc)XS*}0%+4FrJ4U@hc&0&v@vu6ipX79hBXzs)H=cZNV0 zDC&6CbvR?W;x$$zFp~n%0c-ZgAqn$#4)FNtsOu^#0`;))$K~~IlxXv#=VM~5YrPLZ zXu(50Yt3?T^>O9~51qY`d==*a6p*`IajS0X$a9UqeSJdxoI`Tvd&yW>kABbohdTYd zG}9tSA_(ZhjJsRq-UCXMazH-P)`?5rgc10do#Nm^uuk#-bv#u;y7KHgWk3 nXD)~+!v3#EUe*ufnGh>)02;l$#002ovPDHLkV1fVu^3`xx literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_mask_right1.png b/src/main/resources/player2/Proggy2_mask_right1.png new file mode 100644 index 0000000000000000000000000000000000000000..f2707faf0352f9fb7de36aba75300cef12227eba GIT binary patch literal 843 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz_iuV#W5s; zb8DDwcBrGkU2U#gES%HC*rWvyI(cR;Ke1YM>a=MG`9&6)Wtub{27gm-+@4&xK91Ue7x@ue9v_zP-h+;`eUfygRe_+?hM;k4YYHy}9z+(Td$W4Xtj} z{o11(=+5`H@N{;(lum)4#*d5dW}oe|G;G*9VGc*Sn4%iv3BH@x+QgDo+2htTOq<5! zvBhBjj2AoiZ+fwVUHWiPV^-ACGmcJ%hlKul$aVNWvD%m6%uv<;^Xx0%zh^F z+pjZRy*2(De=v7RS%XdO%Uz#cICtG^e(SEk?dD1AZFM_(m-h<<%P!Z8EA~~sqsCah zI^)%cJ9E|Zs-9Kc*}3z7>=yZ&|C{$e{oBSf`4q#Ad3*m_B>A70>Hc=@`1gx-rSG+J zjMpt?`p9YC8S>s;)ot-I6CwGCTYIDT>-{OpU~N-NWsSSH_t3w?OWS&jB~_R68QOfG zdq;Gm?Jv#7O6z&CcJDR5+}5oOpRz$U?Elm`QA`s<*e@&-SXX+c|Ez4f=tORTPf~`Q zmd!kiMTA|R$?#0w`Afsk<}Xu<$`i>B?8CDd zGP|_ous!_0S*$@OA;)no)2<}3tw-4>#vJs%Tkyu2r}e<%D`Ip0zm0VW+gVVMz1MEf z8QV(kW3C1o9H$+$^1WV5Z;W8{na@uit1y|qrd`iVeBm*VyoGaQ z`W}C^EdO%EtLNv3vUz3l+kW`2a^O@EWNx1`$Fa_A;^F<@Ed?B`pCsO2*|XC$I5 T6-U_Lf)cW)tDnm{r-UW|*eqrg literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_mask_right2.png b/src/main/resources/player2/Proggy2_mask_right2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e693f40f1c6e4ef701ba2f31466401c3caddbd8 GIT binary patch literal 870 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 A*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_up1.png b/src/main/resources/player2/Proggy2_up1.png new file mode 100644 index 0000000000000000000000000000000000000000..26bac520dddad54eabec90a9772bf550bb758003 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz_j1f#W5s; zb83ifcZi|L+2}im(zr!g1VwUKrEgx6-*7ZcDe8x?*uhh|NAet91nQgSMnw8#Chok! zv8}0zqe*#FZ|kP>bF3|A&i?&rl69lG=ey&U&+n-ix9}c&dw1@|w*8iNl3Qe}r7z#w z-RxNO^-$Q4PoGT^jvbJ4e!sJB+mE-0%2+o#HF0M@ZdbBZ3R`M&K*#dH$GdyKThx0T zpI2wJ@@|y)<1c7o~g2|+%QvKpmD-<{^QB4GevSbLp!w1v^<;6%S~1P z^8ACz0&a;nEZ0=rzn*Z6k&&u?BD?AP;WCGga?%N6l$nW8)ab|LLvt z$L>P)>i-R_f{P#MN=BY*^$O#eaIb^KmE+`ALBm}$%1+~OxMAU%#tetu|9%&K zm1o>7ntM`kvP<^48o$s_QXCCc%!jg?lHwfs=G=L`lcmGsRP~X{P;UJXLs4()E|Fd zGE|$dvo>f7W7VnudxB}l4HuWXHlKMjS3lYHYv!JHH?-zE$ksm5rsh)wX0i3zy1H3ul>odhvYD e;=(WO|9?;PDQcbRQUprUp00i_>zopr7#IM}m~2r1 literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_up2.png b/src/main/resources/player2/Proggy2_up2.png new file mode 100644 index 0000000000000000000000000000000000000000..1342e10b5084926e67f2eea35ad21a97aa04357b GIT binary patch literal 855 zcmV-d1E~CoP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>zez+vR9Fd}ls}6VF%-o!ixxJE zxPl;pf~{a9TUuDY!b(I7Kf*&05x0@;)=H552zFv+;Rmo>Yy{f{1rY?b*v3M6MY-R@QL=IEred+XP_Hg~lI#UC%u`o^DstlX9JTi(qY zvwPO~A?JgYM^h5bZQ}~2CqPaMiS;2hg#7-) zs~4s;zkGhU9|;8Fb9&@K4FTSRI0izHihE-0IXTzHsHxC&1(udn&`eBg%}lfiq&dO`~3g#$4)Bf$jLwE7gWv3=$f)B%g zd+#O7ChSvWj*OQID+17jhRBR@_wsqi`XL;4MXYfk-g5xA@&3%gmixW8a;Sjm)U2fl zrzg)EHNh;Nca0s9z^$Dp?qu#5}O=Vn8`NPxNx5){s9q~;~^ zQlUh>Gxy~roj_Y=>H|iCMXfzZi2!*?p?Q;u6%De6u&y}4qB#7vdnFVBhk(9kayPEV z7OJu2wXv{{Um1Ho_1uqWTsKKlO;yyYROUY;h{+i>P$3TXcI@7Kt$hh7iMJ?_0A0Oy z=#Cf5=o=cwb>kvYbPj=@=9uQjhLdSiU%_Odf=BP~Y8mIC3Q||Cl|VebMLhnrbpLS$ z7NY4ZND6k&U2wTmll1e~cb^Nf!IHc7fy|>-fi8f0h}@}1&B<%Jf()lgS3fl8I(jTL zi8C>Vtc66AOomeEyY_UQFSi)AxPb~78=kVG240J2kz3z^S>PFEvdwW?`HD$HVEjUr h>XcWCZ}j*FxYK4rOKWwb00000NkvXXu0mjf0007ff_ne} literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_voi_left.png b/src/main/resources/player2/Proggy2_voi_left.png new file mode 100644 index 0000000000000000000000000000000000000000..98433be2706380cfbfc39289d1bdf865e45caac6 GIT binary patch literal 876 zcmV-y1C#uTP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>)Ja4^R9FeERxxW;F%-@%I=B=E zClM+*6pA1Zq@zEegE)vh5hn+yB8Y=s#I1`6;^g2YLUDBH4{$8vLvR%=6eow`(m`p= zcW%D)Brmx)dG^44$vHXad|$rg-nKIf*zNUYi?YiXmduOY!;U^<7!k)fW>raS0w92D z`|;~oT*gy>j7T*B4W5E%Lb>@6iFiA?>LfP3`%I*Ny7}B-4#S8C#7K^1sn0maCIW6J zQb%AodX8hz!~o8tA>jXx_Vc@!xPak-Uy9+_o@|_#3tIwiQh-eypiDW!;hZC4*!|G? zBd7WjBH0;s+s{URe;(|cn_I7tHHguy02-gB4YDf$*^k?g%*9J9CMAOytakUvJ%gV` z3?Kl!e*dwQ<7iSsHGNwZ2sfH45JZF5oIUGW2nhJO?f%*vZ5=s_t8p7y+NX zwq*W%?Z5vZp>28hiDr(e+r8|(1gwGBN2^0cxK=Z20?3c#=PRaxHDC$=MUZ=B z!rd5@Kdsk3l#plt;R6|+D&dcgBN5h_ml<`x;yhJA5*?^ndGpqAOpk<$Pz^0TRVX4R z3t0llA-K-xksyXk24G%9=6U(6rJqaml0yNmL2epi+L!qHjSpNmd!O!L&e{+!O^OPr z0s-~k2z%w~>#+3w+osXrVWDA?`wryF@rp*f0(fezyGMOQAS1uV7?fTow#*{}V})A& zGy?<>aSD1GenbEb6$!Xm61nq7@*);pEZ2a59q$90;-dt!wqNeL zzKlNBe5}|HIXTk`*n88d!RzMCs_%dRYcNUhWZ2ZNgP}awfP1hEQrsB)$TVa5e_(BO z)x6)?L6WR#C8Eko$8Q7#G*+>iJ18bJE{yj32Uv(ok0I6cFaQ7m07*qoM6N<$f&c*G CSbH}B literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy2_voi_right.png b/src/main/resources/player2/Proggy2_voi_right.png new file mode 100644 index 0000000000000000000000000000000000000000..f41af5f18254b3d8eb15a2d4473daf5e769d05c3 GIT binary patch literal 858 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz;wvd#W5s; zb8V=hcZ{Pzo&OdOWz98B2@1Imd`+o!4XztFiiCoedZ;!g2+mGOS8kl3<*H@vnfj1_ zgUu0T0VXj(sZ)WU|zQ1Y$=Na$l#*n3v& zPuiz*JU=d9*>%EZB}4I%rsBS|X971OTNIDI&ELOL?u`D74fFTZbX#z*dr+Eo;K+)m zy1DaLPR-2V`#EcvtSui;r#f?(Efa51QLgZt(e_9_L?gY!<|XYmhnwhWgodu)_YH? zc1(ULZ|w5r&kY-=$1$9UBtFgxdEp6&ils!*%Swi-Q?A%aPD2TOQRP z5-JdV{X-~>?f9u0_Hc(STlg}*Cu>_KsflvEH|j0k=i0X`@6MLOv%$&+R~XD)_pFn0 zDBztCU=iW1F4%CfC_7i#a^Caqy7+A;-2Mwsy|BQI>p;chW3Rq5@IA5j^EgTe~DWQph0RZV0WCQ>J literal 0 HcmV?d00001 diff --git a/src/main/resources/player2/Proggy_gold_left2.png b/src/main/resources/player2/Proggy_gold_left2.png new file mode 100644 index 0000000000000000000000000000000000000000..33a5adeb71dac372faf2b4a07b72f8f1f2bd9547 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz;wXV#W5s; zb8YDUY%xcHyWLz;DiIN$4vK3NlwVF+5X+@4sQX8_NkQ|ElpyzI7RNurIwIcP4GSLi zYpJz1Ep2l0NL6Ip<8*Ro{=0it+i%{zz1N~(`)2FS@AuBV`Fr0fkz1c0ZETAUyIvRa z;j7fMn0EUVCW9$0JN%oruD@SyI3xJ@@{}u|V+3z99bgcgCe-p zCdBV8i}tI|e%aT^f4GDFkcJ=Ax7OM($;qCqv(CDIPquh=^6_pzk(v(2?4nfytY4V~ z8iaSUf4(8L+AO4XjaY`_8YcH6FN%*y`JLBFklXzK8k6sayd_#J!WcIRiCo-ZH{ebz2@#c3gHD44`hiH@$v}Xa^RUAnce;C_hb7{QzpnT@^%ZjM5mgPBr&8Za4$0=f5%M~j{6v9AuwPJglD?|{ z#CAU!rT;sBET7JGG1mHS>o?XD^5=Hn485MMz;K8Cwc>5g1ErxsKciao9SY9p>RQ*# z@%1VoNQNrKWnQ;cs z4j=1Vn9qFT 0, "Proggy jumped out of the frame"); } - - - } diff --git a/src/test/java/tileTest/LoaderTest.java b/src/test/java/tileTest/LoaderTest.java index 595659d..3edad62 100644 --- a/src/test/java/tileTest/LoaderTest.java +++ b/src/test/java/tileTest/LoaderTest.java @@ -36,7 +36,7 @@ public class LoaderTest { p.setDefaultValues(); int startPos = p.worldY; - keyH.upPressed = true; + keyH.upPressed1 = true; p.update(); p.jump(); diff --git a/src/test/java/tileTest/ScoreTest.java b/src/test/java/tileTest/ScoreTest.java index 703d3c2..86c3fbe 100644 --- a/src/test/java/tileTest/ScoreTest.java +++ b/src/test/java/tileTest/ScoreTest.java @@ -1,15 +1,12 @@ package tileTest; -import core.CollisionCheck; import core.GamePanel; import core.KeyHandler; -import entity.Entity; import entity.Player; import entity.Score; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import tile.TileLoader; import java.io.InputStream; @@ -31,13 +28,13 @@ public class ScoreTest { @Test void testMoneyDisappears() { score = new Score(gp); - int money = gp.collisionChecker.getCoins(); + int money = gp.collisionChecker1.getCoins(); for(int i = 0; i < 5; i++) { - keyH.rightPressed = true; + keyH.rightPressed1 = true; p.update(); } - int newMoney = gp.collisionChecker.getCoins(); + int newMoney = gp.collisionChecker1.getCoins(); assertEquals(0, gp.loader.numOfTiles[1][8]); assertEquals(10, newMoney, "Coin did not disappear when Proggy tried to pick it up"); } @@ -47,10 +44,10 @@ public class ScoreTest { void testScoreIncreases() { for(int i = 0; i < 5; i++) { - keyH.rightPressed = true; + keyH.rightPressed1 = true; p.update(); } - assertEquals( 10, gp.collisionChecker.getCoins()); + assertEquals( 10, gp.collisionChecker1.getCoins()); } } -- GitLab From 403da68605a4f1a4b06f24a802874f71e67b5eb7 Mon Sep 17 00:00:00 2001 From: "Hannah.Morken" Date: Wed, 27 Apr 2022 22:52:05 +0200 Subject: [PATCH 2/4] controll-side oppdatert for spiller 2 --- src/main/java/core/CollisionCheck.java | 2 +- src/main/java/core/GamePanel.java | 3 - src/main/java/core/KeyHandler.java | 3 + src/main/java/entity/Entity.java | 5 ++ src/main/java/entity/Player.java | 5 -- src/main/java/entity/Player2.java | 6 +- src/main/java/gameState/GameControls.java | 73 +++++++++++++------- src/main/java/gameState/LevelsMenu.java | 5 +- src/main/java/gameState/MultiPlayerMenu.java | 15 ++-- 9 files changed, 74 insertions(+), 43 deletions(-) diff --git a/src/main/java/core/CollisionCheck.java b/src/main/java/core/CollisionCheck.java index 77f4db3..bc373a6 100644 --- a/src/main/java/core/CollisionCheck.java +++ b/src/main/java/core/CollisionCheck.java @@ -320,7 +320,7 @@ public class CollisionCheck { // If proggy falls out of bounds this is triggered catch(ArrayIndexOutOfBoundsException e) { outOfBounds = true; - this.player.gp.player.setGravity(0); //setting gravity equal to 0 so that Proggy doesn't fall to infinity + player.setGravity(0); //setting gravity equal to 0 so that Proggy doesn't fall to infinity } } diff --git a/src/main/java/core/GamePanel.java b/src/main/java/core/GamePanel.java index b6e46e0..3b71bed 100644 --- a/src/main/java/core/GamePanel.java +++ b/src/main/java/core/GamePanel.java @@ -295,9 +295,6 @@ public class GamePanel extends JPanel implements Runnable{ player.update(); if (gameState == GameState.RUNNING_GAME && multiGame) { player2.update(); - if (keyH.leftPressed1 || keyH.rightPressed1 || keyH.upPressed1) { - - } } } } diff --git a/src/main/java/core/KeyHandler.java b/src/main/java/core/KeyHandler.java index fc65792..f22a6ee 100644 --- a/src/main/java/core/KeyHandler.java +++ b/src/main/java/core/KeyHandler.java @@ -152,6 +152,9 @@ public class KeyHandler implements KeyListener{ gp.multiMenu.cmd = 1; } } + if (code == KeyEvent.VK_ESCAPE) + gp.gameState = GameState.LEVELS_MENU; + if (code == KeyEvent.VK_ENTER) { if (gp.multiMenu.cmd == 0) { gp.multiGame = false; diff --git a/src/main/java/entity/Entity.java b/src/main/java/entity/Entity.java index b9a5a06..e960429 100644 --- a/src/main/java/entity/Entity.java +++ b/src/main/java/entity/Entity.java @@ -25,12 +25,17 @@ public class Entity { public boolean onGround = true; + public int gravity; + //brukes til å skape animasjon på spiller og fiender public int spriteCounter = 0; public int spriteNum = 1; + public void setGravity(int gravity) { + this.gravity = gravity; + } } diff --git a/src/main/java/entity/Player.java b/src/main/java/entity/Player.java index 01dbe09..b016831 100644 --- a/src/main/java/entity/Player.java +++ b/src/main/java/entity/Player.java @@ -15,7 +15,6 @@ public class Player extends Entity{ KeyHandler keyH; private int weight; - private int gravity; private BufferedImage jumpImg = null; @@ -352,10 +351,6 @@ public class Player extends Entity{ g2.drawImage(image, playerX, playerY, gp.tileSize, gp.tileSize, null); } - - public void setGravity(int gravity) { - this.gravity = gravity; - } } diff --git a/src/main/java/entity/Player2.java b/src/main/java/entity/Player2.java index 72b675d..83dd8c8 100644 --- a/src/main/java/entity/Player2.java +++ b/src/main/java/entity/Player2.java @@ -14,7 +14,6 @@ public class Player2 extends Entity { //public GamePanel gp; public KeyHandler keyH; private int weight; - private int gravity; //int x; //int y; BufferedImage jumpImg = null; @@ -159,11 +158,13 @@ public class Player2 extends Entity { //playerX += speed; worldX += speed; jump();//jump instead of fall seems to give better results currently + fall(); break; case "left": //playerX -= speed; worldX -= speed; jump(); + fall(); break; } } @@ -247,14 +248,13 @@ public class Player2 extends Entity { jumpStrength +=12; onGround = false; } - if (onGround == false && jumpStrength > 0) { + else if (onGround == false && jumpStrength > 0) { //playerY -= jumpStrength; worldY -= jumpStrength; jumpStrength -=1; } gp.collisionChecker2.checkCollisionOnTile(); - if(jumpStrength <=0 || colliding == true) { // setting jumpStrengt to 0 if you hit your head, so you dont keep going up jumpStrength = 0; diff --git a/src/main/java/gameState/GameControls.java b/src/main/java/gameState/GameControls.java index d9eb3c8..889e7df 100644 --- a/src/main/java/gameState/GameControls.java +++ b/src/main/java/gameState/GameControls.java @@ -17,23 +17,33 @@ public class GameControls extends GameScreen { this.setGp(gp); this.setGraphics(g2); - String s1,s2,s3,s4,s5,s6; + String s1,s2,s3,s4,s5,s6,s7, s8, s9, s10, s11, s12; if(gp.getLang() == Languages.NORWEGIAN) { - s1 = "Kontroller"; - s2 = "Pil opp, W, mellombar - Hopp"; - s3 = "Venstre pil, A - Gå til venstre"; - s4 = "Høyre pil, D - Gå til høyre"; - s5 = "ESC - Pause"; - s6 = "ESC - Tilbake til hovedmeny"; + s1 = "KONTROLLER"; + s2 = "Spiller 1"; + s3 = "Pil opp, mellombar - Hopp"; + s4 = "Venstre pil - Gå til venstre"; + s5 = "Høyre pil - Gå til høyre"; + s6 = "Spiller 2"; + s7 = "W - Hopp"; + s8 = "A - Gå til venstre"; + s9 = "D - Gå til høyre"; + s10 = "ESC - Pause"; + s11 = "ESC - Tilbake til hovedmeny"; } else { s1 = "CONTROLS"; - s2 = "Arrow Up, W, Space - Jump"; - s3 = "Arrow Left or A - Move left"; - s4 = "Arrow Right or D - Move right"; - s5 = "ESC - Pause Menu"; - s6 = "ESC to go back to Main Menu"; + s2 = "Player 1"; + s3 = "Arrow Up, Space - Jump"; + s4 = "Arrow Left - Move left"; + s5 = "Arrow Right - Move right"; + s6 = "Player 2"; + s7 = "W - Jump"; + s8 = "A - Move left"; + s9 = "D - Move right"; + s10 = "ESC - Pause game"; + s11 = "ESC to go back to Main Menu"; } Color transparentRed = new Color(0, 0, 0, 200); @@ -45,22 +55,37 @@ public class GameControls extends GameScreen { g2.drawString(s1, centerText(s1)-10, gp.tileSize*2); g2.setColor(Color.WHITE); g2.drawString(s1, centerText(s1), gp.tileSize*2); - + + this.draw(60); + g2.setColor(Color.BLACK); + g2.drawString(s2, centerText(s2)-5, gp.tileSize*3); + g2.setColor(Color.WHITE); + g2.drawString(s2, centerText(s2), gp.tileSize*3); + this.draw(50); + g2.drawString(s3, centerText(s3), gp.tileSize*4-15); + + g2.drawString(s4, centerText(s4), gp.tileSize*5-30); + + g2.drawString(s5, centerText(s5), gp.tileSize*6-45); + + this.draw(60); + g2.setColor(Color.BLACK); + g2.drawString(s6, centerText(s6)-5, gp.tileSize*7-15); g2.setColor(Color.WHITE); - - g2.drawString(s2, centerText(s2), gp.tileSize*4); - - g2.drawString(s3, centerText(s3), gp.tileSize*5); - - - g2.drawString(s4, centerText(s4), gp.tileSize*6); + g2.drawString(s6, centerText(s6), gp.tileSize*7-15); + + this.draw(50); + g2.drawString(s7, centerText(s7), gp.tileSize*8-30); + + g2.drawString(s8, centerText(s8), gp.tileSize*9-45); + + g2.drawString(s9, centerText(s9), gp.tileSize*10-60); - g2.drawString(s5, centerText(s5), gp.tileSize*7); + g2.drawString(s10, centerText(s10), gp.tileSize*11-75); - g2.drawString(s6, gp.tileSize*2, gp.tileSize*10); - String s7 = ">"; - g2.drawString(s7, gp.tileSize*2-25, gp.tileSize*10); + this.draw(40); + g2.drawString(s11, centerText(s11), gp.tileSize*11); } } diff --git a/src/main/java/gameState/LevelsMenu.java b/src/main/java/gameState/LevelsMenu.java index 45af6f2..ffd8219 100644 --- a/src/main/java/gameState/LevelsMenu.java +++ b/src/main/java/gameState/LevelsMenu.java @@ -57,8 +57,9 @@ public class LevelsMenu extends GameScreen { if (cmd == 2) { g2.drawString(">", centerText(s4)-gp.tileSize, gp.tileSize*7); } - - g2.drawString(s5, centerText(s5), gp.tileSize*10); + + this.draw(40); + g2.drawString(s5, centerText(s5), gp.tileSize*9); } } diff --git a/src/main/java/gameState/MultiPlayerMenu.java b/src/main/java/gameState/MultiPlayerMenu.java index 98cbb62..82f881f 100644 --- a/src/main/java/gameState/MultiPlayerMenu.java +++ b/src/main/java/gameState/MultiPlayerMenu.java @@ -15,15 +15,17 @@ public class MultiPlayerMenu extends GameScreen { this.setGp(gp); this.setGraphics(g2); - String oneP, twoP; + String oneP, twoP, esc; if (gp.getLang() == Languages.NORWEGIAN) { oneP = "En spiller"; twoP = "To spillere"; + esc = "ESC - Tilbake til nivåmeny"; } else { oneP = "One player"; twoP = "Two players"; + esc = "ESC - Back to levels menu"; } Color tranparent = new Color(0, 0, 0, 200); @@ -32,15 +34,18 @@ public class MultiPlayerMenu extends GameScreen { g2.setColor(Color.WHITE); this.draw(75); - g2.drawString(oneP, centerText(oneP), gp.tileSize*5); + g2.drawString(oneP, centerText(oneP), gp.tileSize*4); if (cmd == 0) { - g2.drawString(">", centerText(oneP)-gp.tileSize, gp.tileSize*5); + g2.drawString(">", centerText(oneP)-gp.tileSize, gp.tileSize*4); } g2.setColor(Color.WHITE); - g2.drawString(twoP, centerText(twoP), gp.tileSize*8); + g2.drawString(twoP, centerText(twoP), gp.tileSize*7); if (cmd == 1) { - g2.drawString(">", centerText(twoP)-gp.tileSize, gp.tileSize*8); + g2.drawString(">", centerText(twoP)-gp.tileSize, gp.tileSize*7); } + + this.draw(40); + g2.drawString(esc, centerText(esc), gp.tileSize*9); } } -- GitLab From 3a2e28999a965cf210fb3bb43f869d7ae4003f67 Mon Sep 17 00:00:00 2001 From: "Hannah.Morken" Date: Thu, 28 Apr 2022 14:56:27 +0200 Subject: [PATCH 3/4] multiplayer fungerer + entity --- src/main/java/core/CollisionCheck.java | 30 +- src/main/java/core/GamePanel.java | 79 ++-- src/main/java/core/KeyHandler.java | 8 +- src/main/java/entity/Background.java | 27 +- src/main/java/entity/Entity.java | 40 +- src/main/java/entity/Player.java | 357 ------------------ src/main/java/entity/Player2.java | 348 ----------------- .../{ => entity}/enemies/EnemySetter.java | 6 +- .../{ => entity}/enemies/EntityEnemy.java | 78 ++-- .../java/{ => entity}/enemies/Unicef.java | 30 +- src/main/java/entity/player/Player.java | 193 ++++++++++ src/main/java/entity/player/Player2.java | 182 +++++++++ src/main/java/entity/player/PlayerEntity.java | 185 +++++++++ .../java/entity/{ => player}/PlayerState.java | 2 +- src/main/java/tile/TileLoader.java | 8 +- src/main/java/timer/Time.java | 37 +- src/main/resources/maps/easy.txt | 2 +- ...d_left1.png.png => Proggy2_gold_left1.png} | Bin ..._gold_left2.png => Proggy2_gold_left2.png} | Bin src/test/java/entityTest/PlayerItemsTest.java | 4 +- .../java/entityTest/PlayerMovementTest.java | 6 +- src/test/java/tileTest/LoaderTest.java | 6 +- src/test/java/tileTest/ScoreTest.java | 4 +- 23 files changed, 735 insertions(+), 897 deletions(-) delete mode 100644 src/main/java/entity/Player.java delete mode 100644 src/main/java/entity/Player2.java rename src/main/java/{ => entity}/enemies/EnemySetter.java (91%) rename src/main/java/{ => entity}/enemies/EntityEnemy.java (54%) rename src/main/java/{ => entity}/enemies/Unicef.java (73%) create mode 100644 src/main/java/entity/player/Player.java create mode 100644 src/main/java/entity/player/Player2.java create mode 100644 src/main/java/entity/player/PlayerEntity.java rename src/main/java/entity/{ => player}/PlayerState.java (87%) rename src/main/resources/player2/{Proggy2_gold_left1.png.png => Proggy2_gold_left1.png} (100%) rename src/main/resources/player2/{Proggy_gold_left2.png => Proggy2_gold_left2.png} (100%) diff --git a/src/main/java/core/CollisionCheck.java b/src/main/java/core/CollisionCheck.java index bc373a6..7ee1ed7 100644 --- a/src/main/java/core/CollisionCheck.java +++ b/src/main/java/core/CollisionCheck.java @@ -1,13 +1,13 @@ package core; -import enemies.EntityEnemy; -import entity.Entity; -import entity.PlayerState; +import entity.enemies.EntityEnemy; +import entity.player.PlayerEntity; +import entity.player.PlayerState; import gameState.GameState; public class CollisionCheck { //GamePanel gp; - Entity player; + PlayerEntity player; // The two corners of proggy to be checked for collision for each case int cornerOne, cornerTwo; @@ -25,7 +25,7 @@ public class CollisionCheck { private boolean pickedUpPowerUp = false; - public CollisionCheck(Entity player) { + public CollisionCheck(PlayerEntity player) { //this.gp = gp; this.player = player; } @@ -126,8 +126,8 @@ public class CollisionCheck { player.gp.playSoundEffect(soundEffectNr); player.playerState = state; player.gp.truePowerUpTimer(); - player.gp.player.getPlayerImage(); - player.gp.player2.getPlayerImage(); + player.gp.player1.getImage(); + player.gp.player2.getImage(); } /** * Picks up mask and sets player state to invisible @@ -246,10 +246,10 @@ public class CollisionCheck { public void checkCollisionOnTile() { // Creating the sides of the solid area of Proggy. If these sides hit a solid block, it will create a collision. - int unitLeftSide = player.playerSolid.x + player.worldX; - int unitRightSide = player.playerSolid.width + player.worldX; - int unitTopSide = player.playerSolid.y + player.worldY; - int unitBottomSide = player.worldY - player.playerSolid.y + player.playerSolid.height; + int unitLeftSide = player.solid.x + player.worldX; + int unitRightSide = player.solid.width + player.worldX; + int unitTopSide = player.solid.y + player.worldY; + int unitBottomSide = player.worldY - player.solid.y + player.solid.height; // This must be adjusted for tilesize to find the columns and rows they are at int unitLeftCol = unitLeftSide / this.player.gp.tileSize; @@ -326,10 +326,10 @@ public class CollisionCheck { public void checkEnemyOnTile(EntityEnemy entityEnemy) { // Creating the sides of the solid area of Enemy. If these sides hit a solid block, it will create a collision. - int enemyleftworldx = entityEnemy.worldX + entityEnemy.enemySolid.x; - int enemyrightworldx = entityEnemy.worldX + entityEnemy.enemySolid.x + entityEnemy.enemySolid.width; - int enemytopworldy = entityEnemy.worldY + entityEnemy.enemySolid.y; - int enemybottomworldy = entityEnemy.worldY + entityEnemy.enemySolid.y + entityEnemy.enemySolid.height; + int enemyleftworldx = entityEnemy.worldX + entityEnemy.solid.x; + int enemyrightworldx = entityEnemy.worldX + entityEnemy.solid.x + entityEnemy.solid.width; + int enemytopworldy = entityEnemy.worldY + entityEnemy.solid.y; + int enemybottomworldy = entityEnemy.worldY + entityEnemy.solid.y + entityEnemy.solid.height; // This must be adjusted for tilesize to find the columns and rows they are at int enemyLeftCol = enemyleftworldx / player.gp.tileSize; diff --git a/src/main/java/core/GamePanel.java b/src/main/java/core/GamePanel.java index 3b71bed..dc15e5c 100644 --- a/src/main/java/core/GamePanel.java +++ b/src/main/java/core/GamePanel.java @@ -8,9 +8,12 @@ import java.util.ArrayList; import javax.swing.JPanel; -import enemies.EnemySetter; -import enemies.EntityEnemy; +import entity.enemies.EnemySetter; +import entity.enemies.EntityEnemy; import entity.*; +import entity.player.Player; +import entity.player.Player2; +import entity.player.PlayerState; import gameState.*; import sound.Sound; import tile.TileLoader; @@ -53,7 +56,7 @@ public class GamePanel extends JPanel implements Runnable{ public CollisionCheck collisionChecker2; KeyHandler keyH = new KeyHandler(this); - public Player player; + public Player player1; public Player2 player2; public EntityEnemy unicef[] = new EntityEnemy[50]; public Background bg; @@ -124,8 +127,9 @@ public class GamePanel extends JPanel implements Runnable{ return gameO; } public boolean getOutOfBounds() { - boolean out = collisionChecker1.isOutOfBounds(); - return out; + boolean out1 = collisionChecker1.isOutOfBounds(); + boolean out2 = collisionChecker2.isOutOfBounds(); + return out1||out2; } private Languages lang; @@ -147,7 +151,7 @@ public class GamePanel extends JPanel implements Runnable{ //setter player state til normal før nytt player objekt blir laget //playerState = PlayerState.NORMAL; - player = new Player(this, keyH); + player1 = new Player(this, keyH); player2 = new Player2(this, keyH); //get the language chosen by player @@ -165,8 +169,8 @@ public class GamePanel extends JPanel implements Runnable{ wS = new WinScreen(this); wS2 = new WinScreen2(this); multiMenu = new MultiPlayerMenu(this); - collisionChecker1 = new CollisionCheck(player); - collisionChecker2 = new CollisionCheck(player2); + collisionChecker1 = player1.collisionChecker; + collisionChecker2 = player2.collisionChecker; eSetter.setHobo(); multiGame = false; @@ -191,23 +195,41 @@ public class GamePanel extends JPanel implements Runnable{ // Will trigger a countdown of 10 seconds that makes the powerUp disappear when it ends - public boolean pickedUpPowerUp() { - if (collisionChecker1.getPickedUpPowerUp() == true) { + public boolean p1pickedUpPowerUp() { + if (collisionChecker1.getPickedUpPowerUp()) { return true; } return false; } + + // Will trigger a countdown of 10 seconds that makes the powerUp disappear when it ends + public boolean p2pickedUpPowerUp() { + if (collisionChecker2.getPickedUpPowerUp()) { + return true; + } + return false; + } + // - public void setPickedUpPowerUp(boolean pickedUpPowerUp) { - this.collisionChecker1.setPickedUpPowerUp(pickedUpPowerUp); + public void setPickedUpPowerUp(boolean pickedUpPowerUp, int playerNum) { + if (playerNum == 1) + this.collisionChecker1.setPickedUpPowerUp(pickedUpPowerUp); + else + this.collisionChecker2.setPickedUpPowerUp(pickedUpPowerUp); } // Gets coins from CollisionChecker and is in this class so that it can be used in Time.java - public int getCoinsInCollisionChecker() { - return this.collisionChecker1.getCoins(); + public int getCoinsInCollisionChecker(int playerNum) { + if (playerNum == 1) + return this.collisionChecker1.getCoins(); + else + return this.collisionChecker2.getCoins(); } // Calls on the method from CollisionChecker that reduces coins by 1 and is in this class so that it can be used in Time.java - public void reduceCoinByOne() { - this.collisionChecker1.reduceCoins(); + public void reduceCoinByOne(int playerNum) { + if (playerNum == 1) + this.collisionChecker1.reduceCoins(); + else + this.collisionChecker2.reduceCoins(); } public void startGameThread() { @@ -285,14 +307,14 @@ public class GamePanel extends JPanel implements Runnable{ public void update() { - bg.update(); + bg.updateSprite(); gO.update(); lS.update(); if(!gO.gameOver()) { score.showScore(); if(!(gameState == GameState.GAME_OVER || gameState == GameState.WIN_SCREEN)) { - player.update(); + player1.update(); if (gameState == GameState.RUNNING_GAME && multiGame) { player2.update(); } @@ -313,10 +335,12 @@ public class GamePanel extends JPanel implements Runnable{ } public void jump() { - player.jump(); + player1.jumpP1(); + player2.jumpP2(); } public void fall() { - player.fall(); + player1.fall(); + player2.fall(); for(int i = 0; i < unicef.length; i++) { if(unicef[i] != null) { unicef[i].fall(); @@ -333,14 +357,16 @@ public class GamePanel extends JPanel implements Runnable{ bg.draw(g2); - loader.draw(g2, player.worldX); - player.draw(g2); - if (player.playerState == PlayerState.NORMAL) { - this.player.getPlayerImage(); + loader.draw(g2, player1.worldX); + player1.draw(g2); + if (player1.playerState == PlayerState.NORMAL) { + this.player1.getImage(); } if (player2.playerState == PlayerState.NORMAL) { - this.player2.getPlayerImage(); + this.player2.getImage(); } + if (multiGame) + player2.draw(g2); for(int i = 0; i < unicef.length; i++) { if(unicef[i] != null) { @@ -379,9 +405,6 @@ public class GamePanel extends JPanel implements Runnable{ timerDisplay.draw(g2); score.draw(g2); gO.draw(g2); - if (multiGame) - player2.draw(g2); - } g2.dispose(); } diff --git a/src/main/java/core/KeyHandler.java b/src/main/java/core/KeyHandler.java index f22a6ee..c479957 100644 --- a/src/main/java/core/KeyHandler.java +++ b/src/main/java/core/KeyHandler.java @@ -6,7 +6,7 @@ import gameState.Languages; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; -import entity.PlayerState; +import entity.player.PlayerState; public class KeyHandler implements KeyListener{ @@ -323,9 +323,9 @@ public class KeyHandler implements KeyListener{ } if (gp.gameState == GameState.PAUSED_GAME) { - pS = gp.player.playerState; + pS = gp.player1.playerState; gp.stopTimer(); - gp.player.playerState = PlayerState.INVISIBLE; + gp.player1.playerState = PlayerState.INVISIBLE; if (code == KeyEvent.VK_DOWN) { gp.playSoundEffect(0); gp.pause.cmd++; @@ -342,7 +342,7 @@ public class KeyHandler implements KeyListener{ } if(gp.pause.cmd == 0 && code == KeyEvent.VK_ENTER) { gp.playSoundEffect(0); - gp.player.playerState = pS; + gp.player1.playerState = pS; gp.gameState = GameState.RUNNING_GAME; gp.startTimer(); } diff --git a/src/main/java/entity/Background.java b/src/main/java/entity/Background.java index 6d52b62..b68d645 100644 --- a/src/main/java/entity/Background.java +++ b/src/main/java/entity/Background.java @@ -7,12 +7,16 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import core.GamePanel; +import entity.player.PlayerEntity; -public class Background extends Entity { +public class Background { GamePanel gp; KeyHandler keyH; BufferedImage realfag, bakgrunn; + int x, y; + int speed; + String direction; public Background(GamePanel gp, KeyHandler keyH) { this.gp = gp; @@ -23,8 +27,8 @@ public class Background extends Entity { } public void setDefaultValues() { - worldX = 0; - worldY = 515; + x = 0; + y = 515; speed = 3; direction = "down"; } @@ -40,15 +44,15 @@ public class Background extends Entity { } } - public void update() { + public void updateSprite() { if (keyH.leftPressed1 == true || keyH.rightPressed1 == true) { if (keyH.leftPressed1 == true) { direction = "left"; - worldX += speed; + x += speed; } else if (keyH.rightPressed1 == true) { direction = "right"; - worldX -= speed; + x -= speed; } } @@ -63,24 +67,17 @@ public class Background extends Entity { int worldX = worldCol * gp.tileSize; int worldY = worldRow * gp.tileSize; - int screenX = worldX - gp.player.worldX + gp.player.playerX + 63; - int screenY = worldY - gp.player.worldY + gp.player.playerY; + int screenX = worldX - gp.player1.worldX + gp.player1.playerX + 63; + int screenY = worldY - gp.player1.worldY + gp.player1.playerY; g2.drawImage(realfag, screenX, screenY, 600, 800, null); screenX += 750; while(worldCol < gp.maxWorldRow) { -// g2.drawImage(bakgrunn, screenX, screenY, 1000, 880, null); screenX += 1050; worldCol ++; } - - - } - } - - } diff --git a/src/main/java/entity/Entity.java b/src/main/java/entity/Entity.java index e960429..ae4e762 100644 --- a/src/main/java/entity/Entity.java +++ b/src/main/java/entity/Entity.java @@ -2,41 +2,33 @@ package entity; import core.GamePanel; -import java.awt.image.BufferedImage; +import java.awt.*; -import java.awt.Rectangle; +public abstract class Entity { - -public class Entity { - - public PlayerState playerState; public GamePanel gp; public int worldX, worldY; - public int playerX, playerY; public int speed; - - public BufferedImage up1, up2, down1, down2, left1, left2, right1, right2, bakgrunn; public String direction; - public String previousDirection; - - public int jumpStrength; - public Rectangle playerSolid; - public boolean colliding = false; + /* specifying where on the character it will collide with tiles. + We set this to the whole character since it only scrolls vertically */ + public Rectangle solid; + + public boolean colliding = false; public boolean onGround = true; + protected int weight; - public int gravity; + public Entity(GamePanel gp) { + this.gp = gp; + solid = new Rectangle(14 ,2,gp.tileSize-14, gp.tileSize-2); + } + public abstract void fall(); - //brukes til å skape animasjon på spiller og fiender - public int spriteCounter = 0; - public int spriteNum = 1; + public abstract void draw(Graphics2D g2); + public abstract void update(); - public void setGravity(int gravity) { - this.gravity = gravity; - } - - + public abstract void getImage(); } - diff --git a/src/main/java/entity/Player.java b/src/main/java/entity/Player.java deleted file mode 100644 index b016831..0000000 --- a/src/main/java/entity/Player.java +++ /dev/null @@ -1,357 +0,0 @@ -package entity; - -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.io.IOException; - -import javax.imageio.ImageIO; - -import core.GamePanel; -import core.KeyHandler; -import java.awt.Rectangle; - - -public class Player extends Entity{ - - KeyHandler keyH; - private int weight; - private BufferedImage jumpImg = null; - - - public Player(GamePanel gp, KeyHandler keyH) { - this.gp = gp; - this.keyH = keyH; - - playerX = 480; - playerY = 515; - - /* specifying where on the character it will collide with tiles. - We set this to the whole character since it only scrolls vertically */ - playerSolid = new Rectangle(14 ,2,gp.tileSize-14, gp.tileSize-2); - - - setDefaultValues(); - getPlayerImage(); - } - - - public void setDefaultValues() { - worldX = 64; - //jo mindre y, jo høyere opp - worldY = 512; - speed = 5; - direction = "right"; - previousDirection = direction; - weight = 3; - jumpStrength = 0; - gravity = weight; - playerState = PlayerState.NORMAL; - } -/* - public PlayerState getPlayerState() { - return this.playerState; - } - - */ - - public void getPlayerImage() { - if (playerState == PlayerState.NORMAL) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_right2.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - - } else if (playerState == PlayerState.INVISIBLE) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_right2.png")); - - - }catch(IOException e) { - e.printStackTrace(); - } - - } else if (playerState == PlayerState.FASTER) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_right2.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - - } else if (playerState == PlayerState.VOI) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default2.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_right2.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - - } - - } - - public void update() { - if(keyH.upPressed1 == true || keyH.downPressed == true || keyH.leftPressed1 == true || keyH.rightPressed1 == true) { - if(keyH.upPressed1 == true ) { - previousDirection = direction; - direction = "up"; - - } - else if(keyH.downPressed == true) { - previousDirection = direction; - direction = "down"; - - } - else if(keyH.leftPressed1 == true) { - previousDirection = direction; - direction = "left"; - - } - else if(keyH.rightPressed1 == true) { - previousDirection = direction; - direction = "right"; - } - - // Is the tile Proggy is located in solid? default setting is false - colliding = false; - - // updates to be true if Proggy collides with a solid tile - gp.collisionChecker1.checkCollisionOnTile(); - - //System.out.println("Player 1: " + worldX); - - int rightCol = ((playerSolid.width + worldX) + speed) / gp.tileSize; - int topRow = (playerSolid.y + worldY) / gp.tileSize; - int bottomRow = (worldY - playerSolid.y + playerSolid.height) / gp.tileSize; - //System.out.println("left: " + leftCol); - //System.out.println("top: " + topRow); - int cornerOne = this.gp.loader.numOfTiles[rightCol][topRow]; - int cornerTwo = this.gp.loader.numOfTiles[rightCol][bottomRow]; - System.out.println("[" + rightCol + "]" + "[" + bottomRow + "]: " + cornerTwo); - - // Checks playerState and sets the correct abilities to match the power-up - PowerUp(); - - // If collision is false, player moves. else: direction stops. - if (colliding == false) { - switch(direction) { - case "up": - jump(); - moveWhileJumping(); - break; - case "down": - fall(); - break; - case "right": - worldX += speed; - jump(); //jump instead of fall seems to give better results currently - - break; - case "left": - worldX -= speed; - jump(); - - break; - } - } - - // Updates picture that is used for player - spriteCounter++; - if(spriteCounter>15) { - if(spriteNum == 1) { - spriteNum = 2; - } - else if(spriteNum == 2) { - spriteNum = 1; - } - spriteCounter = 0; - } - } - } - - // gives abilities on player for the different power-ups - public void PowerUp() { - if (playerState == PlayerState.VOI) { - speed=7; - } - if (playerState == PlayerState.FASTER) { - speed=7; - } - if(playerState == PlayerState.NORMAL) { - speed = 5; - } - if(playerState == PlayerState.INVISIBLE) { - speed = 5; - } - } - - // jump function that makes proggy collide also when jumping - public void jump() { - // Proggy needs to be on the ground while button is pressed in order to jump - if(keyH.upPressed1 == true || (jumpStrength <= 0 && !onGround)) { - //jump is initialized and depending on the previous direction we need different image sprites - if(previousDirection == "right") { - jumpImg = up1; - } - if(previousDirection == "left"){ - jumpImg = up2; - } - - gp.collisionChecker1.checkCollisionOnTile(); - if(colliding == false) { - if(onGround == true) { - gp.playSoundEffect(3); - // How fast the jump is upwards - jumpStrength = 15; - worldY -= jumpStrength; - jumpStrength +=12; - onGround = false; - - } - else if(onGround == false && jumpStrength > 0) { - - worldY -= jumpStrength; - jumpStrength -=1; - } - - gp.collisionChecker1.checkCollisionOnTile(); - if(jumpStrength <=0 || colliding == true) { - // setting jumpStrengt to 0 if you hit your head, so you dont keep going up - jumpStrength = 0; - - // how fast Proggy falls after hitting the maximum height - gravity = weight; - fall(); - - - } - } - } - } - - - public void fall() { - String originalDir = direction; - direction = "down"; - gp.collisionChecker1.checkCollisionOnTile(); - if(colliding == false || onGround == false) { - onGround = false; - direction = originalDir; - worldY += gravity; - - if(gravity < 18) { - gravity += 1; - } - } - else { - onGround = true; - jumpStrength = 0; - worldY = ((worldY + speed)/gp.tileSize) *gp.tileSize; - direction = originalDir; - gravity = weight; - - } - } - - private void moveWhileJumping () { - String originalDir = previousDirection; - int moveInAir = 0; - if(keyH.leftPressed1 == true || keyH.rightPressed1 == true) { - - if(keyH.leftPressed1 == true ) { - originalDir = direction; - direction = "left"; - moveInAir = -speed; - } - if(keyH.rightPressed1 == true ) { - originalDir = direction; - direction = "right"; - moveInAir = speed; - } - gp.collisionChecker1.checkCollisionOnTile(); - if(colliding == false) { - worldX += moveInAir; - } - } - direction = originalDir; - } - - - public void draw(Graphics2D g2) { - BufferedImage image = null; - switch(direction) { - case "up": - image = jumpImg; - break; - case "down": - if(previousDirection == "right") { - if(spriteNum == 1) { - image = down1; - } - if(spriteNum == 2) { - image = down1; - } - } - else { - if(spriteNum == 1) { - image = down2; - } - if(spriteNum == 2) { - image = down2; - } - } - break; - case "left": - if(spriteNum == 1) { - image = left1; - } - if(spriteNum == 2) { - image = left2; - } - break; - case "right": - if(spriteNum == 1) { - image = right1; - } - if(spriteNum == 2) { - image = right2; - } - break; - } - - g2.drawImage(image, playerX, playerY, gp.tileSize, gp.tileSize, null); - } - - -} - diff --git a/src/main/java/entity/Player2.java b/src/main/java/entity/Player2.java deleted file mode 100644 index 83dd8c8..0000000 --- a/src/main/java/entity/Player2.java +++ /dev/null @@ -1,348 +0,0 @@ -package entity; - -import core.GamePanel; -import core.KeyHandler; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.IOException; - - -public class Player2 extends Entity { - - //public GamePanel gp; - public KeyHandler keyH; - private int weight; - //int x; - //int y; - BufferedImage jumpImg = null; - - public Player2(GamePanel gp, KeyHandler keyH) { - this.gp = gp; - this.keyH = keyH; - - playerX = 520; - playerY = 515; - - /* specifying where on the character it will collide with tiles. - We set this to the whole character since it only scrolls vertically */ - playerSolid = new Rectangle(14 ,2,gp.tileSize-14, gp.tileSize-2); - - setDefaultValues(); - getPlayerImage(); - } - - private void setDefaultValues() { - worldX = 64; - worldY = 704; - speed = 5; - direction = "right"; - previousDirection = direction; - weight = 3; - jumpStrength = 0; - gravity = weight; - playerState = PlayerState.NORMAL; - } - - public void getPlayerImage() { - if (playerState == PlayerState.NORMAL) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_right2.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - - } else if (playerState == PlayerState.INVISIBLE) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_right2.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - - } else if (playerState == PlayerState.FASTER) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_up1.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_up2.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_default1.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_default2.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_left1.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_left2.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_right1.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_right2.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - - } else if (playerState == PlayerState.VOI) { - try { - up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); - up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); - down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); - down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); - left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); - left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); - right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); - right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy_voi_right.png")); - - }catch(IOException e) { - e.printStackTrace(); - } - } - } - - public void update() { - if (keyH.leftPressed2 || keyH.rightPressed2 || keyH.upPressed2) { - if (keyH.rightPressed2) { - previousDirection = direction; - direction = "right"; - //worldX += speed; - } - else if (keyH.leftPressed2) { - previousDirection = direction; - direction = "left"; - //worldX -= speed; - } - if (keyH.upPressed2) { - previousDirection = direction; - direction = "up"; - jump(); - } - - // Is the tile Proggy is located in solid? default setting is false - colliding = false; - - // updates to be true if Proggy collides with a solid tile - gp.collisionChecker2.checkCollisionOnTile(); - //System.out.println("Player 2: " + worldX); - - - int rightCol = ((playerSolid.width + worldX) + speed) / gp.tileSize; - int topRow = (playerSolid.y + worldY) / gp.tileSize; - int bottomRow = (worldY - playerSolid.y + playerSolid.height) / gp.tileSize; - //System.out.println("left: " + leftCol); - //System.out.println("top: " + topRow); - int cornerOne = this.gp.loader.numOfTiles[rightCol][topRow]; - int cornerTwo = this.gp.loader.numOfTiles[rightCol][bottomRow]; - System.out.println("[" + rightCol + "]" + "[" + bottomRow + "]: " + cornerTwo); - - PowerUp(); - - if (colliding == false) { - switch(direction) { - case "up": - jump(); - //moveWhileJumping(); - break; - case "down": - fall(); - break; - case "right": - //playerX += speed; - worldX += speed; - jump();//jump instead of fall seems to give better results currently - fall(); - break; - case "left": - //playerX -= speed; - worldX -= speed; - jump(); - fall(); - break; - } - } - - // Updates picture that is used for player - spriteCounter++; - if(spriteCounter>15) { - if(spriteNum == 1) { - spriteNum = 2; - } - else if(spriteNum == 2) { - spriteNum = 1; - } - spriteCounter = 0; - } - } -/* - if (keyH.rightPressed1 || keyH.leftPressed1 || keyH.upPressed1) { - //if (worldX <= gp.worldWidth && 0 <= worldX) { - int oldY = playerY; - if (keyH.leftPressed1) - //playerX += speed; - if (keyH.rightPressed1) - //playerX -= speed; - - if (keyH.upPressed1) { - if (jumpStrength <= 0) { - jumpStrength = 15; - worldY += jumpStrength; - jumpStrength -= 12; - } - if (jumpStrength > 0) { - worldY += jumpStrength; - jumpStrength +=1; - } - } - - - } - } - - */ - } - - // gives abilities on player for the different power-ups - public void PowerUp() { - if (playerState == PlayerState.VOI) { - speed=7; - } - if (playerState == PlayerState.FASTER) { - speed=7; - } - if(playerState == PlayerState.NORMAL) { - speed = 5; - } - if(playerState == PlayerState.INVISIBLE) { - speed = 5; - } - } - - // jump function that makes proggy collide also when jumping - public void jump() { - // Proggy needs to be on the ground while button is pressed in order to jump - if(keyH.upPressed2 == true || (jumpStrength <= 0 && !onGround)) { - //jump is initialized and depending on the previous direction we need different image sprites - if(previousDirection == "right") { - jumpImg = up1; - } - if(previousDirection == "left"){ - jumpImg = up2; - } - - gp.collisionChecker2.checkCollisionOnTile(); - if(colliding == false) { - if(onGround == true) { - gp.playSoundEffect(3); - // How fast the jump is upwards - jumpStrength = 15; - //playerY -= jumpStrength; - worldY -= jumpStrength; - jumpStrength +=12; - onGround = false; - } - else if (onGround == false && jumpStrength > 0) { - //playerY -= jumpStrength; - worldY -= jumpStrength; - jumpStrength -=1; - } - - gp.collisionChecker2.checkCollisionOnTile(); - if(jumpStrength <=0 || colliding == true) { - // setting jumpStrengt to 0 if you hit your head, so you dont keep going up - jumpStrength = 0; - - // how fast Proggy falls after hitting the maximum height - gravity = weight; - fall(); - } - } - } - } - - /* - public void fall() { - String originalDir = direction; - direction = "down"; - gp.collisionChecker2.checkCollisionOnTile(); - if(colliding == false || onGround == false) { - onGround = false; - direction = originalDir; - playerY += gravity; - worldY += gravity; - - if(gravity < 18) { - gravity += 1; - } - } - else { - onGround = true; - jumpStrength = 0; - playerY = ((playerY + speed)/gp.tileSize) * gp.tileSize; - worldY = ((worldY + speed)/gp.tileSize) * gp.tileSize; - direction = originalDir; - gravity = weight; - - } - } - - */ - - public void fall() { - String originalDir = direction; - direction = "down"; - gp.collisionChecker2.checkCollisionOnTile(); - if(colliding == false || onGround == false) { - onGround = false; - direction = originalDir; - worldY += weight; - - } - else { - onGround = true; - worldY = ((worldY + speed)/gp.tileSize) * gp.tileSize; - direction = originalDir; - gravity = weight; - - } - } - - public void draw(Graphics2D g2) { - BufferedImage image = null; - - int screenX = worldX - gp.player.worldX + gp.player.playerX; - int screenY = worldY - gp.player.worldY + gp.player.playerY; - - switch (direction) { - case "right": - if (spriteNum == 1) - image = right1; - if (spriteNum == 2) - image = right2; - break; - - case "left": - if(spriteNum == 1) { - image = left1; - } - if(spriteNum == 2) { - image = left2; - } - break; - case "up": - image = jumpImg; - break; - } - g2.drawImage(image, screenX, screenY, gp.tileSize,gp.tileSize, null); - } - - - -} diff --git a/src/main/java/enemies/EnemySetter.java b/src/main/java/entity/enemies/EnemySetter.java similarity index 91% rename from src/main/java/enemies/EnemySetter.java rename to src/main/java/entity/enemies/EnemySetter.java index 92a790f..4413adc 100644 --- a/src/main/java/enemies/EnemySetter.java +++ b/src/main/java/entity/enemies/EnemySetter.java @@ -1,10 +1,6 @@ -package enemies; - -import java.util.ArrayList; +package entity.enemies; import core.GamePanel; -import entity.PlayerState; -import entity.Entity; public class EnemySetter { diff --git a/src/main/java/enemies/EntityEnemy.java b/src/main/java/entity/enemies/EntityEnemy.java similarity index 54% rename from src/main/java/enemies/EntityEnemy.java rename to src/main/java/entity/enemies/EntityEnemy.java index f2addc2..8c6354e 100644 --- a/src/main/java/enemies/EntityEnemy.java +++ b/src/main/java/entity/enemies/EntityEnemy.java @@ -1,44 +1,27 @@ -package enemies; +package entity.enemies; import java.awt.image.BufferedImage; import core.GamePanel; -import entity.PlayerState; +import entity.Entity; +import entity.player.PlayerState; import java.awt.Graphics2D; import java.awt.Rectangle; -public class EntityEnemy { - - - public int worldX, worldY; - public int playerX, playerY; - public int speed; +public abstract class EntityEnemy extends Entity { - protected BufferedImage unicefLeft; - protected BufferedImage unicefRight; - public String direction; - public String previousDirection; - - public Rectangle playerSolid; - public Rectangle enemySolid; - public boolean colliding = false; - public boolean onGround = false; - private int gravity = 3; - private int weight = 8; - - public EntityEnemy[] allEnemies ; - - public PlayerState enemyState = PlayerState.NORMAL; - - public int distance; + protected BufferedImage unicefLeft, unicefRight; public int movementCount = 0; - - public void setAction() { - + public EntityEnemy(GamePanel gp) { + super(gp); + weight = 8; } + public abstract void setAction(); + + @Override public void update() { setAction(); @@ -61,18 +44,15 @@ public class EntityEnemy { break; } } + } - + @Override + public void getImage() { } GamePanel gp; - - - public EntityEnemy(GamePanel gp) { - this.gp = gp; - - } - + + @Override public void fall() { String originalDir = direction; direction = "down"; @@ -88,22 +68,21 @@ public class EntityEnemy { onGround = true; worldY = ((worldY + speed)/gp.tileSize) * gp.tileSize; direction = originalDir; - gravity = weight; - } } - + + @Override public void draw(Graphics2D g2) { BufferedImage image = null; - int screenX = worldX - gp.player.worldX + gp.player.playerX; - int screenY = worldY - gp.player.worldY + gp.player.playerY; + int screenX = worldX - gp.player1.worldX + gp.player1.playerX; + int screenY = worldY - gp.player1.worldY + gp.player1.playerY; - if(worldX + gp.tileSize > gp.player.worldX - gp.player.playerX && - worldX - gp.tileSize < gp.player.worldX + gp.player.playerX && - worldY + gp.tileSize > gp.player.worldY - gp.player.playerY && - worldY - gp.tileSize < gp.player.worldY + gp.player.playerY) { + if(worldX + gp.tileSize > gp.player1.worldX - gp.player1.playerX && + worldX - gp.tileSize < gp.player1.worldX + gp.player1.playerX && + worldY + gp.tileSize > gp.player1.worldY - gp.player1.playerY && + worldY - gp.tileSize < gp.player1.worldY + gp.player1.playerY) { switch(direction) { case "enemyLeft": @@ -113,15 +92,12 @@ public class EntityEnemy { case "enemyRight": image = unicefRight; break; - + case "down": image = unicefRight; break; - } - - // if(gp.collisionChecker.looseMoney(gp.player, gp.unicef) == true) { - // image = uteliggerglad; - // } + } + g2.drawImage(image, screenX, screenY, gp.tileSize, gp.tileSize, null); } diff --git a/src/main/java/enemies/Unicef.java b/src/main/java/entity/enemies/Unicef.java similarity index 73% rename from src/main/java/enemies/Unicef.java rename to src/main/java/entity/enemies/Unicef.java index 1b689f0..8b80168 100644 --- a/src/main/java/enemies/Unicef.java +++ b/src/main/java/entity/enemies/Unicef.java @@ -1,51 +1,39 @@ -package enemies; +package entity.enemies; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import core.GamePanel; -import core.KeyHandler; -import entity.Entity; import java.awt.Rectangle; -import enemies.EntityEnemy; public class Unicef extends EntityEnemy{ - - GamePanel gp; public Unicef(GamePanel gp) { super(gp); this.gp = gp; direction = "down"; speed = 1; - enemySolid = new Rectangle(14 ,2,gp.tileSize-14, gp.tileSize-2); - - getHoboImage(); + this.getImage(); } - - public void getHoboImage() { - + + @Override + public void getImage() { try { unicefRight = ImageIO.read(getClass().getResourceAsStream("/enemies/Unicef_left1.png")); unicefLeft = ImageIO.read(getClass().getResourceAsStream("/enemies/Unicef_left2.png")); - - - }catch(IOException e) { e.printStackTrace(); } } + @Override public void setAction() { movementCount ++; - //the higher the movementcount, the longer between change of direction if(movementCount == 120) { @@ -64,12 +52,8 @@ public class Unicef extends EntityEnemy{ movementCount = 0; } - - - } - - + } } diff --git a/src/main/java/entity/player/Player.java b/src/main/java/entity/player/Player.java new file mode 100644 index 0000000..17a26fc --- /dev/null +++ b/src/main/java/entity/player/Player.java @@ -0,0 +1,193 @@ +package entity.player; + +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import core.CollisionCheck; +import core.GamePanel; +import core.KeyHandler; + + +public class Player extends PlayerEntity { + + KeyHandler keyH; + public int playerX, playerY; + + public Player(GamePanel gp, KeyHandler keyH) { + super(gp); + this.keyH = keyH; + this.collisionChecker = new CollisionCheck(this); + + playerX = 480; + playerY = 515; + + worldX = 64; + setDefaultValues(); + getImage(); + } + + @Override + public void getImage() { + if (playerState == PlayerState.NORMAL) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.INVISIBLE) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_mask_right2.png")); + + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.FASTER) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_gold_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.VOI) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default2.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_default1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player1/Proggy_voi_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } + + } + + @Override + public void update() { + if (keyH.upPressed1 == true || keyH.downPressed == true || keyH.leftPressed1 == true || keyH.rightPressed1 == true) { + if (keyH.upPressed1 == true) { + previousDirection = direction; + direction = "up"; + + } else if (keyH.downPressed == true) { + previousDirection = direction; + direction = "down"; + + } else if (keyH.leftPressed1 == true) { + previousDirection = direction; + direction = "left"; + + } else if (keyH.rightPressed1 == true) { + previousDirection = direction; + direction = "right"; + } + + // Is the tile Proggy is located in solid? default setting is false + colliding = false; + + // updates to be true if Proggy collides with a solid tile + collisionChecker.checkCollisionOnTile(); + + // Checks playerState and sets the correct abilities to match the power-up + PowerUp(); + + // If collision is false, player moves. else: direction stops. + if (colliding == false) { + switch(direction) { + case "up": + jumpP1(); + moveWhileJumping(); + break; + case "down": + fall(); + break; + case "right": + worldX += speed; + jumpP1(); //jump instead of fall seems to give better results currently + + break; + case "left": + worldX -= speed; + jumpP1(); + + break; + } + } + updateSprite(); + } + } + + // jump function that makes proggy collide also when jumping + public void jumpP1() { + // Proggy needs to be on the ground while button is pressed in order to jump + if(keyH.upPressed1 == true || (jumpStrength <= 0 && !onGround)) { + super.jump(); + } + } + + private void moveWhileJumping () { + String originalDir = previousDirection; + int moveInAir = 0; + if(keyH.leftPressed1 == true || keyH.rightPressed1 == true) { + + if(keyH.leftPressed1 == true ) { + originalDir = direction; + direction = "left"; + moveInAir = -speed; + } + if(keyH.rightPressed1 == true ) { + originalDir = direction; + direction = "right"; + moveInAir = speed; + } + collisionChecker.checkCollisionOnTile(); + if(colliding == false) { + worldX += moveInAir; + } + } + direction = originalDir; + } + + @Override + public void draw(Graphics2D g2) { + BufferedImage image = choseSprite(); + g2.drawImage(image, playerX, playerY, gp.tileSize, gp.tileSize, null); + } + + +} + diff --git a/src/main/java/entity/player/Player2.java b/src/main/java/entity/player/Player2.java new file mode 100644 index 0000000..4f3a387 --- /dev/null +++ b/src/main/java/entity/player/Player2.java @@ -0,0 +1,182 @@ +package entity.player; + +import core.CollisionCheck; +import core.GamePanel; +import core.KeyHandler; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; + + +public class Player2 extends PlayerEntity { + + public KeyHandler keyH; + + public Player2(GamePanel gp, KeyHandler keyH) { + super(gp); + this.keyH = keyH; + this.collisionChecker = new CollisionCheck(this); + + worldX = 100; + setDefaultValues(); + getImage(); + } + + @Override + public void getImage() { + if (playerState == PlayerState.NORMAL) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.INVISIBLE) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_mask_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.FASTER) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_up1.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_up2.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_default1.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_default2.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_left1.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_left2.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_right1.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_gold_right2.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + + } else if (playerState == PlayerState.VOI) { + try { + up1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + up2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + down1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + down2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + left1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + left2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_left.png")); + right1 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + right2 = ImageIO.read(getClass().getResourceAsStream("/player2/Proggy2_voi_right.png")); + + }catch(IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public void update() { + if (keyH.leftPressed2 || keyH.rightPressed2 || keyH.upPressed2) { + if (keyH.rightPressed2) { + previousDirection = direction; + direction = "right"; + } + else if (keyH.leftPressed2) { + previousDirection = direction; + direction = "left"; + } + if (keyH.upPressed2) { + previousDirection = direction; + direction = "up"; + } + + // Is the tile Proggy is located in solid? default setting is false + colliding = false; + + // updates to be true if Proggy collides with a solid tile + collisionChecker.checkCollisionOnTile(); + + PowerUp(); + + if (colliding == false) { + switch(direction) { + case "up": + jumpP2(); + moveWhileJumping(); + break; + case "down": + fall(); + break; + case "right": + worldX += speed; + //jump();//jump instead of fall seems to give better results currently + fall(); + break; + case "left": + worldX -= speed; + //jump(); + fall(); + break; + } + } + updateSprite(); + } + } + + + // jump function that makes proggy collide also when jumping + public void jumpP2() { + // Proggy needs to be on the ground while button is pressed in order to jump + if(keyH.upPressed2 == true || (jumpStrength <= 0 && !onGround)) { + super.jump(); + } + } + + private void moveWhileJumping () { + String originalDir = previousDirection; + int moveInAir = 0; + if(keyH.leftPressed2 == true || keyH.rightPressed2 == true) { + + if(keyH.leftPressed2 == true ) { + originalDir = direction; + direction = "left"; + moveInAir = -speed; + } + if(keyH.rightPressed2 == true ) { + originalDir = direction; + direction = "right"; + moveInAir = speed; + } + collisionChecker.checkCollisionOnTile(); + if(colliding == false) { + worldX += moveInAir; + } + } + direction = originalDir; + } + + @Override + public void draw(Graphics2D g2) { + int screenX = worldX - gp.player1.worldX + gp.player1.playerX; + int screenY = worldY - gp.player1.worldY + gp.player1.playerY; + BufferedImage image = choseSprite(); + g2.drawImage(image, screenX, screenY, gp.tileSize,gp.tileSize, null); + } + + + +} diff --git a/src/main/java/entity/player/PlayerEntity.java b/src/main/java/entity/player/PlayerEntity.java new file mode 100644 index 0000000..303a619 --- /dev/null +++ b/src/main/java/entity/player/PlayerEntity.java @@ -0,0 +1,185 @@ +package entity.player; + +import core.CollisionCheck; +import core.GamePanel; +import entity.Entity; + +import java.awt.*; +import java.awt.image.BufferedImage; + + +public abstract class PlayerEntity extends Entity { + + public PlayerState playerState; + + public BufferedImage up1, up2, down1, down2, left1, left2, right1, right2, jumpImg; + public String previousDirection; + + public int jumpStrength; + protected int gravity; + + public CollisionCheck collisionChecker; + + //brukes til å skape animasjon på spiller og fiender + public int spriteCounter = 0; + public int spriteNum = 1; + + public PlayerEntity(GamePanel gp) { + super(gp); + } + + protected void setDefaultValues() { + + worldY = 512; + speed = 5; + direction = "right"; + previousDirection = direction; + weight = 3; + jumpStrength = 0; + gravity = weight; + playerState = PlayerState.NORMAL; + } + + public void setGravity(int gravity) { + this.gravity = gravity; + } + + public abstract void draw(Graphics2D g2); + + protected void updateSprite() { + // Updates picture that is used for player + spriteCounter++; + if(spriteCounter>15) { + if(spriteNum == 1) { + spriteNum = 2; + } + else if(spriteNum == 2) { + spriteNum = 1; + } + spriteCounter = 0; + } + } + + protected void jump() { + //jump is initialized and depending on the previous direction we need different image sprites + if(previousDirection == "right") { + jumpImg = up1; + } + if(previousDirection == "left"){ + jumpImg = up2; + } + + collisionChecker.checkCollisionOnTile(); + if(colliding == false) { + if(onGround == true) { + gp.playSoundEffect(3); + // How fast the jump is upwards + jumpStrength = 15; + worldY -= jumpStrength; + jumpStrength +=12; + onGround = false; + + } + else if(onGround == false && jumpStrength > 0) { + worldY -= jumpStrength; + jumpStrength -= 1; + } + + collisionChecker.checkCollisionOnTile(); + if(jumpStrength <=0 || colliding == true) { + // setting jumpStrengt to 0 if you hit your head, so you dont keep going up + jumpStrength = 0; + + // how fast Proggy falls after hitting the maximum height + gravity = weight; + fall(); + } + } + } + + @Override + public void fall() { + String originalDir = direction; + direction = "down"; + collisionChecker.checkCollisionOnTile(); + if(colliding == false || onGround == false) { + onGround = false; + direction = originalDir; + worldY += gravity; + + if(gravity < 18) { + gravity += 1; + } + } + else { + onGround = true; + worldY = ((worldY + speed)/gp.tileSize) *gp.tileSize; + direction = originalDir; + //gravity = weight; + + } + } + + // gives abilities on player for the different power-ups + protected void PowerUp() { + if (playerState == PlayerState.VOI) { + speed=7; + } + if (playerState == PlayerState.FASTER) { + speed=7; + } + if(playerState == PlayerState.NORMAL) { + speed = 5; + } + if(playerState == PlayerState.INVISIBLE) { + speed = 5; + } + } + + protected BufferedImage choseSprite() { + BufferedImage image = null; + switch(direction) { + case "up": + image = jumpImg; + break; + case "down": + if(previousDirection == "right") { + if(spriteNum == 1) { + image = down1; + } + if(spriteNum == 2) { + image = down1; + } + } + else { + if(spriteNum == 1) { + image = down2; + } + if(spriteNum == 2) { + image = down2; + } + } + break; + case "left": + if(spriteNum == 1) { + image = left1; + } + if(spriteNum == 2) { + image = left2; + } + break; + case "right": + if(spriteNum == 1) { + image = right1; + } + if(spriteNum == 2) { + image = right2; + } + break; + } + return image; + } + + +} + diff --git a/src/main/java/entity/PlayerState.java b/src/main/java/entity/player/PlayerState.java similarity index 87% rename from src/main/java/entity/PlayerState.java rename to src/main/java/entity/player/PlayerState.java index f9f3b74..c503b8f 100644 --- a/src/main/java/entity/PlayerState.java +++ b/src/main/java/entity/player/PlayerState.java @@ -1,4 +1,4 @@ -package entity; +package entity.player; // Each power up will set a PlayerState with corresponding abilities. Default is NORMAL public enum PlayerState { diff --git a/src/main/java/tile/TileLoader.java b/src/main/java/tile/TileLoader.java index 54b168a..9faf7c3 100644 --- a/src/main/java/tile/TileLoader.java +++ b/src/main/java/tile/TileLoader.java @@ -166,13 +166,13 @@ public class TileLoader { int WorldX = worldCol * gp.tileSize; int WorldY = worldRow * gp.tileSize; - int screenX = WorldX - gp.player.worldX + gp.player.playerX; - int screenY = WorldY - gp.player.worldY + gp.player.playerY; + int screenX = WorldX - gp.player1.worldX + gp.player1.playerX; + int screenY = WorldY - gp.player1.worldY + gp.player1.playerY; g2.drawImage(tiles[tileNum].image, screenX, screenY, gp.tileSize, gp.tileSize, null); - if(gp.player.playerX == tiles[5].x) { - if(gp.player.playerY == tiles[5].y) { + if(gp.player1.playerX == tiles[5].x) { + if(gp.player1.playerY == tiles[5].y) { tiles[5] = tiles[0]; } } diff --git a/src/main/java/timer/Time.java b/src/main/java/timer/Time.java index 4ed7a38..097fe6e 100644 --- a/src/main/java/timer/Time.java +++ b/src/main/java/timer/Time.java @@ -5,7 +5,7 @@ import java.awt.event.ActionListener; import javax.swing.Timer; import core.GamePanel; -import entity.PlayerState; +import entity.player.PlayerState; import gameState.GameState; public class Time implements ActionListener{ @@ -57,31 +57,46 @@ public class Time implements ActionListener{ if(gp.gameState == GameState.RUNNING_GAME) { if(seconds > 0) { if(startPowerUpTimer == true) { - if (gp.pickedUpPowerUp() == true) { + if (gp.p1pickedUpPowerUp() == true) { powerUpSeconds = 10; System.out.println("updated time"); - gp.setPickedUpPowerUp(false); + gp.setPickedUpPowerUp(false, 1); + } + if (gp.p2pickedUpPowerUp() == true) { + powerUpSeconds = 10; + System.out.println("updated time"); + gp.setPickedUpPowerUp(false, 2); } powerUpSeconds--; // Reduce coins by 1 for each second on a VOI - if (gp.player.playerState == PlayerState.VOI) { + if (gp.player1.playerState == PlayerState.VOI) { + // The coins before deducting + int originalCoins = gp.getCoinsInCollisionChecker(1); + // Makes sure coins are not negative + if (originalCoins>0) { + gp.reduceCoinByOne(1); + } + // If proggy has no money left, the voi trip ends + if (gp.getCoinsInCollisionChecker(1) <= 0) { + gp.player1.playerState = PlayerState.NORMAL; + } + } + if (gp.player2.playerState == PlayerState.VOI) { // The coins before deducting - int originalCoins = gp.getCoinsInCollisionChecker(); + int originalCoins = gp.getCoinsInCollisionChecker(2); // Makes sure coins are not negative if (originalCoins>0) { - gp.reduceCoinByOne(); + gp.reduceCoinByOne(2); } // If proggy has no money left, the voi trip ends - if (gp.getCoinsInCollisionChecker() <= 0) { - gp.player.playerState = PlayerState.NORMAL; + if (gp.getCoinsInCollisionChecker(2) <= 0) { + gp.player1.playerState = PlayerState.NORMAL; } - - } if(powerUpSeconds == 0) { powerUpSeconds = 10; startPowerUpTimer = false; - gp.player.playerState = PlayerState.NORMAL; + gp.player1.playerState = PlayerState.NORMAL; gp.playSoundEffect(6); System.out.println("normal speed"); } diff --git a/src/main/resources/maps/easy.txt b/src/main/resources/maps/easy.txt index 77bb849..58d3ae4 100644 --- a/src/main/resources/maps/easy.txt +++ b/src/main/resources/maps/easy.txt @@ -6,7 +6,7 @@ 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 8 7 9 0 0 0 0 0 0 0 0 0 0 0 1 1 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 8 0 0 0 0 0 1 1 0 0 2 2 2 2 2 0 0 1 1 0 0 1 1 1 0 0 0 15 15 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 -15 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 +15 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 5 3 3 3 6 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 15 15 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 4 4 4 4 4 14 0 0 7 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 0 0 0 0 0 12 0 0 0 7 8 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 3 3 3 3 3 3 3 4 0 2 7 8 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 16 6 15 diff --git a/src/main/resources/player2/Proggy2_gold_left1.png.png b/src/main/resources/player2/Proggy2_gold_left1.png similarity index 100% rename from src/main/resources/player2/Proggy2_gold_left1.png.png rename to src/main/resources/player2/Proggy2_gold_left1.png diff --git a/src/main/resources/player2/Proggy_gold_left2.png b/src/main/resources/player2/Proggy2_gold_left2.png similarity index 100% rename from src/main/resources/player2/Proggy_gold_left2.png rename to src/main/resources/player2/Proggy2_gold_left2.png diff --git a/src/test/java/entityTest/PlayerItemsTest.java b/src/test/java/entityTest/PlayerItemsTest.java index 019a49e..b03de7a 100644 --- a/src/test/java/entityTest/PlayerItemsTest.java +++ b/src/test/java/entityTest/PlayerItemsTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; import core.GamePanel; import core.KeyHandler; -import entity.Player; +import entity.player.Player; import entity.Score; public class PlayerItemsTest { @@ -22,7 +22,7 @@ public class PlayerItemsTest { @BeforeEach void beforeEach() { this.p = new Player(gp, keyH); - p.setDefaultValues(); + //p.setDefaultValues(); } @Test diff --git a/src/test/java/entityTest/PlayerMovementTest.java b/src/test/java/entityTest/PlayerMovementTest.java index 8aa14ac..fbe0d5d 100644 --- a/src/test/java/entityTest/PlayerMovementTest.java +++ b/src/test/java/entityTest/PlayerMovementTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import core.GamePanel; import core.KeyHandler; -import entity.Player; +import entity.player.Player; import static org.junit.jupiter.api.Assertions.*; @@ -21,7 +21,7 @@ public class PlayerMovementTest { @BeforeEach void beforeEach() { this.p = new Player(gp, keyH); - p.setDefaultValues(); + //p.setDefaultValues(); } @Test @@ -48,7 +48,7 @@ public class PlayerMovementTest { startPos = p.playerY; keyH.upPressed1 = true; p.update(); - p.jump(); + p.jumpP1(); assertTrue(p.worldY < startPos, "Proggy did not jump"); assertTrue(p.worldY > 0, "Proggy jumped out of the frame"); diff --git a/src/test/java/tileTest/LoaderTest.java b/src/test/java/tileTest/LoaderTest.java index 3edad62..22ee8ba 100644 --- a/src/test/java/tileTest/LoaderTest.java +++ b/src/test/java/tileTest/LoaderTest.java @@ -2,7 +2,7 @@ package tileTest; import core.GamePanel; import core.KeyHandler; -import entity.Player; +import entity.player.Player; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import tile.TileLoader; @@ -33,12 +33,12 @@ public class LoaderTest { KeyHandler keyH = new KeyHandler(gp); Player p = new Player(gp, keyH); - p.setDefaultValues(); + //p.setDefaultValues(); int startPos = p.worldY; keyH.upPressed1 = true; p.update(); - p.jump(); + p.jumpP1(); assertFalse(p.worldY < (startPos-gp.tileSize), "Proggy should not be able to go through tiles"); } diff --git a/src/test/java/tileTest/ScoreTest.java b/src/test/java/tileTest/ScoreTest.java index 86c3fbe..e8e3efd 100644 --- a/src/test/java/tileTest/ScoreTest.java +++ b/src/test/java/tileTest/ScoreTest.java @@ -2,7 +2,7 @@ package tileTest; import core.GamePanel; import core.KeyHandler; -import entity.Player; +import entity.player.Player; import entity.Score; import org.junit.jupiter.api.BeforeEach; @@ -22,7 +22,7 @@ public class ScoreTest { @BeforeEach void beforeEach() { this.p = new Player(gp, keyH); - p.setDefaultValues(); + //p.setDefaultValues(); } @Test -- GitLab From 5b44cfa1a4b641a25357181201877cdc516a936d Mon Sep 17 00:00:00 2001 From: "Hannah.Morken" Date: Thu, 28 Apr 2022 15:11:37 +0200 Subject: [PATCH 4/4] multiplayer funker --- src/main/java/core/CollisionCheck.java | 49 +++++++++++--------------- src/main/java/core/GamePanel.java | 1 + src/main/resources/maps/easy.txt | 2 +- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/main/java/core/CollisionCheck.java b/src/main/java/core/CollisionCheck.java index 7ee1ed7..615ec11 100644 --- a/src/main/java/core/CollisionCheck.java +++ b/src/main/java/core/CollisionCheck.java @@ -14,9 +14,6 @@ public class CollisionCheck { // The two corners of enemies to be checked for collision for each case int enemyCor1, enemyCor2; - - public int coins = 0; - // Used to activate gameOver if proggy falls out of bounds private boolean outOfBounds = false; @@ -68,12 +65,12 @@ public class CollisionCheck { // Pick up 100 kroner if (pickUpGeneric(x1, y1, x2, y2, 7)) { player.gp.playSoundEffect(1); - coins += 10; + player.gp.coins += 10; } // pick up 200-kroner if (pickUpGeneric(x1, y1, x2, y2, 8)) { player.gp.playSoundEffect(2); - coins += 20; + player.gp.coins += 20; } } @@ -84,9 +81,9 @@ public class CollisionCheck { if(enemy[i] != null) { if(player.worldY == enemy[i].worldY) { if(player.worldX <= enemy[i].worldX + 10 && player.worldX >= enemy[i].worldX - 10) { - coins --; - if(coins < 0) { - coins = 0; + player.gp.coins --; + if(player.gp.coins < 0) { + player.gp.coins = 0; } return true; } @@ -102,16 +99,16 @@ public class CollisionCheck { //player.gp.getPlayerState(); int loosingMoney = 15; if (player.playerState != PlayerState.INVISIBLE) { - if (coins >= loosingMoney) { + if (player.gp.coins >= loosingMoney) { if (player.gp.loader.tiles[cornerOne] == player.gp.loader.tiles[9]) { player.gp.loader.numOfTiles[x1][y1] = 10; - coins -= loosingMoney; + player.gp.coins -= loosingMoney; } } - else if (coins>0 && coins < loosingMoney) { + else if (player.gp.coins>0 && player.gp.coins < loosingMoney) { if (player.gp.loader.tiles[cornerOne] == player.gp.loader.tiles[9]) { player.gp.loader.numOfTiles[x1][y1] = 10; - coins = 0; + player.gp.coins = 0; } } } @@ -145,10 +142,10 @@ public class CollisionCheck { private void pickUpScooter(int x1, int y1, int x2, int y2) { int scooterCost = 5; //If the player does not have at least the cost of the scooter, it cannot be picked up - if (coins>=scooterCost) { + if (player.gp.coins>=scooterCost) { if (pickUpGeneric(x1, y1, x2, y2, 14)) { powerUpSequence(4, PlayerState.VOI); - coins -= scooterCost; + player.gp.coins -= scooterCost; } } @@ -171,7 +168,7 @@ public class CollisionCheck { * parameters x1, y1, x2, y2 is the same as pickUpGeneric */ private void pickUpBeer(int x1, int y1, int x2, int y2) { - if(coins >= 100) { //check for winning + if(player.gp.coins >= 100) { //check for winning if (pickUpGeneric(x1, y1, x2, y2, 16)) { player.gp.playSoundEffect(4); player.gp.gameState = GameState.WIN_SCREEN; //switches to winning screen @@ -229,7 +226,7 @@ public class CollisionCheck { * This is used to reduce coins by 1. It is used in GamePanel and Time uses it on its gamePanel */ public void reduceCoins() { - this.coins --; + this.player.gp.coins --; } /** @@ -237,10 +234,10 @@ public class CollisionCheck { * This is used to find out how many coins Proggy has */ public int getCoins() { - return this.coins; + return this.player.gp.coins; } public void setCoins(int i) { - this.coins = i; + this.player.gp.coins = i; } @@ -337,11 +334,7 @@ public class CollisionCheck { int enemyTopRow = enemytopworldy / player.gp.tileSize; int enemyBottomRow = enemybottomworldy / player.gp.tileSize; - - - switch(entityEnemy.direction) { - - + switch(entityEnemy.direction) { case "down": //If Proggy moves in an downwards direction, the two corners that needs to be checked is bottom right and left corners enemyBottomRow = (enemybottomworldy + entityEnemy.speed) / player.gp.tileSize; //predictiong which tile Proggy tries to go into @@ -352,28 +345,28 @@ public class CollisionCheck { entityEnemy.onGround = true; } break; - + case"enemyLeft": enemyLeftCol = (enemyleftworldx - entityEnemy.speed) / player.gp.tileSize; //predictiong which tile Enemy tries to go into enemyCor1 = player.gp.loader.numOfTiles[enemyLeftCol][enemyTopRow]; // Top left corner enemyCor2 = player.gp.loader.numOfTiles[enemyLeftCol][enemyBottomRow]; // Top right corner if(player.gp.loader.tiles[enemyCor1].collission == true) { entityEnemy.colliding = true; - + } break; - + case"enemyRight": enemyRightCol = (enemyrightworldx - entityEnemy.speed) / player.gp.tileSize; //predictiong which tile Enemy tries to go into enemyCor1 = player.gp.loader.numOfTiles[enemyRightCol][enemyTopRow]; // Top left corner enemyCor2 = player.gp.loader.numOfTiles[enemyRightCol][enemyBottomRow]; // Top right corner if(player.gp.loader.tiles[enemyCor1].collission == true) { entityEnemy.colliding = true; - + } break; - } + } } } diff --git a/src/main/java/core/GamePanel.java b/src/main/java/core/GamePanel.java index dc15e5c..c0fccb3 100644 --- a/src/main/java/core/GamePanel.java +++ b/src/main/java/core/GamePanel.java @@ -41,6 +41,7 @@ public class GamePanel extends JPanel implements Runnable{ //private PlayerState playerState; + public int coins = 0; //Map public InputStream is; diff --git a/src/main/resources/maps/easy.txt b/src/main/resources/maps/easy.txt index 58d3ae4..31a2718 100644 --- a/src/main/resources/maps/easy.txt +++ b/src/main/resources/maps/easy.txt @@ -9,7 +9,7 @@ 15 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 5 3 3 3 6 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 15 15 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 4 4 4 4 4 14 0 0 7 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 15 -15 0 0 0 0 0 12 0 0 0 7 8 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 3 3 3 3 3 3 3 4 0 2 7 8 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 16 6 15 +15 0 0 0 0 0 0 0 0 0 7 8 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4 4 4 4 4 3 3 3 3 3 3 3 4 0 2 7 8 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 16 6 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 4 4 4 4 4 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 9 7 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 4 4 4 4 4 15 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 2 2 2 2 2 0 1 1 1 1 1 1 1 1 4 4 4 4 4 15 -- GitLab