diff --git a/src/HighScore.txt b/src/HighScore.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2e66562e2705f8e5c5ddccceeecaab861194f30a
--- /dev/null
+++ b/src/HighScore.txt
@@ -0,0 +1 @@
+49
\ No newline at end of file
diff --git a/src/Images1/apple.png b/src/Images1/apple.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3edbe2f59ba13ee04b59088d0c69a30e5724530
Binary files /dev/null and b/src/Images1/apple.png differ
diff --git a/src/Images1/blixt.png b/src/Images1/blixt.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c5098efd02fe4ba34a86c653176ce31589b9905
Binary files /dev/null and b/src/Images1/blixt.png differ
diff --git a/src/Images1/dinosaur.png b/src/Images1/dinosaur.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8ca237211f03535801067d4b638c1cb2babd6bb
Binary files /dev/null and b/src/Images1/dinosaur.png differ
diff --git a/src/Images1/fly.png b/src/Images1/fly.png
new file mode 100644
index 0000000000000000000000000000000000000000..d967e9553eb7379d5076ae3fc21cf1ca9d2e9bba
Binary files /dev/null and b/src/Images1/fly.png differ
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/Images1/heart2.png b/src/Images1/heart2.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbb43b56fa5e6965af0140aa0e96477597255539
Binary files /dev/null and b/src/Images1/heart2.png differ
diff --git a/src/Images1/lorry.png b/src/Images1/lorry.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2eb7091670ee53a1a043b3b065905da3376da38
Binary files /dev/null and b/src/Images1/lorry.png differ
diff --git a/src/Images1/player2.png b/src/Images1/player2.png
new file mode 100644
index 0000000000000000000000000000000000000000..688812eaba4982520fa0e5a86e573f9ac64f57f9
Binary files /dev/null and b/src/Images1/player2.png differ
diff --git a/src/Images1/player2_sliding.png b/src/Images1/player2_sliding.png
new file mode 100644
index 0000000000000000000000000000000000000000..f87ac1d9abc8b7348ea582dbc05a762f9d26c34c
Binary files /dev/null and b/src/Images1/player2_sliding.png differ
diff --git a/src/Images1/player_sliding.png b/src/Images1/player_sliding.png
new file mode 100644
index 0000000000000000000000000000000000000000..57476f650e1d481d0c83eee28e6fbb8a315e73f0
Binary files /dev/null and b/src/Images1/player_sliding.png differ
diff --git a/src/Images1/runner.png b/src/Images1/runner.png
new file mode 100644
index 0000000000000000000000000000000000000000..04660d17d9d980bd6c8c4e7a7ecf5156ecbed4e1
Binary files /dev/null and b/src/Images1/runner.png differ
diff --git a/src/Images1/saucer.png b/src/Images1/saucer.png
new file mode 100644
index 0000000000000000000000000000000000000000..c806f57b8a3fb790348af4ffddb1460af59aef72
Binary files /dev/null and b/src/Images1/saucer.png differ
diff --git a/src/Images1/woman-running.png b/src/Images1/woman-running.png
new file mode 100644
index 0000000000000000000000000000000000000000..84cfab13a42b0d01201adb9af05da4888614fe99
Binary files /dev/null and b/src/Images1/woman-running.png differ
diff --git a/src/Images1/zap.png b/src/Images1/zap.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b3fae8eb2183d1b23fb0ebe3230a5caf16c0872
Binary files /dev/null and b/src/Images1/zap.png differ
diff --git a/src/constants/Constants.java b/src/constants/Constants.java
index e6bc02c2e422c5d48b51a0855aa51cbc0b05d30e..fb1a9138a056f47d089badd63643a6ef0f70abc0 100644
--- a/src/constants/Constants.java
+++ b/src/constants/Constants.java
@@ -1,5 +1,10 @@
 package constants;
 
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import javafx.scene.image.Image;
+
 public interface Constants {
 
 	/**
@@ -16,16 +21,31 @@ public interface Constants {
 	/*
 	 * Define the size of the window
 	 */
-	int SCREEN_WIDTH = 1000;
-	int SCREEN_HEIGHT = 800;
+	final int screenWidth = 1000;
+	final int screenHeight = 500;
 	
 	// Player
-	
+	String slidingPlayerImg = "src/Images1/player_sliding.png";
+//	String playerImg = "src/Images1/runner.png";
 	String playerImg = "src/Images1/player.png";
+	String slidingPlayerImg2 = "src/Images1/player2_sliding.png";
+//	String playerImg2 = "src/Images1/woman-running.png";
+	String playerImg2 = "src/Images1/player2.png";
+	double playerWidth = 100;
+	double playerHeight = 100;
 	
 	//colours
 	String Bluebackground = "-fx-background-color: #34495E;";
 	String Blackbackground = "-fx-background-color: #111111;";
 	
+	//enemies
+	String enemyImg = "src/Images1/lorry.png";
+	String flyingEnemyImg = "src/Images1/saucer.png";
+	double enemyWidth = 100;
+	double enemyHeight = 100;
+	
+//	powerups
+	String lifeImg = "src/Images1/heart2.png";
+	String powerImge = "src/Images1/blixt.png";
 	
 }
diff --git a/src/main/GameFrame.java b/src/main/GameFrame.java
index 1e7ca79117abb37e8dd9a410e53c5af47143e000..cd07d05fb3efd6106a6502c7f2d0e42d8793d92b 100644
--- a/src/main/GameFrame.java
+++ b/src/main/GameFrame.java
@@ -1,6 +1,7 @@
 package main;
 
 import javafx.scene.layout.HBox;
+import javafx.scene.layout.VBox;
 import states.GameModel;
 
 /**
diff --git a/src/main/Main.java b/src/main/Main.java
index 0f3858f6701f47ece322a00431ee75edda02d0e2..07ed30ea344cd456d3c4fe6d94c87442cc4a46d0 100644
--- a/src/main/Main.java
+++ b/src/main/Main.java
@@ -1,6 +1,7 @@
 package main;
 
 import states.GameModel;
+
 import constants.Constants;
 
 import javafx.animation.AnimationTimer;
@@ -9,7 +10,7 @@ import javafx.event.EventHandler;
 import javafx.scene.Scene;
 import javafx.scene.input.KeyEvent;
 import javafx.stage.Stage;
-
+//FFfffffffff
 /**
  * This Class is the entry point of the application.
  * <p>
@@ -32,6 +33,11 @@ import javafx.stage.Stage;
  * @author magni54, alomi60
  */
 public class Main extends Application {
+	
+	private GameModel model;
+	private Scene gameScene;
+	private GameFrame frame;
+	
 
 	public static void main(String[] args) {
 		launch(args);
@@ -39,13 +45,16 @@ public class Main extends Application {
 
 	@Override
 	public void start(Stage gameStage) throws Exception {
-		gameStage.setTitle("TotallyAwesomeGame, sort of");
-		gameStage.setWidth(Constants.SCREEN_WIDTH);
-		gameStage.setHeight(Constants.SCREEN_HEIGHT);
+		
+		
+		
+		gameStage.setWidth(Constants.screenWidth);
+		gameStage.setHeight(Constants.screenHeight);
 		GameModel model = new GameModel();
-		GameFrame frame = new GameFrame(model, 1000, 800);
+//		GameFrame frame = new GameFrame(model, 1000, 800);
+		GameFrame frame = new GameFrame(model, Constants.screenWidth, Constants.screenHeight);
+
 		Scene gameScene = new Scene(frame);
-		// Set the target number of frames per second
 		final double targetFps = 50.0;
 		// Calculate frequency in nano seconds
 		final double nanoPerUpdate = 1000000000.0 / targetFps;
@@ -55,6 +64,7 @@ public class Main extends Application {
 		// We set up a setOnKeyPressed, to handle keyboard input,
 		// like we had a onMouseClick in the canvas for the paint lab.
 		gameScene.setOnKeyPressed(new EventHandler<KeyEvent>() {
+			
 			@Override
 			public void handle(KeyEvent event) {
 				// We send it on to the model, to handle it in the various
@@ -62,6 +72,8 @@ public class Main extends Application {
 				model.keyPressed(event);
 			}
 		});
+		
+		
 
 		// We set an AnimationTimer, to control the flow of the game.
 		new AnimationTimer() {
@@ -86,4 +98,4 @@ public class Main extends Application {
 		gameStage.show();
 
 	}
-}
+}
\ No newline at end of file
diff --git a/src/states/Antagonist.java b/src/states/Antagonist.java
new file mode 100644
index 0000000000000000000000000000000000000000..f93d6a72764dd90a54f25c8f54b6240957410b7d
--- /dev/null
+++ b/src/states/Antagonist.java
@@ -0,0 +1,59 @@
+package states;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import javafx.scene.image.Image;
+
+public abstract class Antagonist {
+	
+	protected double x;
+	protected double y;
+	protected Image img;
+	protected boolean collisionDetected;
+	
+	
+	public Antagonist(String image, double x, double y) {
+		this.x = x;
+		this.y = y;
+		this.collisionDetected = false;
+		
+		try {
+			this.img = new Image(new FileInputStream(image));
+
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	public Antagonist(String image) {
+		this.collisionDetected = false;
+
+		try {
+			this.img = new Image(new FileInputStream(image));
+
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	public abstract boolean playerAntagonistCollision(Player player);
+	
+	public void setAntagonistX(double pos) {
+		this.x = pos;
+	}
+
+	public double getX() {
+		return x;
+	}
+
+	public abstract double getY();
+
+	
+	public Image getImage() {
+		return img;
+	}
+	
+}
diff --git a/src/states/Enemy.java b/src/states/Enemy.java
new file mode 100644
index 0000000000000000000000000000000000000000..40c763ca93e9115288ed2a54e445900b51db97d0
--- /dev/null
+++ b/src/states/Enemy.java
@@ -0,0 +1,61 @@
+package states;
+
+import java.io.FileInputStream;
+
+import java.io.FileNotFoundException;
+
+import constants.Constants;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+
+public class Enemy extends Antagonist{
+
+	private double enemyX = -100.00;
+	private double enemyY = 250.00;
+	private Image image;
+	private ImageView enemyView;
+
+	public Enemy(String enemyImg, double x, double y) {
+		super(enemyImg, x, y);
+
+	}
+
+	//	if (collided && enemy.getEnemyX() < player.getPlayerX()) {
+	//		collided = false;
+	//	}
+
+	@Override
+	public boolean playerAntagonistCollision(Player player) {
+//		boolean hit = false;
+
+		boolean collisionX = player.getPlayerX() < (x + 60.00) && (player.getPlayerX() + 60.00) > x;
+
+		// Check for collision on the y-axis
+		boolean collisionY = player.getPlayerY() < (y + 45.00) && (player.getPlayerY() + 60.00) > y;
+
+		if (collisionY && collisionX && !collisionDetected) {
+			player.decreaseLives();
+
+			 collisionDetected = true;
+		        return true;
+		    }
+		    
+		    if (!collisionX) {
+	            collisionDetected = false;
+	        }
+		
+		return false;
+	
+	}  
+
+
+	
+
+	@Override
+	public double getY() {
+		return y;
+	}
+
+
+
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..1b456bcdb99359741cabd74332cc78e4a9b64b8e
--- /dev/null
+++ b/src/states/FlyingEnemy.java
@@ -0,0 +1,107 @@
+package states;
+
+import java.util.ArrayList;
+import constants.Constants;
+import java.util.Random;
+
+import javafx.scene.image.Image;
+
+public class FlyingEnemy extends Antagonist{
+
+//	private double enemyX = 800.00;
+	private ArrayList<Double> enemyY;
+	private double currY;
+	private Random rnd = new Random();
+
+
+	public FlyingEnemy(String enemyImg, double x, double y) {
+		super(enemyImg, x, y);	
+		this.enemyY = new ArrayList<Double>();
+		this.enemyY.add(150.0);
+		this.enemyY.add(180.0);
+		this.enemyY.add(200.0);
+		this.enemyY.add(250.0);
+		//		enemyY.add(265.00);
+		//		enemyY.add(265.00);
+		//		enemyY.add(265.00);
+		//		enemyY.add(265.00);
+
+
+		//		double[] enemyY = {250, 200, 150,100};
+		//		enemyY[0] = 100.0;
+		//		enemyY[1] = 150.0;
+		//		enemyY[2] = 200.0;
+		//		enemyY[3] = 250.0;
+
+	}
+
+	//	System.out.println(weather.get(rnd.nextInt(weather.size())));
+
+
+
+//	public boolean playerFlyingEnemyCollision(Player player) {
+//		boolean hit = false;
+//
+//		if ((enemyX < (player.getPlayerX() + 80.00)) && ((enemyX) > player.getPlayerX())) { //borde vara +80 på enemyx men funkar ej
+//			//			if((player.getPlayerY() + 60.00) >= enemyY) {
+//			if((player.getPlayerY() + 60.00) >= currY) {
+//				//			if ((enemyY + 80  > (player.getPlayerY())) && ((player.getPlayerY() + 80) > enemyY))  {
+//
+//				hit = true;
+//				player.decreaseLives();
+//				//				if (hit && enemyX < player.getPlayerX() + 100) {
+//				//					hit = false;
+//				//				}
+//
+//			}
+//
+//		}
+//
+//		return hit;
+//
+//		//	public void setEnemyY() {
+//		//		enemyY = 0.0;
+//		//		
+//	}
+
+	public FlyingEnemy(String enemyImg) {
+		super(enemyImg);
+		this.enemyY = new ArrayList<Double>();
+		this.enemyY.add(200.00); //går att stå under
+		this.enemyY.add(210.00); //behöver ducka
+		this.enemyY.add(220.00); //behöver ducka
+		this.enemyY.add(250.00); //behöver hoppa
+	}
+
+	@Override
+	public boolean playerAntagonistCollision(Player player) {
+
+		boolean collisionX = player.getPlayerX() < (x + 60.00) && (player.getPlayerX() + 60.00) > x;
+
+	    // Check for collision on the y-axis
+	    boolean collisionY = player.getRect() < (currY + 60.00) && (player.getRect() + 60.00) > currY;
+
+
+	    if (collisionX && collisionY && !collisionDetected) {
+	        player.decreaseLives();
+	        collisionDetected = true;
+	        return true;
+	    }
+	    
+	    if (!collisionX) {
+            collisionDetected = false;
+        }
+	    
+
+		return false;
+	
+	}
+
+	@Override
+	public double getY() {
+
+		currY = enemyY.get(rnd.nextInt(enemyY.size()));
+		return currY;
+	}
+
+}
diff --git a/src/states/GameState.java b/src/states/GameState.java
index 862f928f4d05f2fb25b2e4236312328f81962ae5..cba0ddd627d4898fa1497189881797d744757f2b 100644
--- a/src/states/GameState.java
+++ b/src/states/GameState.java
@@ -1,11 +1,13 @@
 package states;
 
 import javafx.scene.canvas.GraphicsContext;
+
 import javafx.scene.input.KeyEvent;
+import javafx.scene.layout.Pane;
 import javafx.scene.paint.Color;
 
-import static constants.Constants.SCREEN_HEIGHT;
-import static constants.Constants.SCREEN_WIDTH;
+
+import constants.Constants;
 
 /**
  * This class represents a state of the game. These states are different views
@@ -63,7 +65,7 @@ public abstract class GameState {
 	public void drawBg(GraphicsContext g, Color color) {
 		// Here we can draw a background if we so desire.
 		g.setFill(color);
-		g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+		g.fillRect(0, 0, Constants.screenWidth, Constants.screenHeight);
 
 	}
 
diff --git a/src/states/HighScore.java b/src/states/HighScore.java
new file mode 100644
index 0000000000000000000000000000000000000000..98931e969c4f6abb254898de27d6354bb9aa6c2c
--- /dev/null
+++ b/src/states/HighScore.java
@@ -0,0 +1,50 @@
+package states;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Scanner;
+
+public class HighScore {
+
+
+	public void saveScore(int score) {
+		if (score > getHighScore()) {
+			try {
+				FileWriter writer = new FileWriter("src/HighScore.txt");
+				writer.write("");
+				writer.write(Integer.toString(score));
+				writer.close();
+			} catch (IOException ioe) {
+				ioe.printStackTrace();
+			}
+		}
+
+	}
+
+	public int getHighScore() {
+		int highScore = 0;
+
+		try {
+			File highScoreTxtFile = new File("src/HighScore.txt");
+			Scanner myReader = new Scanner(highScoreTxtFile);
+			while (myReader.hasNextLine()) {
+				String data = myReader.nextLine();
+				highScore = Integer.parseInt(data);
+			}
+			myReader.close();
+		} catch (FileNotFoundException e) {
+			System.out.println("File not found.");
+			e.printStackTrace();
+		}
+
+		return highScore;
+	}
+
+}
diff --git a/src/states/MenuState.java b/src/states/MenuState.java
index 21de0d2c9c891e838b18a53b1d9cd077b97c1ab3..e32016fb176fc04943f4b6cf1ba1a8f875de2715 100644
--- a/src/states/MenuState.java
+++ b/src/states/MenuState.java
@@ -1,13 +1,19 @@
 package states;
 
 import javafx.scene.canvas.GraphicsContext;
+
+
 import javafx.scene.input.KeyCode;
 import javafx.scene.input.KeyEvent;
 import javafx.scene.paint.Color;
 import javafx.scene.text.Font;
+import javafx.scene.text.Text;
+import javafx.scene.image.Image;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 
-import static constants.Constants.SCREEN_HEIGHT;
-import static constants.Constants.SCREEN_WIDTH;
+import constants.Constants;
 
 /**
  * This state represents the menu of the Game The main responsibility of this
@@ -24,13 +30,23 @@ public class MenuState extends GameState {
 	private Color fontColor;
 	// A PlayState, so we can change to the PlayState from the menu.
 	private PlayState playState;
+	private Image dinosaur;
+	private boolean mode1;
 
 	public MenuState(GameModel model) {
 		super(model);
-		playState = new PlayState(model);
-		informationText = "Press Enter To Play\nEscape to exit";
-		bgColor = Color.GREEN;
-		fontColor = Color.RED;
+		informationText = "Welcome to the Dino game!\nTo play, press 1 for mode 1 or 2 for mode 2\nEscape to exit game";
+		bgColor = Color.GREY;
+		fontColor = Color.LIGHTBLUE;
+		
+		try {
+			
+		dinosaur = new Image(new FileInputStream("src/Images1/dinosaur.png"));
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
 	}
 
 	/**
@@ -39,62 +55,52 @@ public class MenuState extends GameState {
 	@Override
 	public void draw(GraphicsContext g) {
 		drawBg(g, bgColor);
-
 		g.setFill(fontColor);
 		g.setFont(new Font(30)); // Big letters
 		// Print the information text, centered on the canvas
-		g.fillText(informationText, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
-		// Can also use:
-		// g.setStroke(fontColor);
-		// g.strokeText(informationText, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
+		g.fillText(informationText, Constants.screenWidth/4, Constants.screenHeight / 4);
+		g.drawImage(dinosaur, Constants.screenWidth/2, Constants.screenHeight/2, 200, 200);
+	
 	}
 
-	/**
-	 *
-	 * @param key KeyEvent representing the pressed key
-	 *
-	 *            This function prints the pressed key to the console it's used to
-	 *            show that a change of state has been made
-	 *
-	 *            For more information see GameState
-	 */
+	
 	@Override
 	public void keyPressed(KeyEvent key) {
 		System.out.println("Trycker på " + key.getText() + " i MenuState");
 
-		if (key.getCode() == KeyCode.ENTER) {
+		if (key.getCode() == KeyCode.DIGIT1) {
+			mode1 = true;
+			playState = new PlayState(model, mode1);
+			model.switchState(playState);
+		} else if (key.getCode() == KeyCode.DIGIT2) {
+			mode1 = false;
+			playState = new PlayState(model, mode1);
 			model.switchState(playState);
 		} else if (key.getCode() == KeyCode.ESCAPE) {
 			System.exit(0);
 		}
+		
 	}
 
-	/**
-	 * We have nothing to update in the menu, no moving objects etc. so we leave the
-	 * update method empty.
-	 */
 	@Override
 	public void update() {
+		// TODO Auto-generated method stub
+		
 	}
 
-	/**
-	 * We currently don't have anything to activate in the MenuState so we leave
-	 * this method empty in this case.
-	 */
 	@Override
 	public void activate() {
-
+		// TODO Auto-generated method stub
+		
 	}
 
-	/**
-	 * We currently don't have anything to deactivate in the MenuState so we leave
-	 * this method empty in this case.
-	 */
-
 	@Override
 	public void deactivate() {
-
+		// TODO Auto-generated method stub
+		
 	}
 
+	
+
 }
 
diff --git a/src/states/PlayState.java b/src/states/PlayState.java
index ce9fa94d3daa499d66e1dc1d131257be32b8b291..8f95c702c5697fd62e9234daee7c8f314e98383f 100644
--- a/src/states/PlayState.java
+++ b/src/states/PlayState.java
@@ -1,16 +1,20 @@
 package states;
 
-import testing.Tester;
-
 import javafx.scene.canvas.GraphicsContext;
+
+import javafx.scene.image.Image;
 import javafx.scene.input.KeyCode;
 import javafx.scene.input.KeyEvent;
 import javafx.scene.paint.Color;
-import javafx.scene.shape.Line;
+import javafx.scene.shape.Rectangle;
 import javafx.scene.text.Font;
+import javafx.scene.text.Text;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.Random;
 
-import static constants.Constants.SCREEN_HEIGHT;
-import static constants.Constants.SCREEN_WIDTH;
+import constants.Constants;
 
 /**
  * This state represents the Playing State of the Game The main responsibility
@@ -35,20 +39,80 @@ public class PlayState extends GameState {
 	 * a way to make this more general and not duplicate variables?
 	 */
 	private String informationText;
+	private String livesleft;
+	private String gameOverText;
 	private Color bgColor;
+	private Color lineColor;
 	private Color fontColor;
-	private Line dottedline;
+	private Player player;
+	private Enemy enemy;
+	private boolean collided = false;
+	private boolean up = false;
+	private boolean down = false;
+	private boolean gameOver = false;
+	private MenuState menu;
+	private HighScore score = new HighScore();
+	private int clearedEnemies;
+	private String scoreText;
+	private ExtraLifePowerUp extraLife;
+	private FlyingEnemy flyingEnemy;
+	private double tempy;
+	private Random engen;
+	private String slidingPlayer;
+	private int movingSpeed = 10;
+
 
 	/* Class only used for testing */
-	private Tester tester;
 
-	public PlayState(GameModel model) {
+	//	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, boolean mode) {
 		super(model);
-		informationText = "Press Escape To Return To The Menu";
-		bgColor = Color.WHITE;
-		fontColor = Color.BLUE;
+		informationText = "Press Escape \nTo Return To The Menu";
+		livesleft = "Lives left: ";
+		gameOverText = "GAMEOVER\n" + informationText;
+		fontColor = Color.BLACK;
+		scoreText = "Highscore: " + Integer.toString(score.getHighScore());
+		//		+ Integer.toString(score.getHighScore());
+
+
+		if (mode) {
+			mode1();
+		} else {
+			mode2();
+		}
+
+
+		//		menu = new MenuState(model);
+
+	}
+
+	public void mode1() {
+		player = new Player(Constants.playerImg);
+		slidingPlayer = Constants.slidingPlayerImg;
+		enemy = new Enemy(Constants.enemyImg, 800.00, 250.00);
+		extraLife = new ExtraLifePowerUp(Constants.lifeImg);
+		flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg);
+		flyingEnemy.setAntagonistX(800.00);
+		tempy = flyingEnemy.getY();
+		bgColor = Color.ROYALBLUE;
+		lineColor = Color.WHITE;
+
+	}
+
+	public void mode2() {
+		player = new Player(Constants.playerImg2);
+		slidingPlayer = Constants.slidingPlayerImg2;
+		enemy = new Enemy(Constants.enemyImg, 800.00, 250.00);
+		extraLife = new ExtraLifePowerUp(Constants.lifeImg);
+		flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg);
+		flyingEnemy.setAntagonistX(800.00);
+		tempy = flyingEnemy.getY();
+		bgColor = Color.BEIGE;
+		lineColor = Color.BLACK;
+
 
-		tester = new Tester();
 	}
 
 	/**
@@ -60,44 +124,191 @@ public class PlayState extends GameState {
 
 		g.setFill(fontColor);
 		g.setFont(new Font(30)); // Big letters
-		g.fillText(informationText, SCREEN_WIDTH / 3, SCREEN_HEIGHT / 3);
-//		dottedline = new Line(20, 200, 120, 270);
-//		dottedline.getStrokeDashArray().addAll(2d);
-		g.setStroke(Color.BLACK);
+		//		ritar liv kvar + nuvarande highscore om det inte är gameover, annars ritar den bara gemaovertexten
+
+		if (!gameOver) {
+			g.fillText(livesleft+player.getLives(), 0, 30);
+			g.fillText(informationText, Constants.screenWidth - 300, 30);
+			g.fillText(scoreText, 0, 60);
+		} else {
+			g.fillText(gameOverText, Constants.screenWidth/2, 200);
+			score.saveScore(player.getPasses());
+		}
+
+	
+
+		g.setStroke(lineColor);
 		g.setLineWidth(1);
 		g.setLineDashes(2);
-		g.strokeLine(SCREEN_WIDTH, 650, 0, 650);
-		// Can also use:
-		// g.setStroke(fontColor);
-		// g.strokeText(informationText, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
-
-		// This could be a call to all our objects that we want to draw.
-		// Using the tester simply to illustrate how it could work.
-		tester.delegate(g);
+		g.strokeLine(Constants.screenWidth, 350, 0, 350);
+
+		
+		g.drawImage(player.getImage(), player.getPlayerX(), player.getPlayerY(), Constants.playerWidth, Constants.playerHeight);
+		
+		
+		
+//		Detta block används för att rita ut rectanglarna runt spelare och enemy
+		g.setStroke(Color.BLACK); // Set the rectangle's border color
+		g.setLineWidth(2); // Set the border width
+		g.strokeRect(flyingEnemy.getX(), tempy, Constants.enemyWidth, Constants.enemyHeight);
+		g.strokeRect(player.getPlayerX(), player.getRect(), Constants.playerWidth, Constants.playerHeight);
+
+		
+		
+		drawEnemy(g);
+
+	
+
+
 	}
 
+	public void drawEnemy(GraphicsContext g) {
+		engen = new Random(); 
+
+
+		//		g.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
+		//		if (enemy.getX() < 0 - Constants.enemyWidth) {
+		//			enemy.setAntagonistX(Constants.screenWidth);
+		//			player.updatePasses(1);
+		//		}
+
+
+
+
+		g.drawImage(flyingEnemy.getImage(), flyingEnemy.getX(), tempy, Constants.enemyWidth, Constants.enemyHeight);
+		if (flyingEnemy.getX() < 0 - Constants.enemyWidth) {
+			flyingEnemy.setAntagonistX(Constants.screenWidth);
+			player.updatePasses(1);
+			tempy = flyingEnemy.getY();
+			
+			if (player.getPasses() % 5 == 0) {
+				movingSpeed += 4;
+			}
+
+		}
+
+	}
+
+
+
+
+
+	//TODO om score är större än visst antal --> lotta mellan flying och vanlig, vi kan göra en random med 2 int, ochberoende på vad den blir kan vi rita en
+	//TODO göra en variabel för y positionen som hämtas om vi ritar flygande, för att den ska behålla samma position på hela y axeln
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 	@Override
 	public void keyPressed(KeyEvent key) {
-		System.out.println("Trycker på " + key.getCode() + " i PlayState");
 
-		if (key.getCode() == KeyCode.ESCAPE)
+
+		switch (key.getCode()) {
+
+		case ESCAPE:
 			model.switchState(new MenuState(model));
+			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;
+
+		case DOWN:
+			//		Spelaren kan inte ducka om den är mitt i ett hopp
+			if (!up) {
+				down = true;
+
+			}
+			break;
+
+		default:
+			break;
+
+		}
+
+
+
 	}
 
 	@Override
 	public void update() {
-		// Here one would probably instead move the player and any
-		// enemies / moving obstacles currently active.
-		tester.update();
+		//om enemy position är mindre än player och collide är true kollar den inte collision
+
+		//		Enemy hoppar 10 snäpp till vänster för varje update
+		//		enemy.setAntagonistX(enemy.getX()-10);
+		flyingEnemy.setAntagonistX(flyingEnemy.getX()-movingSpeed);
+		//		flyingEnemy.setAntagonistX(flyingEnemy.getX() -10);
+
+		//		Om 
+		if (!gameOver) {
+
+			if (!collided) {
+				//				collided = enemy.playerAntagonistCollision(player);
+				collided = flyingEnemy.playerAntagonistCollision(player);
+
+
+				if (Integer.valueOf(player.getLives()) == 0) {
+					gameOver = true;
+				} 
+			}
+			
+			//återställer boolean när enemy passerat
+			if (collided && flyingEnemy.getX() < player.getPlayerX()) {
+				collided = false;
+			}
+
+
+
+
+
+			if (up) {
+
+				player.jump(movingSpeed);
+			}
+
+			if (player.getPlayerY() == 265) {
+				up = false;
+			}
+
+			if (down) {
+
+				player.slide(slidingPlayer);
+
+			}
+
+		}
+
 	}
 
+
+
+	// Here one would probably instead move the player and any
+	// enemies / moving obstacles currently active.
+
 	/**
 	 * We currently don't have anything to activate in the PlayState so we leave
 	 * this method empty in this case.
 	 */
 	@Override
 	public void activate() {
-		
+
 	}
 
 	/**
@@ -106,7 +317,7 @@ public class PlayState extends GameState {
 	 */
 	@Override
 	public void deactivate() {
-		
+
 	}
 
 }
diff --git a/src/states/Player.java b/src/states/Player.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1dfab951a659b1f86416d8f2346d8cff1c3e9f7
--- /dev/null
+++ b/src/states/Player.java
@@ -0,0 +1,175 @@
+package states;
+
+import java.io.FileInputStream;
+
+
+import java.io.FileNotFoundException;
+
+import constants.Constants;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.shape.Rectangle;
+
+public class Player {
+	
+//	TODO se över funktioner, kanske lättare att slå samman vissa
+
+	private double playerX = (Constants.screenWidth - Constants.playerWidth) / 2;
+	private double playerY = 265.00;
+	private int score = 0; 
+	private int lives = 3;
+	private Image image;
+	private boolean down = false;
+	private boolean up = false;
+	private Image slidingImage;
+	private Image currImage = null;
+	private int passes = 0;
+	private Rectangle bounds;
+	private double topPos = playerY;
+
+
+
+
+
+	public int getPasses() {
+		return passes;
+	}
+
+
+
+
+
+	public void updatePasses(int passes) {
+		this.passes += passes;
+	}
+
+
+
+
+
+	public Player(String playerImg) {
+
+		bounds = new Rectangle(playerX, topPos, Constants.playerWidth, Constants.playerHeight);
+
+		try {
+			image = new Image(new FileInputStream(playerImg));
+			//slidingImage = new Image(new FileInputStream(Constants.slidingPlayerImg));
+	
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		currImage = image;
+
+	}
+
+
+	public double getRect() {
+		return topPos;
+	}
+
+
+	public Image getImage() {
+		return currImage;
+	}
+
+
+	public String getLives() {
+		return Integer.toString(this.lives);
+	}
+
+
+	public void decreaseLives() {
+
+
+		this.lives--;
+
+	}
+
+
+	public double getPlayerX() {
+		return playerX;
+	}
+
+
+	public double getPlayerY() {
+		return playerY;
+	}
+
+
+
+
+
+
+	public void jump(int movingSpeed) {
+
+
+		if (!down) {
+
+			playerY -= movingSpeed;
+			topPos -= movingSpeed;
+
+			if (playerY <= 110) {
+
+				down = true;
+
+			}
+
+		}
+
+		if (down) {
+
+			playerY += movingSpeed;
+			topPos += movingSpeed;
+
+			if (playerY == 265) {
+				down = false;
+			}
+
+		}
+
+	}
+
+
+	public void slide(String img) {
+		try {
+			slidingImage = new Image(new FileInputStream(img));
+			//slidingImage = new Image(new FileInputStream(Constants.slidingPlayerImg));
+	
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+	
+		currImage = slidingImage;
+		topPos = 305.00;
+		
+			
+	}
+
+
+	public void setPlayerX(double playerX) {
+		this.playerX = playerX;
+	}
+
+
+	public void setPlayerY(double playerY) {
+		this.playerY = playerY;
+	}
+
+
+	public void standUp() {
+		currImage = image;
+		topPos = playerY;
+		
+	}
+
+
+
+
+
+}
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
+	
+}
diff --git a/src/testing/Tester.java b/src/testing/Tester.java
index 3edb6af3be807e432f41d0190f37a3ff48fa0cb5..9fe95fcad9e613cd5ae7e48f6dcad51394eef9f5 100644
--- a/src/testing/Tester.java
+++ b/src/testing/Tester.java
@@ -101,17 +101,17 @@ public class Tester {
 
 	private void draw(GraphicsContext g) {
 		//		if (position.x >= SCREEN_WIDTH || position.y >= SCREEN_HEIGHT) {
-		if (position.x <= 0 || position.y >= Constants.SCREEN_HEIGHT) {
+		if (position.x <= 0 || position.y >= Constants.screenHeight) {
 			// The position is exiting the screen, so we reset it
 			//			position.x = 0.0;
-			position.x = 900.0;
+			position.x = 1000.0;
 			//			position.y = 0.0;
 			position.y = 600.0;
 		}
 
-		drawRotatedImage(g, smile, angle, 500, 400);
+//		drawRotatedImage(g, smile, angle, 500, 400);
 		g.drawImage(car, position.x, position.y, 100, 100);
-		g.drawImage(player, Constants.SCREEN_WIDTH/2-50, 600, 100, 100);
+		g.drawImage(player, Constants.screenWidth/2-50, 600, 100, 100);
 		g.drawImage(banana, position.x, position.y, 100, 100);
 	}
 }