diff --git a/src/HighScore.txt b/src/HighScore.txt index 2efea5198bec85fb12bc22ec549bd4db99be6de5..e440e5c842586965a7fb77deda2eca68612b1f53 100644 --- a/src/HighScore.txt +++ b/src/HighScore.txt @@ -1 +1 @@ -167 \ No newline at end of file +3 \ No newline at end of file diff --git a/src/Images1/heart.png b/src/Images1/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..417d80ac9510e8e089b02b121f6bf792f47766f4 Binary files /dev/null and b/src/Images1/heart.png differ diff --git a/src/constants/Constants.java b/src/constants/Constants.java index 14901c40d1bebcd2922485529d14689bca3e4ba3..e6ea26b99247a60ca6dacd1edab6d06b7fd1c622 100644 --- a/src/constants/Constants.java +++ b/src/constants/Constants.java @@ -39,4 +39,7 @@ public interface Constants { double enemyWidth = 100; double enemyHeight = 100; +// powerups + String lifeImg = "src/Images1/heart.png"; + } diff --git a/src/states/Enemy.java b/src/states/Enemy.java index 4de1167cc821d64bfe02ba3dbbca02a104d81d42..58d037073741ec61740acb99658d243cf10020f5 100644 --- a/src/states/Enemy.java +++ b/src/states/Enemy.java @@ -8,7 +8,7 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; public class Enemy { - + private double enemyX = -100.00; private double enemyY = 250.00; private Image image; @@ -18,21 +18,39 @@ public class Enemy { try { image = new Image(new FileInputStream(enemyImg)); - enemyView = new ImageView(image); - enemyView.setX(enemyX); - enemyView.setY(enemyY); - enemyView.setFitHeight(Constants.enemyHeight); - enemyView.setFitWidth(Constants.enemyWidth); + } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } - + + // if (collided && enemy.getEnemyX() < player.getPlayerX()) { + // collided = false; + // } + + public boolean playerEnemyCollision(Player player) { + boolean hit = false; + + if ((enemyX <= (player.getPlayerX() + 80)) && (enemyX > player.getPlayerX())) { + if((player.getPlayerY() + 60) >= enemyY) { + hit = true; + player.decreaseLives(); +// if (hit && enemyX < player.getPlayerX()) { +// hit = false; +// } + } + } + + return hit; + } + + + public void setEnemyX(double pos) { - + this.enemyX = pos; - + } public Image getImage() { @@ -50,7 +68,7 @@ public class Enemy { public double getEnemyY() { return enemyY; } - - - + + + } diff --git a/src/states/ExtraLifePowerUp.java b/src/states/ExtraLifePowerUp.java new file mode 100644 index 0000000000000000000000000000000000000000..01641cf31eea0d1689eed087d03b4f39c3229a2f --- /dev/null +++ b/src/states/ExtraLifePowerUp.java @@ -0,0 +1,16 @@ +package states; + +public class ExtraLifePowerUp extends PowerUp { + + ExtraLifePowerUp(String image) { + super(image); + // TODO Auto-generated constructor stub + } + + @Override + public void use(Player player) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/states/FlyingEnemy.java b/src/states/FlyingEnemy.java index ff5071605a6d9a42bd8d9b579d007d4d21132068..290a41b3757d7002809f7cad1f9180cf3173c63c 100644 --- a/src/states/FlyingEnemy.java +++ b/src/states/FlyingEnemy.java @@ -1,11 +1,35 @@ package states; +import java.util.Random; + +import javafx.scene.image.Image; + public class FlyingEnemy extends Enemy{ + + private double enemyX = -100.00; + private double enemyY = 0; + private Image image; + private Random rnd; + public FlyingEnemy(String enemyImg) { super(enemyImg); } + + + public double getEnemyY() { +// Gör en random generator här som returnerar Y koordinat slumpmässigt inom ett spann(om y koordinaten är 0). +// När enemy är ute ur frame sätter vi ykoordinaten till 0 så att den kan få en ny vid nästa passering. + + return enemyY; + + } + + public void setEnemyY() { + enemyY = 0; + + } } diff --git a/src/states/PlayState.java b/src/states/PlayState.java index 2697438138c7ba559bf116ea5cf337eabc7fc9a9..173d4fbbbf968d2f36de789c27fc08d0056be65f 100644 --- a/src/states/PlayState.java +++ b/src/states/PlayState.java @@ -50,12 +50,13 @@ public class PlayState extends GameState { private HighScore score = new HighScore(); private int clearedEnemies; private String scoreText; + private ExtraLifePowerUp extraLife; /* Class only used for testing */ - -// TODO nästa steg, lägg in en flygande enemy för att testa glid funktionen, ändra boundsen på den glidande bilden! -// TODO kanske ta bort att skicka med image när man instansierar player + + // TODO nästa steg, lägg in en flygande enemy för att testa glid funktionen, ändra boundsen på den glidande bilden! + // TODO kanske ta bort att skicka med image när man instansierar player public PlayState(GameModel model) { super(model); @@ -69,6 +70,7 @@ public class PlayState extends GameState { player = new Player(Constants.playerImg); enemy = new Enemy(Constants.enemyImg); + extraLife = new ExtraLifePowerUp(Constants.lifeImg); // menu = new MenuState(model); @@ -84,6 +86,7 @@ public class PlayState extends GameState { g.setFill(fontColor); g.setFont(new Font(30)); // Big letters + // ritar liv kvar + nuvarande highscore om det inte är gameover, annars ritar den bara gemaovertexten if (!gameOver) { g.fillText(livesleft+player.getLives(), 0, 30); @@ -93,74 +96,115 @@ public class PlayState extends GameState { g.fillText(gameOverText, Constants.screenWidth/2, 200); } - + // ritar ut marklinjen g.setStroke(Color.BLACK); g.setLineWidth(1); g.setLineDashes(2); g.strokeLine(Constants.screenWidth, 350, 0, 350); - if (enemy.getEnemyX() < 0 - Constants.enemyWidth) { - enemy.setEnemyX(Constants.screenWidth); - } + // om enemy är ute ur frame, ställer dem om positionen på den så att den börjar om + + + // Ritar enemy och player + g.drawImage(extraLife.getImage(), extraLife.getPowerUpX(), extraLife.getPowerUpY(), 40, 40); g.drawImage(player.getImage(), player.getPlayerX(), player.getPlayerY(), Constants.playerWidth, Constants.playerHeight); - g.drawImage(enemy.getImage(), enemy.getEnemyX(), enemy.getEnemyY(), Constants.enemyWidth, Constants.enemyHeight); +// g.drawImage(enemy.getImage(), enemy.getEnemyX(), enemy.getEnemyY(), Constants.enemyWidth, Constants.enemyHeight); + drawEnemy(g); + +// TODO kanske göra en random här också, som väljer om vi ska rita de olika enemies eller powerupsen. Vid en viss score +// TODO kommer möjligheten att ta powerups eller möta flyingenemy + + } + + public void drawEnemy(GraphicsContext g) { + +// enemy = new Enemy(Constants.enemyImg); + g.drawImage(enemy.getImage(), enemy.getEnemyX(), enemy.getEnemyY(), Constants.enemyWidth, Constants.enemyHeight); + if (enemy.getEnemyX() < 0 - Constants.enemyWidth) { + enemy.setEnemyX(Constants.screenWidth); + } + } - + @Override public void keyPressed(KeyEvent key) { -// TODO gör om till case sats för att städa upp det lite, kladdigt atm + kan behöva flytta funktionalitet - - if (key.getCode() == KeyCode.ESCAPE) { + switch (key.getCode()) { + + case ESCAPE: model.switchState(new MenuState(model)); - } else if (key.getCode() == KeyCode.UP) { + break; + case UP: + // Om spelaren duckar kan den inte hoppa, då ställer sig spelaren upp istället if (down) { - player.standUp(); down = false; - } else { - up = true; - } + break; - } else if (key.getCode() == KeyCode.DOWN) { + case DOWN: + // Spelaren kan inte ducka om den är mitt i ett hopp + if (!up) { + down = true; + } + break; - down = true; + default: + break; } + + } @Override public void update() { //om enemy position är mindre än player och collide är true kollar den inte collision + clearedEnemies ++; + + // Enemy hoppar 10 snäpp till vänster för varje update enemy.setEnemyX(enemy.getEnemyX()-10); + // Om if (!gameOver) { - - if ((enemy.getEnemyX() <= (player.getPlayerX() + 80)) && (enemy.getEnemyX() > player.getPlayerX())) { - // if (!collided && enemy.getEnemyX() > player.getPlayerX()) { - if (!collided) { - checkCollision(); + + if (!collided) { + collided = enemy.playerEnemyCollision(player); + if (Integer.valueOf(player.getLives()) == 0) { + gameOver = true; } - // clearedEnemies ++; } - if (collided && enemy.getEnemyX() < player.getPlayerX()) { collided = false; } + + //// Så länge enemy och player har överlappande X koordinat(och inte redan har kolliderat), kollar vi om dem kolliderar på Y axeln + // if ((enemy.getEnemyX() <= (player.getPlayerX() + 80)) && (enemy.getEnemyX() > player.getPlayerX())) { + // // if (!collided && enemy.getEnemyX() > player.getPlayerX()) { + // if (!collided) { + // checkCollision(); + // } + // // clearedEnemies ++; + // } + // + // if (collided && enemy.getEnemyX() < player.getPlayerX()) { + // collided = false; + // } + + if (up) { player.jump(); @@ -181,6 +225,7 @@ public class PlayState extends GameState { public void checkCollision() { + // Om vi kolliderar på Y axeln // if ((enemy.getEnemyX() <= (player.getPlayerX() + 80)) && (enemy.getEnemyX() > player.getPlayerX()) && ((player.getPlayerY() + 60) >= enemy.getEnemyY() )) { // @@ -214,7 +259,7 @@ public class PlayState extends GameState { // } - // clearedEnemies ++; + // clearedEnemies ++; } diff --git a/src/states/Player.java b/src/states/Player.java index a0ac4b74895d6eb32956f84f7c0de0709c5803de..15d264e0d57b1f10fb50b7df4118bcf83e93b7b3 100644 --- a/src/states/Player.java +++ b/src/states/Player.java @@ -32,11 +32,7 @@ public class Player { try { image = new Image(new FileInputStream(playerImg)); slidingImage = new Image(new FileInputStream(Constants.slidingPlayerImg)); - // playerView = new ImageView(image); - // playerView.setX(playerX); - // playerView.setY(playerY); - // playerView.setFitHeight(Constants.playerHeight); - // playerView.setFitWidth(Constants.playerWidth); + } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -47,9 +43,7 @@ public class Player { } - // public ImageView getPlayerView() { - // return playerView; - // } + public Image getImage() { diff --git a/src/states/PowerUp.java b/src/states/PowerUp.java new file mode 100644 index 0000000000000000000000000000000000000000..0b5901d4abe5a36e92ce17495ef92fc02af0938f --- /dev/null +++ b/src/states/PowerUp.java @@ -0,0 +1,54 @@ +package states; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import constants.Constants; +import javafx.scene.image.Image; + +public abstract class PowerUp { + + private double powerUpX = (Constants.screenWidth - Constants.playerWidth) / 2; + private double powerUpY = 265.00; + private Image powerUpImage; + + PowerUp(String image) { + + try { + powerUpImage = new Image(new FileInputStream(image)); + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public double getPowerUpX() { + return powerUpX; + } + + public void setPowerUpX(double powerUpX) { + this.powerUpX = powerUpX; + } + + public double getPowerUpY() { + return powerUpY; + } + + public Image getImage() { + return powerUpImage; + } + + public boolean powerUpPlayerCollision(Player player) { + boolean hit = false; + +// här ska det finnas kod för att kolla kollisioner mellan spelare och powerup + + return hit; + } + + public abstract void use(Player player); + +// här kommer de två olika powerupsen avgöra vad som händer när ma ta den, denna klass kallar på kollisionen + +}