From 5096574f26bb2c6424dc83663377a0b50fcfe19e Mon Sep 17 00:00:00 2001 From: Oscar Wiberg <oscarwiberg@oscars-air-3.students.netlogon.liu.se> Date: Tue, 30 Jan 2024 08:57:02 +0100 Subject: [PATCH] Powerup samt kommentarer --- src/HighScore.txt | 2 +- src/Images1/heart.png | Bin 0 -> 886 bytes src/constants/Constants.java | 3 + src/states/Enemy.java | 42 +++++++++---- src/states/ExtraLifePowerUp.java | 16 +++++ src/states/FlyingEnemy.java | 24 ++++++++ src/states/PlayState.java | 99 ++++++++++++++++++++++--------- src/states/Player.java | 10 +--- src/states/PowerUp.java | 54 +++++++++++++++++ 9 files changed, 202 insertions(+), 48 deletions(-) create mode 100644 src/Images1/heart.png create mode 100644 src/states/ExtraLifePowerUp.java create mode 100644 src/states/PowerUp.java diff --git a/src/HighScore.txt b/src/HighScore.txt index 2efea51..e440e5c 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 GIT binary patch literal 886 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Ea{HEjtmSN`?>!lvNA9* za29w(7BevL9Ry*<9TT(PGB7YmmAFQf1m~xflqVLYG6W=M=9TFAxrQi|8S9zq85$UT zDO$+D!1T$}#W5tp{q1!90x3t4WBIR=l(Uqwl9JEQ%SzwSA?2bj%)%zv{IcX)QnSvY zMd|_vlQwRh(WPJzq0{v8%(vRpb+_;CwLKAQBpkev`Sjg)->dIe|8Ccbe(}cl_Uta@ zAO9IPG9Nv^JZYuev?_}$zw6@9v&B#U`91Vw%<?}UXE>KzRek<>dRf_?{|>e~QzTQQ z8MfVB7k64EwZ24XiPD+M6di>NlLY<<3QIgZ?!H#Mdx314G4n*Gl^p$UQT@lG{M8b7 z@4Gg8&k8F?hFfyooBbJT4o$sSv5x8Zs}@crhN!5ctp6UYN&oVB=e5h30!JN{ln<=C zZoN!P%x%9$&x}knQSP7T#2gkpety>_W?CqBt_q7oZN}0=-x*vJf8L3YeQCdaI~&uZ z;+OtO;!hGe98SM`-~UBNDL+YB=()s1_xB75<&`V1M?Pcldg;I9eas5hj@1_Dof{<% zY`^Qq|MBfnR|bQrbsQJorb(3rO%PUA`lH7BJm!O9(t#6I@inT8d>lm=Tt3;;pu1|X zh}5h|F9F6m+ozc-o?|d5y0L#s$Pb2Bf7|O%UlduWzG3Q#@}L+trKe2yzcLDa6Mis# z3FD)sCL#$-Ig%T;`n+Ly6~k~Op&;i+UGd{r&8_SVUFU5-syHw-8apVN^DU5*SQ*b< z=e6fW@S~nRldA7I?~r+N;77`$g$l15GCQ&x1<Za;o_Krd^_QBVyM;e71~ph&B*-^d z#2jd2HW0~D`V~CU|IH@vuH||v&X$6{vL4JWp02VDF88fIS+MRiZ7J}(;_`pd34cb0 zHi46S4}{q<YF(|<dj3)M#~t6}Pi@K$=55#BeR4->o!)a_#wl7;Z)@&+_ppJ%=BDzs zwV%}{&i8gK2vufzSI*R^^z^1*;kwVavey6pU#Q1g<EO6h@AtcNbKYhIzbo4G+*~aG z^Ztf*u5+crrCIg)pYmVt<omGq-Umm;B6)|WN4GEgyyN?A9u*dcTRrRVaNhP&5|FQd sa&)&@ay;vUqlbK_JzU+X+Vxq#EY?#pyEpYa0|Nttr>mdKI;Vst0Ikf8@c;k- literal 0 HcmV?d00001 diff --git a/src/constants/Constants.java b/src/constants/Constants.java index 14901c4..e6ea26b 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 4de1167..58d0370 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 0000000..01641cf --- /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 ff50716..290a41b 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 2697438..173d4fb 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 a0ac4b7..15d264e 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 0000000..0b5901d --- /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 + +} -- GitLab