Skip to content
Snippets Groups Projects
Commit 0611d275 authored by Oscar Wiberg's avatar Oscar Wiberg
Browse files

Klar

parent 52da342e
No related branches found
No related tags found
No related merge requests found
src/Images1/city.png

40.5 KiB

src/Images1/city1.png

39.6 KiB

...@@ -41,5 +41,7 @@ public interface Constants { ...@@ -41,5 +41,7 @@ public interface Constants {
double powerWidth = 40; double powerWidth = 40;
double powerHeight = 40; double powerHeight = 40;
String backgroundImg = "src/Images1/city.png";
String backgroundImg2 = "src/Images1/city1.png";
} }
...@@ -5,7 +5,7 @@ package states; ...@@ -5,7 +5,7 @@ package states;
* Enemy(groundenemy), gör inte så mycket unikt och använder mest den fördefinierade funktionaliteten som finns objekt classen * Enemy(groundenemy), gör inte så mycket unikt och använder mest den fördefinierade funktionaliteten som finns objekt classen
* Bomben som flyingenemy är en instan av enemy. * Bomben som flyingenemy är en instan av enemy.
*/ */
public class Enemy extends Object{ public class Enemy extends NonPlayableObject{
......
...@@ -11,7 +11,7 @@ import java.util.Random; ...@@ -11,7 +11,7 @@ import java.util.Random;
* Går att konfigurera den om man vill att den tar in player xpos efter senaste passeringen eller här och nu(det blir svårare) * Går att konfigurera den om man vill att den tar in player xpos efter senaste passeringen eller här och nu(det blir svårare)
* *
*/ */
public class FlyingEnemy extends Object{ public class FlyingEnemy extends NonPlayableObject{
private Random drop; private Random drop;
......
...@@ -25,10 +25,17 @@ public class MenuState extends GameState { ...@@ -25,10 +25,17 @@ public class MenuState extends GameState {
private Image img1; private Image img1;
private Image img2; private Image img2;
private boolean mode1; private boolean mode1;
private HighScore score = new HighScore();
public MenuState(GameModel model) { public MenuState(GameModel model) {
super(model); super(model);
informationText = "Welcome to the Dino game!\nTo play, press:\n1 for mode 1\n2 for mode 2\nEscape to exit game"; informationText = "Welcome to the Dino game!"
+ "\nCurrent highscore is: " + Integer.toString(score.getHighScore())
+ "\nTo play, press:"
+ "\n1 for mode 1"
+ "\n2 for mode 2"
+ "\nEscape to exit game";
bgColor = Color.GREY; bgColor = Color.GREY;
fontColor = Color.LIGHTBLUE; fontColor = Color.LIGHTBLUE;
......
...@@ -12,7 +12,7 @@ import javafx.scene.shape.Rectangle; ...@@ -12,7 +12,7 @@ import javafx.scene.shape.Rectangle;
* Allt som inte är player går egentligen genom denna class för att ärva funktionalitet och variabler. * Allt som inte är player går egentligen genom denna class för att ärva funktionalitet och variabler.
* *
*/ */
public abstract class Object { public abstract class NonPlayableObject {
protected double posX; protected double posX;
protected double posY; protected double posY;
...@@ -20,7 +20,7 @@ public abstract class Object { ...@@ -20,7 +20,7 @@ public abstract class Object {
private double width; private double width;
protected Image img; protected Image img;
public Object(String image, double x, double y, double h, double w) { public NonPlayableObject(String image, double x, double y, double h, double w) {
posY = y; posY = y;
posX = x; posX = x;
...@@ -36,7 +36,7 @@ public abstract class Object { ...@@ -36,7 +36,7 @@ public abstract class Object {
} }
} }
public Object(String image, double x, double h, double w) { public NonPlayableObject(String image, double x, double h, double w) {
posX = x; posX = x;
width = w; width = w;
height = h; height = h;
......
package states; package states;
import javafx.scene.canvas.GraphicsContext; import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.text.Font; import javafx.scene.text.Font;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import constants.Constants; import constants.Constants;
...@@ -38,9 +42,10 @@ public class PlayState extends GameState { ...@@ -38,9 +42,10 @@ public class PlayState extends GameState {
private int num; private int num;
private String bombImg; private String bombImg;
private boolean speedActive; private boolean speedActive;
private Image bgImage;
// Sätter upp playstate och tar en in en boolean som avgör om mode 1 eller 2 // Sätter upp playstate och tar en in en boolean som avgör om mode 1 eller 2
public PlayState(GameModel model, boolean mode) { public PlayState(GameModel model, boolean mode) {
super(model); super(model);
informationText = "Press Escape \nTo Return To The Menu"; informationText = "Press Escape \nTo Return To The Menu";
...@@ -50,6 +55,8 @@ public class PlayState extends GameState { ...@@ -50,6 +55,8 @@ public class PlayState extends GameState {
scoreText = "Highscore: " + Integer.toString(score.getHighScore()); scoreText = "Highscore: " + Integer.toString(score.getHighScore());
extraLife = new ExtraLifePowerUp(Constants.lifeImg, 1200.00, Constants.powerHeight, Constants.powerWidth); extraLife = new ExtraLifePowerUp(Constants.lifeImg, 1200.00, Constants.powerHeight, Constants.powerWidth);
speedUp = new SpeedPowerUp(Constants.powerImg, 1200.00, Constants.powerHeight, Constants.powerWidth); speedUp = new SpeedPowerUp(Constants.powerImg, 1200.00, Constants.powerHeight, Constants.powerWidth);
if (mode) { if (mode) {
mode1(); mode1();
...@@ -58,30 +65,47 @@ public class PlayState extends GameState { ...@@ -58,30 +65,47 @@ public class PlayState extends GameState {
} }
} }
// sätter upp mode1 med relevanta variabler // sätter upp mode1 med relevanta variabler
public void mode1() { private void mode1() {
player = new Player(Constants.playerImg); player = new Player(Constants.playerImg);
enemy = new Enemy(Constants.enemyImg, 900.00, 270.00, Constants.enemyHeight, Constants.enemyWidth); enemy = new Enemy(Constants.enemyImg, 900.00, 270.00, Constants.enemyHeight, Constants.enemyWidth);
flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg, 900.00, 20.00, Constants.enemyHeight, Constants.enemyWidth); flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg, 900.00, 20.00, Constants.enemyHeight, Constants.enemyWidth);
bombImg = Constants.bombImg; bombImg = Constants.bombImg;
bgColor = Color.ROYALBLUE; bgColor = Color.ROYALBLUE;
lineColor = Color.WHITE; lineColor = Color.WHITE;
try {
bgImage = new Image(new FileInputStream(Constants.backgroundImg));
//slidingImage = new Image(new FileInputStream(Constants.slidingPlayerImg));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
//samma som ovan fast mode 2 //samma som ovan fast mode 2
public void mode2() { private void mode2() {
player = new Player(Constants.playerImg2); player = new Player(Constants.playerImg2);
enemy = new Enemy(Constants.enemyImg2, 900.00, 270.00, Constants.enemyHeight, Constants.enemyWidth); enemy = new Enemy(Constants.enemyImg2, 900.00, 270.00, Constants.enemyHeight, Constants.enemyWidth);
flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg2, 900.00, 20.00, Constants.enemyHeight, Constants.enemyWidth); flyingEnemy = new FlyingEnemy(Constants.flyingEnemyImg2, 900.00, 20.00, Constants.enemyHeight, Constants.enemyWidth);
bombImg = Constants.bombImg2; bombImg = Constants.bombImg2;
bgColor = Color.BEIGE; bgColor = Color.BEIGE;
lineColor = Color.BLACK; lineColor = Color.BLACK;
try {
bgImage = new Image(new FileInputStream(Constants.backgroundImg2));
//slidingImage = new Image(new FileInputStream(Constants.slidingPlayerImg));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
// ritar ut allt relevant på skärmen, gärs från main och sker med 50 ggr per sekund // ritar ut allt relevant på skärmen, gärs från main och sker med 50 ggr per sekund
@Override
public void draw(GraphicsContext g) { public void draw(GraphicsContext g) {
drawBackground(g); drawBackground(g);
drawGameStats(g); drawGameStats(g);
...@@ -89,11 +113,11 @@ public class PlayState extends GameState { ...@@ -89,11 +113,11 @@ public class PlayState extends GameState {
drawEnemies(g); drawEnemies(g);
drawPowerUps(g); drawPowerUps(g);
} }
// ritar player // ritar player
private void drawPlayer(GraphicsContext g) { private void drawPlayer(GraphicsContext g) {
g.drawImage(player.getImage(), player.getPlayerX(), player.getPlayerY(), Constants.playerWidth, Constants.playerHeight); g.drawImage(player.getImage(), player.getPlayerX(), player.getPlayerY(), Constants.playerWidth, Constants.playerHeight);
} }
// ritar texten på skärmen samt // ritar texten på skärmen samt
private void drawGameStats(GraphicsContext g) { private void drawGameStats(GraphicsContext g) {
currScore = "Currently: " + Integer.toString(player.getPasses()); currScore = "Currently: " + Integer.toString(player.getPasses());
...@@ -113,16 +137,21 @@ public class PlayState extends GameState { ...@@ -113,16 +137,21 @@ public class PlayState extends GameState {
} }
} }
// ritar bakgrunden samt linjen som spelaren står på // ritar bakgrunden samt linjen som spelaren står på
private void drawBackground(GraphicsContext g) { private void drawBackground(GraphicsContext g) {
drawBg(g, bgColor); // drawBg(g, bgColor);
// Draw the background image covering the whole screen
g.drawImage(bgImage, 0, 0, Constants.screenWidth, Constants.screenHeight);
g.setStroke(lineColor); g.setStroke(lineColor);
g.setLineWidth(1); g.setLineWidth(1);
g.setLineDashes(2); g.setLineDashes(2);
g.strokeLine(Constants.screenWidth, 350, 0, 350); g.strokeLine(Constants.screenWidth, 350, 0, 350);
} }
// om powerups har blivit ativerade och speedup powerupen inte är aktiov så ritas en ny powerup ut, beroende på om den tar num är 0 eller 1, som genereras random i speedcheck() // om powerups har blivit ativerade och speedup powerupen inte är aktiov så ritas en ny powerup ut, beroende på om den tar num är 0 eller 1, som genereras random i speedcheck()
private void drawPowerUps(GraphicsContext g) { private void drawPowerUps(GraphicsContext g) {
if (isPowerUpActive && !speedActive) { if (isPowerUpActive && !speedActive) {
...@@ -137,8 +166,8 @@ public class PlayState extends GameState { ...@@ -137,8 +166,8 @@ public class PlayState extends GameState {
} }
} }
// ritar speedup, fungerar likadant som ritningen under för den andra powerupen // ritar speedup, fungerar likadant som ritningen under för den andra powerupen
public void drawSpeedUp(GraphicsContext g) { private void drawSpeedUp(GraphicsContext g) {
if(speedUp.getX() < 0 - Constants.playerWidth) { if(speedUp.getX() < 0 - Constants.playerWidth) {
speedUp.setX(Constants.screenWidth); speedUp.setX(Constants.screenWidth);
isPowerUpActive = false; isPowerUpActive = false;
...@@ -156,11 +185,11 @@ public class PlayState extends GameState { ...@@ -156,11 +185,11 @@ public class PlayState extends GameState {
} }
// ritar enemy, beroende på om den flygande har blivit aktiverad eller ej, som intitielt sker i ground enemy, därefter i flygande enemy // ritar enemy, beroende på om den flygande har blivit aktiverad eller ej, som intitielt sker i ground enemy, därefter i flygande enemy
// om bomb inte är null så ritas den också. // om bomb inte är null så ritas den också.
public void drawEnemies(GraphicsContext g) { public void drawEnemies(GraphicsContext g) {
if (!isFlyingEnemyActive) { if (!isFlyingEnemyActive) {
drawGroundEnemy(g); drawGroundEnemy(g);
} else { } else {
...@@ -175,8 +204,8 @@ public class PlayState extends GameState { ...@@ -175,8 +204,8 @@ public class PlayState extends GameState {
// om den befinner sig utanför skärmen så pterställer vi en vriabel för att bomben har blivit droppad i flyingenemy klassen // om den befinner sig utanför skärmen så pterställer vi en vriabel för att bomben har blivit droppad i flyingenemy klassen
// Den tar ett rando 50/50 beslut om det ska ritas uten en flygande enemy härnäst, om false så blir det flygande igen // Den tar ett rando 50/50 beslut om det ska ritas uten en flygande enemy härnäst, om false så blir det flygande igen
private void drawFlyingEnemy(GraphicsContext g) { private void drawFlyingEnemy(GraphicsContext g) {
g.drawImage(flyingEnemy.getImage(), flyingEnemy.getX(), flyingEnemy.getY(), Constants.enemyWidth, Constants.enemyHeight); g.drawImage(flyingEnemy.getImage(), flyingEnemy.getX(), flyingEnemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
...@@ -187,7 +216,7 @@ public class PlayState extends GameState { ...@@ -187,7 +216,7 @@ public class PlayState extends GameState {
flyingEnemy.resetBombDrop(); flyingEnemy.resetBombDrop();
speedCheck(); speedCheck();
if(getRandom() == 1) { if(getRandom() == 1) {
isFlyingEnemyActive = false; isFlyingEnemyActive = false;
...@@ -197,8 +226,8 @@ public class PlayState extends GameState { ...@@ -197,8 +226,8 @@ public class PlayState extends GameState {
} }
} }
// fungerar mer eller mindre likadant som för flying enemy. // fungerar mer eller mindre likadant som för flying enemy.
// Sparar en variabel för om det skett en kollision eller ej, sätter den til null samt kordinaten för kollisonen varje gång enemy hamnar utanför skärmen. // Sparar en variabel för om det skett en kollision eller ej, sätter den til null samt kordinaten för kollisonen varje gång enemy hamnar utanför skärmen.
private void drawGroundEnemy(GraphicsContext g) { private void drawGroundEnemy(GraphicsContext g) {
g.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), Constants.enemyWidth, Constants.enemyHeight); g.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), Constants.enemyWidth, Constants.enemyHeight);
...@@ -214,17 +243,16 @@ public class PlayState extends GameState { ...@@ -214,17 +243,16 @@ public class PlayState extends GameState {
if (player.getPasses() > 4 && getRandom() == 0) { // 50% chance after player hase passed if (player.getPasses() > 4 && getRandom() == 0) { // 50% chance after player hase passed
isFlyingEnemyActive = true; isFlyingEnemyActive = true;
System.out.println("flyingenemy");
} }
} }
} }
// Vi baserar nivåperna och hastigheten på spelet baserat på hur mpånga enemy vi har passerat. // Vi baserar nivåperna och hastigheten på spelet baserat på hur mpånga enemy vi har passerat.
// dessa returnerar bara samma på nummer som är delbara med 30, därmed gör vi båda sakerna om det är en siffra jämt delbar med 30 // dessa returnerar bara samma på nummer som är delbara med 30, därmed gör vi båda sakerna om det är en siffra jämt delbar med 30
// om vi har passerat ett antal jämt delbart med 6, ökjar vi farten på spelet. // om vi har passerat ett antal jämt delbart med 6, ökjar vi farten på spelet.
// om vi har passerat fler än tio samt att det är en siffra jämt delbart med 10, aktiverar vi powerupsm, och genrar vilken som ska ritas, 50/50 chans. // om vi har passerat fler än tio samt att det är en siffra jämt delbart med 10, aktiverar vi powerupsm, och genrar vilken som ska ritas, 50/50 chans.
public void speedCheck() { private void speedCheck() {
if (player.getPasses() % 30 == 0) { if (player.getPasses() % 30 == 0) {
movingSpeed += 1; movingSpeed += 1;
System.out.println("speed set to: " + Integer.toString(movingSpeed)); System.out.println("speed set to: " + Integer.toString(movingSpeed));
...@@ -243,9 +271,9 @@ public class PlayState extends GameState { ...@@ -243,9 +271,9 @@ public class PlayState extends GameState {
public int getSpeed() { public int getSpeed() {
return movingSpeed; return movingSpeed;
} }
// används genom speedup powerup, man måste veta i denhär klassen om den är aktiv. // används genom speedup powerup, man måste veta i denhär klassen om den är aktiv.
// Använde inte för något annat än speedpowerup // Använde inte för något annat än speedpowerup
public void setSpeed(int s) { public void setSpeed(int s) {
if (s == 100) { if (s == 100) {
...@@ -258,8 +286,8 @@ public class PlayState extends GameState { ...@@ -258,8 +286,8 @@ public class PlayState extends GameState {
} }
// funktion för att returnera random, denna kan hantera att den kallas på på flera ställen samtidigt. // funktion för att returnera random, denna kan hantera att den kallas på på flera ställen samtidigt.
public int getRandom() { private int getRandom() {
return ThreadLocalRandom.current().nextInt(2); return ThreadLocalRandom.current().nextInt(2);
} }
...@@ -312,7 +340,7 @@ public class PlayState extends GameState { ...@@ -312,7 +340,7 @@ public class PlayState extends GameState {
} }
} }
// om powerups är aktiva updaterar den poweruppen som har ritats basserat på vilken siffra numm är, samt kollar efter kollisioner. // om powerups är aktiva updaterar den poweruppen som har ritats basserat på vilken siffra numm är, samt kollar efter kollisioner.
private void movePowerUps() { private void movePowerUps() {
if (isPowerUpActive) { if (isPowerUpActive) {
...@@ -331,9 +359,9 @@ public class PlayState extends GameState { ...@@ -331,9 +359,9 @@ public class PlayState extends GameState {
} }
// om vi hoppar med player aktiveras up boolean, detta för att hoppet blir som en animation snarar än när vi flyttar oss högfer och vänster. // om vi hoppar med player aktiveras up boolean, detta för att hoppet blir som en animation snarar än när vi flyttar oss högfer och vänster.
// spelar objectet hanterar hoppet själv. den minskar sin y position tills den når toppen, sen ökar den y positionen tills den är tillbaks på marken. // spelar objectet hanterar hoppet själv. den minskar sin y position tills den når toppen, sen ökar den y positionen tills den är tillbaks på marken.
// då återställer vi till ursprungspositionen och ställer up variabeln till false för att sluta animationen. // då återställer vi till ursprungspositionen och ställer up variabeln till false för att sluta animationen.
private void movePlayer() { private void movePlayer() {
if (up) { if (up) {
...@@ -345,8 +373,8 @@ public class PlayState extends GameState { ...@@ -345,8 +373,8 @@ public class PlayState extends GameState {
} }
} }
// Eftersom ground enemy inte försvinner när vi krockar behöver vi en global boolean här som gör att vi bara kollar efter kollision tills den är true. // Eftersom ground enemy inte försvinner när vi krockar behöver vi en global boolean här som gör att vi bara kollar efter kollision tills den är true.
// annars tappar vi alla liv på en gång eftersom den kallas 50 ggr per sekund. // annars tappar vi alla liv på en gång eftersom den kallas 50 ggr per sekund.
private void checkGroundCollision() { private void checkGroundCollision() {
if (!collided && enemy.playerObjectCollision(player)) { if (!collided && enemy.playerObjectCollision(player)) {
...@@ -366,8 +394,8 @@ public class PlayState extends GameState { ...@@ -366,8 +394,8 @@ public class PlayState extends GameState {
} }
} }
// fungerar lite annorlunda jämfört med kollisionen på marken. Här behöver vi ingen global variabel. Vi ställer istället bomben till null om det sker en kollisone eller om den åker utanför skärmen. // fungerar lite annorlunda jämfört med kollisionen på marken. Här behöver vi ingen global variabel. Vi ställer istället bomben till null om det sker en kollisone eller om den åker utanför skärmen.
private void checkBombCollision() { private void checkBombCollision() {
if (bomb != null) { if (bomb != null) {
bomb.setY(bomb.getY() + movingSpeed); bomb.setY(bomb.getY() + movingSpeed);
...@@ -384,9 +412,9 @@ public class PlayState extends GameState { ...@@ -384,9 +412,9 @@ public class PlayState extends GameState {
} }
} }
// om det är en bil enemy så minskar vi bara dens x position. // om det är en bil enemy så minskar vi bara dens x position.
// Om flygande enemy så skapar vi en ny bomb som får x koordinaten som player hade sist vi kallade på den funktionen. Sen släpps bomben inom +-50px av den. // Om flygande enemy så skapar vi en ny bomb som får x koordinaten som player hade sist vi kallade på den funktionen. Sen släpps bomben inom +-50px av den.
// om den bomben vi skapat inte är null så tilldelar vi globala variabeln bomb den nya bomben. Anars ritas bomben bara vid ursprungspositionen. // om den bomben vi skapat inte är null så tilldelar vi globala variabeln bomb den nya bomben. Anars ritas bomben bara vid ursprungspositionen.
private void moveEnemies() { private void moveEnemies() {
if (isFlyingEnemyActive) { if (isFlyingEnemyActive) {
...@@ -405,19 +433,12 @@ public class PlayState extends GameState { ...@@ -405,19 +433,12 @@ public class PlayState extends GameState {
// Here one would probably instead move the player and any // Here one would probably instead move the player and any
// enemies / moving obstacles currently active. // 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 @Override
public void activate() { public void activate() {
} }
/**
* We currently don't have anything to deactivate in the PlayState so we leave
* this method empty in this case.
*/
@Override @Override
public void deactivate() { public void deactivate() {
......
...@@ -12,7 +12,7 @@ import javafx.scene.image.Image; ...@@ -12,7 +12,7 @@ import javafx.scene.image.Image;
* när vi vill kolla kollision med powerup kallar vi däremot på checkcCollision, då kallar den på use om det blir en collision. * när vi vill kolla kollision med powerup kallar vi däremot på checkcCollision, då kallar den på use om det blir en collision.
* De spawnar också in på en random y-coordinat inom det spannet som player kan nå med sitt hopp. * De spawnar också in på en random y-coordinat inom det spannet som player kan nå med sitt hopp.
*/ */
public abstract class PowerUp extends Object{ public abstract class PowerUp extends NonPlayableObject{
private int scoreSinceActive = 0; private int scoreSinceActive = 0;
private Random random = new Random(); private Random random = new Random();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment