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