diff --git a/src/Images1/city.png b/src/Images1/city.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ddf25c9370a652794a136e5d6a6bc26da9889f Binary files /dev/null and b/src/Images1/city.png differ diff --git a/src/Images1/city1.png b/src/Images1/city1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6e652d3bbd248d0f01b93ca64e33668e547544 Binary files /dev/null and b/src/Images1/city1.png differ diff --git a/src/constants/Constants.java b/src/constants/Constants.java index 1182b0f15143a5091031846a8aa47dc67d03c9b1..8da1b11873ce1d668a721e5724c6bb6f98b9d2ee 100644 --- a/src/constants/Constants.java +++ b/src/constants/Constants.java @@ -41,5 +41,7 @@ public interface Constants { double powerWidth = 40; double powerHeight = 40; + String backgroundImg = "src/Images1/city.png"; + String backgroundImg2 = "src/Images1/city1.png"; } diff --git a/src/states/Enemy.java b/src/states/Enemy.java index c90c308b2a136b0971d10d9e8db93cb13ab8fe71..67bd9c4b2f5f97e3f0678f750acbf3e0cee61888 100644 --- a/src/states/Enemy.java +++ b/src/states/Enemy.java @@ -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 * Bomben som flyingenemy är en instan av enemy. */ -public class Enemy extends Object{ +public class Enemy extends NonPlayableObject{ diff --git a/src/states/FlyingEnemy.java b/src/states/FlyingEnemy.java index 10bc96540e2a679943a802495872fc23820347eb..f74c7258d1565566de096781d7099b3c4ffb78d9 100644 --- a/src/states/FlyingEnemy.java +++ b/src/states/FlyingEnemy.java @@ -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) * */ -public class FlyingEnemy extends Object{ +public class FlyingEnemy extends NonPlayableObject{ private Random drop; diff --git a/src/states/MenuState.java b/src/states/MenuState.java index edd626d808c8b2b80035785629ec848074db819d..e47e85527616cb12c52368509c5676cd425cffbe 100644 --- a/src/states/MenuState.java +++ b/src/states/MenuState.java @@ -25,10 +25,17 @@ public class MenuState extends GameState { private Image img1; private Image img2; private boolean mode1; + private HighScore score = new HighScore(); + public MenuState(GameModel 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; fontColor = Color.LIGHTBLUE; diff --git a/src/states/Object.java b/src/states/NonPlayableObject.java similarity index 92% rename from src/states/Object.java rename to src/states/NonPlayableObject.java index de244067e2da382e44e5b66c17932aaad2a449b1..b07c3bbb553c91fc65b093e7908998861e9215fd 100644 --- a/src/states/Object.java +++ b/src/states/NonPlayableObject.java @@ -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. * */ -public abstract class Object { +public abstract class NonPlayableObject { protected double posX; protected double posY; @@ -20,7 +20,7 @@ public abstract class Object { private double width; 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; posX = x; @@ -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; width = w; height = h; diff --git a/src/states/PlayState.java b/src/states/PlayState.java index dba19a03663a28e4db2a1b413202f97ab1c54159..dca2cdb65d0ac0e53126e3565a4ebcb136d7828d 100644 --- a/src/states/PlayState.java +++ b/src/states/PlayState.java @@ -1,9 +1,13 @@ package states; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; import javafx.scene.input.KeyEvent; import javafx.scene.paint.Color; import javafx.scene.text.Font; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.util.concurrent.ThreadLocalRandom; import constants.Constants; @@ -38,9 +42,10 @@ public class PlayState extends GameState { private int num; private String bombImg; 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) { super(model); informationText = "Press Escape \nTo Return To The Menu"; @@ -50,6 +55,8 @@ public class PlayState extends GameState { scoreText = "Highscore: " + Integer.toString(score.getHighScore()); extraLife = new ExtraLifePowerUp(Constants.lifeImg, 1200.00, Constants.powerHeight, Constants.powerWidth); speedUp = new SpeedPowerUp(Constants.powerImg, 1200.00, Constants.powerHeight, Constants.powerWidth); + + if (mode) { mode1(); @@ -58,30 +65,47 @@ public class PlayState extends GameState { } } -// sätter upp mode1 med relevanta variabler - public void mode1() { + // sätter upp mode1 med relevanta variabler + private void mode1() { player = new Player(Constants.playerImg); 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); bombImg = Constants.bombImg; bgColor = Color.ROYALBLUE; 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 - public void mode2() { + //samma som ovan fast mode 2 + private void mode2() { player = new Player(Constants.playerImg2); 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); bombImg = Constants.bombImg2; bgColor = Color.BEIGE; 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) { drawBackground(g); drawGameStats(g); @@ -89,11 +113,11 @@ public class PlayState extends GameState { drawEnemies(g); drawPowerUps(g); } -// ritar player + // ritar player private void drawPlayer(GraphicsContext g) { 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) { currScore = "Currently: " + Integer.toString(player.getPasses()); @@ -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) { - 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.setLineWidth(1); g.setLineDashes(2); 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) { if (isPowerUpActive && !speedActive) { @@ -137,8 +166,8 @@ public class PlayState extends GameState { } } -// ritar speedup, fungerar likadant som ritningen under för den andra powerupen - public void drawSpeedUp(GraphicsContext g) { + // ritar speedup, fungerar likadant som ritningen under för den andra powerupen + private void drawSpeedUp(GraphicsContext g) { if(speedUp.getX() < 0 - Constants.playerWidth) { speedUp.setX(Constants.screenWidth); isPowerUpActive = false; @@ -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 -// om bomb inte är null så ritas den också. + // 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å. public void drawEnemies(GraphicsContext g) { - + if (!isFlyingEnemyActive) { drawGroundEnemy(g); } else { @@ -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 -// 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 + // 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 private void drawFlyingEnemy(GraphicsContext g) { g.drawImage(flyingEnemy.getImage(), flyingEnemy.getX(), flyingEnemy.getY(), Constants.enemyWidth, Constants.enemyHeight); @@ -187,7 +216,7 @@ public class PlayState extends GameState { flyingEnemy.resetBombDrop(); speedCheck(); - + if(getRandom() == 1) { isFlyingEnemyActive = false; @@ -197,8 +226,8 @@ public class PlayState extends GameState { } } -// 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. + // 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. private void drawGroundEnemy(GraphicsContext g) { g.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), Constants.enemyWidth, Constants.enemyHeight); @@ -214,17 +243,16 @@ public class PlayState extends GameState { if (player.getPasses() > 4 && getRandom() == 0) { // 50% chance after player hase passed isFlyingEnemyActive = true; - System.out.println("flyingenemy"); } } } -// 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 -// 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. - public void speedCheck() { + // 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 + // 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. + private void speedCheck() { if (player.getPasses() % 30 == 0) { movingSpeed += 1; System.out.println("speed set to: " + Integer.toString(movingSpeed)); @@ -243,9 +271,9 @@ public class PlayState extends GameState { public int getSpeed() { return movingSpeed; } - -// 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ä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 public void setSpeed(int s) { if (s == 100) { @@ -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. - public int getRandom() { + // funktion för att returnera random, denna kan hantera att den kallas på på flera ställen samtidigt. + private int getRandom() { return ThreadLocalRandom.current().nextInt(2); } @@ -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() { if (isPowerUpActive) { @@ -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. -// 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. + // 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. + // då återställer vi till ursprungspositionen och ställer up variabeln till false för att sluta animationen. private void movePlayer() { if (up) { @@ -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. -// annars tappar vi alla liv på en gång eftersom den kallas 50 ggr per sekund. + // 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. private void checkGroundCollision() { if (!collided && enemy.playerObjectCollision(player)) { @@ -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() { if (bomb != null) { bomb.setY(bomb.getY() + movingSpeed); @@ -384,9 +412,9 @@ public class PlayState extends GameState { } } -// 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 den bomben vi skapat inte är null så tilldelar vi globala variabeln bomb den nya bomben. Anars ritas bomben bara vid ursprungspositionen. + // 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 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() { if (isFlyingEnemyActive) { @@ -405,19 +433,12 @@ public class PlayState extends GameState { // 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() { } - /** - * We currently don't have anything to deactivate in the PlayState so we leave - * this method empty in this case. - */ @Override public void deactivate() { diff --git a/src/states/PowerUp.java b/src/states/PowerUp.java index 9a8609a7a059ec6bfae0f4da5cce2048cc594a9b..26887726bd7d30e8873176ec481a6b29c5fad218 100644 --- a/src/states/PowerUp.java +++ b/src/states/PowerUp.java @@ -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. * 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 Random random = new Random();