From 679dddfee7db3d7f9c47cfca7547849ff27f5939 Mon Sep 17 00:00:00 2001 From: Matan Date: Sun, 20 Mar 2016 20:11:17 +0200 Subject: [PATCH] - 6 stages + blitz stage - waves re-arranged and timed with fire delay, launch delay, enemy lives, and number of enemies --- BlitzStage.java | 91 +++++++ FifthStage.java | 77 ++++++ FirstStage.java | 56 ++++ FourthStage.java | 63 +++++ GameEngine.java | 342 ++++++++++++++++++++++++ Level.java | 571 +++++++++++++++++++++++++++++++++++++++++ MainMenuScene.java | 123 +++++++++ Scene.java | 45 ++++ SecondStage.java | 63 +++++ SettingsMenuScene.java | 65 +++++ SixthStage.java | 84 ++++++ Stage.java | 111 ++++++++ ThirdStage.java | 63 +++++ 13 files changed, 1754 insertions(+) create mode 100644 BlitzStage.java create mode 100644 FifthStage.java create mode 100644 FirstStage.java create mode 100644 FourthStage.java create mode 100644 GameEngine.java create mode 100644 Level.java create mode 100644 MainMenuScene.java create mode 100644 Scene.java create mode 100644 SecondStage.java create mode 100644 SettingsMenuScene.java create mode 100644 SixthStage.java create mode 100644 Stage.java create mode 100644 ThirdStage.java diff --git a/BlitzStage.java b/BlitzStage.java new file mode 100644 index 0000000..4dc6c7b --- /dev/null +++ b/BlitzStage.java @@ -0,0 +1,91 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class BlitzStage extends Level{ + + protected final int NUM_OF_WAVES = 4; + + public BlitzStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 35; + fireDelay = 0.5; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(0); + break; + case 1: + numOfEnemies = 35; + fireDelay = 0.3; + launchDelay = 0.5; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(1); + break; + case 2: + numOfEnemies = 45; + fireDelay = 0.3; + launchDelay = 0.5; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 3: + numOfEnemies = 45; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 4: + numOfEnemies = 55; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(4); + break; + case 5: + numOfEnemies = 55; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(5); + break; + case 6: + numOfEnemies = 65; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 7: + numOfEnemies = 65; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 10; + wc = engine.getWaveConfigs().getWaveConfig(7); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/FifthStage.java b/FifthStage.java new file mode 100644 index 0000000..53d005e --- /dev/null +++ b/FifthStage.java @@ -0,0 +1,77 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class FifthStage extends Level{ + + protected final int NUM_OF_WAVES = 4; + + public FifthStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 15; + fireDelay = 0.3; + launchDelay = 0.7; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(1); + break; + case 1: + numOfEnemies = 15; + fireDelay = 0.3; + launchDelay = 0.7; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(4); + break; + case 2: + numOfEnemies = 20; + fireDelay = 0.3; + launchDelay = 0.7; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(5); + break; + case 3: + numOfEnemies = 25; + fireDelay = 0.3; + launchDelay = 0.7; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(0); + break; + case 4: + numOfEnemies = 35; + fireDelay = 0.2; + launchDelay = 0.5; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 5: + numOfEnemies = 35; + fireDelay = 0.1; + launchDelay = 0.3; + numOfHits = 5; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/FirstStage.java b/FirstStage.java new file mode 100644 index 0000000..d946d29 --- /dev/null +++ b/FirstStage.java @@ -0,0 +1,56 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class FirstStage extends Level{ + + protected final int NUM_OF_WAVES = 2; + + public FirstStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 5; + fireDelay = 1.1; + launchDelay = 2; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(0); + break; + case 1: + numOfEnemies = 5; + fireDelay = 0.8; + launchDelay = 2; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(1); + break; + case 2: + numOfEnemies = 15; + fireDelay = 0.7; + launchDelay = 1.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/FourthStage.java b/FourthStage.java new file mode 100644 index 0000000..1ffb7fc --- /dev/null +++ b/FourthStage.java @@ -0,0 +1,63 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class FourthStage extends Level{ + + protected final int NUM_OF_WAVES = 4; + + public FourthStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 10; + fireDelay = 0.5; + launchDelay = 1; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 1: + numOfEnemies = 15; + fireDelay = 0.3; + launchDelay = 0.8; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 2: + numOfEnemies = 10; + fireDelay = 0.3; + launchDelay = 0.7; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(0); + break; + case 3: + numOfEnemies = 5; + fireDelay = 0.2; + launchDelay = 0.7; + numOfHits = 5; + wc = engine.getWaveConfigs().getWaveConfig(7); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/GameEngine.java b/GameEngine.java new file mode 100644 index 0000000..ac87c09 --- /dev/null +++ b/GameEngine.java @@ -0,0 +1,342 @@ +package com.sagi.dayan.Games.Engine; + +/** + * Created by sagi on 2/8/16. + */ + +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Random; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import com.sagi.dayan.Games.Stage.*; +import com.sagi.dayan.Games.Stage.MainMenuScene; +import com.sagi.dayan.Games.Stage.Scene; +import com.sagi.dayan.Games.Stage.SettingsMenuScene; +import com.sagi.dayan.Games.Stage.Stage; +import com.sagi.dayan.Games.Utils.Utils; +import com.sagi.dayan.Games.Utils.WaveConfigs; + + + +public class GameEngine { + private final int CREDIT_TIME = 10; + public boolean gameOn , gameOver, isFirstGame; + private JFrame frame; + private int pWidth, pHeight, numOfPlayers; //panel dimensions + private Random r; + private Stage stage; + private Scene scene; + private int p1CreditTime, p2CreditTime, creditTickTime = 1; + public static final int PLAYER_WIDTH = 120, PLAYER_HEIGHT = 120; + public static final int UP=0,RIGHT=1,DOWN=2, LEFT=3, FIRE=4, USE_CREDIT=5; + public int p1HighScore, p2HighScore; + + private int[] p1Controlles = {KeyEvent.VK_UP, KeyEvent.VK_RIGHT, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_K, KeyEvent.VK_J}; + private int[] p2Controlles = {KeyEvent.VK_W, KeyEvent.VK_D, KeyEvent.VK_S, KeyEvent.VK_A, KeyEvent.VK_Q, KeyEvent.VK_Z}; + + private int p1Lives, p2Lives, p1Health, p2Health, credits, p1Score, p2Score; + + private long lastP1CreditTick, lastP2CreditTick; + + private Font gameFont; + + private WaveConfigs waveConfigs; + private int currentLevel; + + public GameEngine(int width, int height, Stage stage){ + p1HighScore = p2HighScore = 0; + this.isFirstGame = true; + this.gameOver = true; + this.pWidth = width; + this.pHeight = height; + this.stage = stage; + currentLevel = -1; + goToMenu(); + r = new Random(); + try{ + gameFont = Font.createFont(Font.TRUETYPE_FONT,Utils.getFontStream("transformers.ttf")); + } catch (FontFormatException e) { + e.printStackTrace(); + gameFont = null; + } catch (IOException e) { + e.printStackTrace(); + gameFont = null; + } + this.waveConfigs = new WaveConfigs(); + startNewGame(); + + } + + + private void resetPlayerHealth(int i){ + if (i==0){ + p1Health = 100; + } + else{ + p2Health = 100; + } + } + + + + + + /** + * initialize and reset vars and timers to "new game" configuration. + */ + private void startNewGame(){ + this.gameOn = true; + this.currentLevel = -1; + initGame(); + } + + /** + * Setup all actors in the game to a new game - reset timer + */ + private void initGame(){ + resetPlayerHealth(0); + resetPlayerHealth(1); + p1Score = p2Score = 0; + credits = 3; + p1Lives = 1; + p2Lives = 1; + } + + public int getP1CreditTime() { + return p1CreditTime; + } + + public int getP2CreditTime() { + return p2CreditTime; + } + + public WaveConfigs getWaveConfigs() { + return waveConfigs; + } + + + + + /** + * returns gameOver flag + * @return + * boolean + */ + public boolean isGameOver(){ + return this.gameOver; + } + + + + + + /** + * Update all sprites, including collision handling. + */ + public void update(){ + long now = System.currentTimeMillis(); + if(now - lastP1CreditTick >= creditTickTime * 1000){ + p1CreditTime--; + lastP1CreditTick = now; + } + if(now - lastP2CreditTick >= creditTickTime * 1000){ + p2CreditTime--; + lastP2CreditTick = now; + } + scene.update(); + } + + public void render(JPanel p) { + scene.render(p); + } + + public BufferedImage getScene() { + return scene.getSceneImage(); + } + + public void startGame(int numOfPlayers){ + this.numOfPlayers = numOfPlayers; + startNewGame(); + changeLevel(); + } + + public void changeLevel(){ + System.out.println("current level: "+currentLevel); + currentLevel++; + stage.removeMouseListener(scene); + stage.removeKeyListener(scene); + switch (currentLevel){ + case 0: + scene = new FirstStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 5}); + break; + case 1: + scene = new SecondStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 2.0 =-", new int[]{5, 5,5}); + break; + case 2: + scene = new ThirdStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 3.0 =-", new int[]{5, 0,2,8}); + break; + case 3: + scene = new FourthStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 4.0 =-", new int[]{5, 0,0,7}); + break; + case 4: + scene = new FifthStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 5.0 =-", new int[]{5, 1,3,8, 10, 10}); + break; + case 5: + scene = new SixthStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 6.0 =-", new int[]{5, 0,0,0, 0, 0, 10, 20}); + break; + case 6: + scene = new BlitzStage(pWidth, pHeight, numOfPlayers, this, "-= BLITZ STAGE =-", new int[]{5, 0,0,0, 0, 0, 0, 0, 0, 0, 0}); + break; + + } + stage.addKeyListener(scene); + stage.addMouseListener(scene); + } + + + public void goToSettings() { + stage.removeMouseListener(scene); + stage.removeKeyListener(scene); + scene = new SettingsMenuScene(pWidth, pHeight, this); + stage.addKeyListener(scene); + stage.addMouseListener(scene); + } + + + public int[] getP1Controlles(){ + return p1Controlles; + } + + public int[] getP2Controlles(){ + return p2Controlles; + } + + public Font getGameFont() { + return gameFont; + } + + public int getP1Lives() { + return p1Lives; + } + public int getP2Lives() { + return p2Lives; + } + + public int getP1Health() { + return p1Health; + } + + public int getP2Health() { + return p2Health; + } + + public int getP1Score() { + return p1Score; + } + + public int getP2Score() { + return p2Score; + } + + public int getCredits() {return credits;} + + + public void useCredit(){ + credits--; + } + + public void revivePlayer(int i) + { + useCredit(); + + if(i==0){ + p1Health=100; + p1Lives =3; + } + else{ + p2Health=100; + p2Lives =3; + } + + } + + + public void setScore(int i, int score) + { + if (i == 0) { + p1Score += score; + } else { + p2Score += score; + } + } + public void setPlayerHealth(int i, int strike) { + if (i == 0) { + p1Health += strike; + if(p1Health <= 0){ + p1Lives--; + if(p1Lives > 0) + resetPlayerHealth(i); + if(p1Lives <= 0){ + p1CreditTime = 10; + lastP1CreditTick = System.currentTimeMillis(); + } + } + } else { + p2Health += strike; + if(p2Health <= 0){ + p2Lives--; + if(p2Lives > 0) + resetPlayerHealth(i); + if(p2Health <= 0){ + p2CreditTime = 10; + lastP2CreditTick = System.currentTimeMillis(); + } + } + } + } + + public void goToMenu(){ + stage.removeMouseListener(scene); + stage.removeKeyListener(scene); + scene = new MainMenuScene(pWidth, pHeight, this); + stage.addKeyListener(scene); + stage.addMouseListener(scene); + } + + + public void setGameOver(boolean gameOver) { + if(gameOver){ + goToMenu(); + this.gameOver = true; + } + + } + + + public int getP1HighScore() { + return p1HighScore; + } + + + public void setP1HighScore(int p1HighScore) { + this.p1HighScore = p1HighScore; + } + + + public int getP2HighScore() { + return p2HighScore; + } + + + public void setP2HighScore(int p2HighScore) { + this.p2HighScore = p2HighScore; + } + + +} \ No newline at end of file diff --git a/Level.java b/Level.java new file mode 100644 index 0000000..689b0b1 --- /dev/null +++ b/Level.java @@ -0,0 +1,571 @@ +package com.sagi.dayan.Games.Stage; + +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; + +import javax.swing.JLabel; +import javax.swing.JPanel; + +import com.sagi.dayan.Games.Elements.Background; +import com.sagi.dayan.Games.Elements.Blast; +import com.sagi.dayan.Games.Elements.Missile; +import com.sagi.dayan.Games.Elements.Player; +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.CollisionUtil; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.Utils; + +/** + * Created by sagi on 2/20/16. + */ +public abstract class Level extends Scene { + protected final double PRESS_START_PULE = 0.3; + protected boolean toDrawStart; + protected Vector players; + protected int p1Speed = 10; + protected Vector p1Missiles, p2Missiles, enemyMissiles; + protected Background bg; + protected int[] waveDelay; + protected int currentWave; + protected int[] yAxisStartingAnimation; + protected int startingAnimationIndex; + protected boolean isStarted; + protected Vector waves; + protected Vector blasts; + protected int numOfPlayers; + protected Map keys; + protected String title; + protected JLabel stageTitle; + protected long lastWaveTime, lastPulseTime; + protected int numOfWaves; + + + + public Level(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay){ + super(width, height, engine); + players = new Vector<>(); + p1Missiles = new Vector<>(); + p2Missiles = new Vector<>(); + blasts = new Vector(); + enemyMissiles = new Vector<>(); + this.waveDelay = waveDelay; + this.lastWaveTime = System.currentTimeMillis(); + this.currentWave = 0; + this.waves = new Vector<>(); + isStarted = false; + keys = new HashMap<>(); + yAxisStartingAnimation = new int[]{height + (5*GameEngine.PLAYER_HEIGHT) , height - (4*GameEngine.PLAYER_HEIGHT) , height - (GameEngine.PLAYER_HEIGHT + 15)}; + startingAnimationIndex = 0; + bg = new Background(0,0,width,height, 1, "L1-BG.jpg", 0,1000, 4760); + this.numOfPlayers = numOfPlayers; + this.title = stageTitle; + this.stageTitle = new JLabel(this.title); + + if(numOfPlayers == 1) { + players.add(new Player((width / 2) + (GameEngine.PLAYER_WIDTH / 2), yAxisStartingAnimation[startingAnimationIndex], + width, height, p1Speed, "emptyImage.png", 0, GameEngine.PLAYER_WIDTH, GameEngine.PLAYER_HEIGHT, "P1",6)); + }else{ + players.add(new Player((width / 2) + (GameEngine.PLAYER_WIDTH / 2) + GameEngine.PLAYER_WIDTH, yAxisStartingAnimation[startingAnimationIndex], + width, height, p1Speed, "emptyImage.png", 0, GameEngine.PLAYER_WIDTH, GameEngine.PLAYER_HEIGHT, "P1", 6)); + players.add(new Player((width / 2) + (GameEngine.PLAYER_WIDTH / 2) - GameEngine.PLAYER_WIDTH*3, yAxisStartingAnimation[startingAnimationIndex], + width, height, p1Speed, "emptyImage.png", 0, GameEngine.PLAYER_WIDTH, GameEngine.PLAYER_HEIGHT, "P2", 6)); + + } + + setupKeys(); + Utils.playSound("jetSound.wav"); + lastPulseTime = System.currentTimeMillis(); + toDrawStart = true; + } + + private void setupKeys() { + int[] p1 = engine.getP1Controlles(); + for(int i = 0 ; i < p1.length ; i++){ + keys.put(p1[i], false); + } + if(numOfPlayers > 1){ + int[] p2 = engine.getP2Controlles(); + for(int i = 0 ; i < p1.length ; i++){ + keys.put(p2[i], false); + } + } + } + + @Override + public void update() { + bg.update(); + movePlayers(); + Vector wavesToRemove = new Vector<>(); + Vector blastTRM = new Vector<>(); + + long now = System.currentTimeMillis(); + // if(currentWave < waveDelay.length && now - lastWaveTime >= waveDelay[currentWave] * 1000){ + if(currentWave < numOfWaves && now - lastWaveTime >= waveDelay[currentWave] * 1000){ + launchWave(now); + } + + if(startingAnimationIndex < 3 && !isStarted){ + if(startingAnimationIndex == 0){ + startingAnimationIndex++; + } + if(players.get(0).getLocY() > yAxisStartingAnimation[startingAnimationIndex] && startingAnimationIndex == 1){ + for(int i = 0 ; i < players.size() ; i++){ + players.get(i).setLocY((int)players.get(i).getLocY() - (p1Speed)); + } + if(players.get(0).getLocY() <= yAxisStartingAnimation[startingAnimationIndex]){ + startingAnimationIndex++; + } + }else{ + + for(int i = 0 ; i < players.size() ; i++){ + players.get(i).setLocY((int)players.get(i).getLocY() + (p1Speed - 5)); + } + if(players.get(0).getLocY() >= yAxisStartingAnimation[startingAnimationIndex]){ + startingAnimationIndex++; + } + } + }else{ + isStarted = true; + for(int i = 0 ; i < players.size() ; i++){ + players.get(i).update(); + } + + for(int i = 0 ; i < p1Missiles.size() ; i++){ + p1Missiles.get(i).update(); + } + for(int i = 0 ; i < p2Missiles.size() ; i++){ + p2Missiles.get(i).update(); + } + for(int i = 0 ; i < enemyMissiles.size() ; i++){ + enemyMissiles.get(i).update(); + } + + for(int i = 0 ; i < waves.size() ; i++){ + waves.get(i).update(); + if(waves.get(i).isWaveOver()) { + System.out.println("in remove"); + wavesToRemove.add(waves.get(i)); + } + } + waves.removeAll(wavesToRemove); + + if(engine.getP1Score() > engine.getP1HighScore()) + engine.setP1HighScore(engine.getP1Score()); + if(engine.getP2Score() > engine.getP2HighScore()) + engine.setP2HighScore(engine.getP2Score()); + } + checkCollision(); + engine.setGameOver(isGameOver()); + if(currentWave >= numOfWaves && waves.size()==0) + { + System.out.println("Done"); + engine.changeLevel(); + } + + + for(int i =0; i 0) { + engine.revivePlayer(0); + players.get(0).resetPlayer(); + + } + } + + /** + * Player 2 Movement + */ + if(numOfPlayers > 1){ + if(keys.get(engine.getP2Controlles()[GameEngine.UP]) ){ //UP + players.get(1).sethDirection(1); + } + if(keys.get(engine.getP2Controlles()[GameEngine.DOWN])){ // DOWN + players.get(1).sethDirection(-1); + } + if(!keys.get(engine.getP2Controlles()[GameEngine.UP]) && !keys.get(engine.getP2Controlles()[GameEngine.DOWN])){ // Not up Or Down + players.get(1).sethDirection(0); + } + if(keys.get(engine.getP2Controlles()[GameEngine.LEFT])) { // Left + players.get(1).setvDirection(-1); + } + if(keys.get(engine.getP2Controlles()[GameEngine.RIGHT])) { // Right + players.get(1).setvDirection(1); + } + if(!keys.get(engine.getP2Controlles()[GameEngine.LEFT]) && !keys.get(engine.getP2Controlles()[GameEngine.RIGHT])){ // Not right or left + players.get(1).setvDirection(0); + } + if(keys.get(engine.getP2Controlles()[GameEngine.FIRE]) ){ + if(players.get(1).isAbleToFire() && !players.get(1).isGameOver()){ + p2Missiles.add(new Missile(players.get(1).getCenterX() - 15, (int)players.get(1).getLocY(),getStageWidth(),getStageHeight(),players.get(1).getAcceleration() + 3, "P1Laser.png", 4)); + players.get(1).updateFireTime(); + } + if(engine.getP2Health() <= 0 && engine.getCredits() > 0) { + engine.revivePlayer(1); + players.get(1).resetPlayer(); + + } + } + } + } + + @Override + public void render(JPanel p) { + sceneImage = new BufferedImage(this.stageWidth, this.stageHeight, Image.SCALE_FAST); + Graphics g = sceneImage.getGraphics(); + + bg.drawSprite(g, p); + Color c = g.getColor(); + Font f = engine.getGameFont(); + + if(!isStarted){ + if(f == null) { + f = g.getFont(); + } + f = f.deriveFont(60F); + g.setColor(Color.DARK_GRAY); + g.setFont(f); + + + // Get the FontMetrics + FontMetrics metrics = g.getFontMetrics(f); + // Determine the X coordinate for the text + int x = (stageWidth - metrics.stringWidth(this.title)) / 2; + // Determine the Y coordinate for the text + int y = ((stageHeight - metrics.getHeight()) / 2) - metrics.getAscent(); + g.drawString(this.title, x, y); + g.setColor(c); + + } + + + if (isGameOver()) + { + try { + System.in.read(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + //print score + f = f.deriveFont(15F); + g.setFont(f); + + //print life bar + for(int i=0; i 0){ + players.get(i).drawSprite(g,p); + g.setColor(Color.WHITE); + g.drawString("Player "+ (i+1) +" - Lives: " + ((i == 0) ? engine.getP1Lives() : engine.getP2Lives())+ ", Score: " + ((i == 0) ? engine.getP1Score() : engine.getP2Score()), 15, 35*(i+1)); + }else{ + if(players.get(i).isGameOver()){ + renderGameOver(g, p, i); + }else{ + renderPressStart(g, p, i); + } + } + }else{ + if(engine.getP2Health() > 0){ + players.get(i).drawSprite(g,p); + g.setColor(Color.WHITE); + g.drawString("Player "+ (i+1) +" - Lives: " + ((i == 0) ? engine.getP1Lives() : engine.getP2Lives())+ ", Score: " + ((i == 0) ? engine.getP1Score() : engine.getP2Score()), 15, 35*(i+1)); + }else{ + if(players.get(i).isGameOver()){ + renderGameOver(g, p, i); + }else{ + renderPressStart(g, p, i); + } + } + } + } + for(int i = 0 ; i < waves.size() ; i++){ + waves.get(i).render(g,p); + } + + for(int i =0; i= PRESS_START_PULE * 1000){ + toDrawStart = !toDrawStart; + lastPulseTime = now; + } + if(i == 0){ + g.drawString(engine.getP1CreditTime()+"", 15, 35 * (i + 1)); + if(engine.getP1CreditTime() <= 0){ + players.get(i).setGameOver(true); + } + }else{ + g.drawString(engine.getP2CreditTime()+"", 15, 35 * (i + 1)); + if(engine.getP2CreditTime() <= 0){ + players.get(i).setGameOver(true); + } + + } + if(toDrawStart) { + g.drawString("PRESS START", 45, 35 * (i + 1)); + + } + players.get(i).setLocY(-500); + players.get(i).setLocX(-500); + } + + protected void renderGameOver(Graphics g, JPanel p, int i){ + System.out.println("HERE"); + long now = System.currentTimeMillis(); + players.get(i).setGameOver(true); + if(now - lastPulseTime >= PRESS_START_PULE * 1000){ + toDrawStart = !toDrawStart; + lastPulseTime = now; + } + if(toDrawStart) { + g.drawString("P" + (i+1) + " GAME OVER", 15, 35 * (i + 1)); + } + } + + public void checkCollision() { + Vector p1MTR, p2MTR, eMTR; + eMTR = new Vector<>(); + p1MTR = new Vector<>(); + p2MTR = new Vector<>(); + + // remove missiles - out of screen + for( int i = 0; i < enemyMissiles.size(); i++) { + if (enemyMissiles.get(i).isOutOfScreen()) { + eMTR.add(enemyMissiles.get(i)); + } + } + for( int i = 0; i < p1Missiles.size(); i++) { + if (p1Missiles.get(i).isOutOfScreen()) { + p1MTR.add(p1Missiles.get(i)); + } + } + if (players.size() > 1) { + for( int i = 0; i < p2Missiles.size(); i++) { + if (p2Missiles.get(i).isOutOfScreen()) { + p2MTR.add(p2Missiles.get(i)); + } + } + } + + //for each player check collisions + for (int i = 0; i < players.size(); i++) { + + //player vs. enemy missile + for (int j = 0; j < enemyMissiles.size(); j++) { + if(CollisionUtil.collidesWith(players.get(i),enemyMissiles.get(j))){ + playerHit(i); + if(playerIsAlive(i)) { + eMTR.add(enemyMissiles.get(j)); + }else{ + blasts.add(new Blast((int)players.get(i).getLocX(),(int)players.get(i).getLocY(),"explosion.png",15)); + + } + } + } + + //player vs. enemy ship + for (int j = 0; j < waves.size(); j++) { + // Ship hits enemy + for (int k = 0; k < waves.get(j).getEnemies().size(); k++) { + if (CollisionUtil.collidesWith(waves.get(j).getEnemies().get(k), players.get(i))) { + if(!waves.get(j).getEnemies().get(k).isDead()){ + playerHit(i); + } + if(playerIsAlive(i)) { + waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); + }else{ + blasts.add(new Blast((int)players.get(i).getLocX(),(int)players.get(i).getLocY(),"explosion.png",15)); + + } + } + } + } + + //player 1 missile vs. enemy + if(i == 0){ + for(int m = 0 ; m < p1Missiles.size() ; m++){ + for (int j = 0; j < waves.size(); j++) { + for (int k = 0; k < waves.get(j).getEnemies().size(); k++) { + if (CollisionUtil.collidesWith(waves.get(j).getEnemies().get(k), p1Missiles.get(m))) { + waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); //remove enemy life + + if (waves.get(j).getEnemies().get(k).isDead()) //if enemy is dead + engine.setScore(i,10); + p1MTR.add(p1Missiles.get(m)); + } + } + } + } + + } + + //player 1 missile vs. enemy + else { + for(int m = 0 ; m < p2Missiles.size() ; m++){ + for (int j = 0; j < waves.size(); j++) { + for (int k = 0; k < waves.get(j).getEnemies().size(); k++) { + if (CollisionUtil.collidesWith(waves.get(j).getEnemies().get(k), p2Missiles.get(m))) { + + waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); //remove enemy life + if (waves.get(j).getEnemies().get(k).isDead()) //if enemy is dead + engine.setScore(i,10); + p2MTR.add(p2Missiles.get(m)); + + } + } + } + } + } + } + + + + + p1Missiles.removeAll(p1MTR); + p2Missiles.removeAll(p2MTR); + enemyMissiles.removeAll(eMTR); + + } + + protected boolean playerIsAlive(int i){ + if(i == 0){ + return !(engine.getP1Lives() <= 0); + }else{ + return !(engine.getP2Lives() <= 0); + } + } + + protected void playerHit(int i){ + if(players.get(i).isMortal()){ + engine.setPlayerHealth(i, -10); + if(i == 0){ + if(engine.getP1Health() == 100){ + players.get(i).resetPlayer(); + } + }else{ + if(engine.getP2Health() == 100){ + players.get(i).resetPlayer(); + } + } + } + } + + public void enemyFire(int x, int y, int acc) { + enemyMissiles.add(new Missile(x, y,getStageWidth(),getStageHeight(), acc,"E1-Fire.png", 15)); + } + + @Override + public void keyTyped(KeyEvent keyEvent) { + + } + + @Override + public void keyPressed(KeyEvent keyEvent) { + if(isStarted) + keys.put(keyEvent.getKeyCode(), true); + + } + + @Override + public void keyReleased(KeyEvent keyEvent) { + if(isStarted) + keys.put(keyEvent.getKeyCode(), false); + } + + +} diff --git a/MainMenuScene.java b/MainMenuScene.java new file mode 100644 index 0000000..3c2b0a6 --- /dev/null +++ b/MainMenuScene.java @@ -0,0 +1,123 @@ +package com.sagi.dayan.Games.Stage; + +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.swing.JPanel; + +import sun.audio.AudioPlayer; +import sun.audio.AudioStream; + +import com.sagi.dayan.Games.Elements.MenuBoxSprite; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.Utils; + +/** + * Created by sagi on 2/24/16. + */ +public class MainMenuScene extends Scene { + + private MenuBoxSprite menuBox; + private int menuItem; + + private final int MAX_ITEM_INDEX = 3, X_AXIS=560, ITEM_EXIT = 3, ITEM_SETTINGS = 2, ITEM_2P = 1, ITEM_1P = 0; + private int[] axis = {370, 480, 590, 700}; + + + + public MainMenuScene(int stageWidth, int stageHeight, GameEngine engine) { + super(stageWidth, stageHeight, engine); + menuItem = 0; + menuBox = new MenuBoxSprite(X_AXIS, axis[menuItem], stageWidth, stageHeight, 0, "menu.jpg", 0, 425, 110, 15); //bImage is the background... not trivial + try { + AudioPlayer.player.start(new AudioStream(Utils.getSoundResourceAsStream("intro_LowQuality.wav"))); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void update() { + menuBox.setLocY(axis[menuItem]); + menuBox.update(); + + + } + + @Override + public void render(JPanel p) { + sceneImage = new BufferedImage(this.stageWidth, this.stageHeight, Image.SCALE_FAST); + Graphics g = sceneImage.getGraphics(); + g.drawImage(menuBox.getbImage(), 0, 0, p); + menuBox.drawSprite(g, p); + + Font f = engine.getGameFont(); + f = f.deriveFont(25F); + g.setFont(f); + g.drawString("Player1 record: " +engine.p1HighScore, 700, 50); + g.drawString("Player2 record: " +engine.p2HighScore, 700, 100); + try { + + if(!AudioPlayer.player.isAlive()){ + System.out.println("Start again"); + AudioPlayer.player.start(new AudioStream(Utils.getSoundResourceAsStream("intro_LowQuality.wav"))); + + } + }catch (IOException e) { + e.printStackTrace(); + } + + + + } + + @Override + public void keyTyped(KeyEvent keyEvent) { + + } + + @Override + public void keyPressed(KeyEvent keyEvent) { + switch (keyEvent.getKeyCode()){ + case KeyEvent.VK_UP: + if(menuItem == 0) + menuItem = MAX_ITEM_INDEX; + else + menuItem--; + Utils.playSound("menuSelect.wav"); + break; + case KeyEvent.VK_DOWN: + if(menuItem == MAX_ITEM_INDEX) + menuItem = 0; + else + menuItem++; + Utils.playSound("menuSelect.wav"); + break; + case KeyEvent.VK_ENTER: + switch(menuItem){ + case ITEM_1P: + case ITEM_2P: + Utils.playSound("menuItem.wav"); + engine.startGame(menuItem+1); + break; + case ITEM_SETTINGS: + Utils.playSound("menuItem.wav"); + engine.goToSettings(); + break; + case ITEM_EXIT: + System.exit(0); + break; + } + + } + } + + @Override + public void keyReleased(KeyEvent keyEvent) { + + } +} diff --git a/Scene.java b/Scene.java new file mode 100644 index 0000000..4bae4dd --- /dev/null +++ b/Scene.java @@ -0,0 +1,45 @@ +package com.sagi.dayan.Games.Stage; + +/** + * Created by sagi on 2/8/16. + */ + +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.image.BufferedImage; + +import javax.swing.JPanel; + +import com.sagi.dayan.Games.Engine.GameEngine; + +public abstract class Scene extends MouseAdapter implements KeyListener{ + + public int getStageWidth() { + return stageWidth; + } + + public int getStageHeight() { + return stageHeight; + } + + protected int stageWidth, stageHeight; + protected BufferedImage sceneImage; + protected GameEngine engine; + + public Scene (int stageWidth, int stageHeight, GameEngine engine) { + this.stageWidth = stageWidth; + this.stageHeight = stageHeight; + this.engine = engine; + } + + public abstract void update (); + + public abstract void render(JPanel p); + + public BufferedImage getSceneImage () { + return sceneImage; + } + + + +} diff --git a/SecondStage.java b/SecondStage.java new file mode 100644 index 0000000..178d904 --- /dev/null +++ b/SecondStage.java @@ -0,0 +1,63 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class SecondStage extends Level{ + + protected final int NUM_OF_WAVES = 3; + + public SecondStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 5; + fireDelay = 1; + launchDelay = 2; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 1: + numOfEnemies = 10; + fireDelay = 0.8; + launchDelay = 1.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(4); + break; + case 2: + numOfEnemies = 15; + fireDelay = 0.7; + launchDelay = 1.3; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(5); + break; + case 3: + numOfEnemies = 20; + fireDelay = 0.6; + launchDelay = 1; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/SettingsMenuScene.java b/SettingsMenuScene.java new file mode 100644 index 0000000..923aede --- /dev/null +++ b/SettingsMenuScene.java @@ -0,0 +1,65 @@ +package com.sagi.dayan.Games.Stage; + +import java.awt.Graphics; +import java.awt.Image; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.JPanel; + +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.Utils; +//import sun.audio.AudioPlayer; +//import sun.audio.AudioStream; + +/** + * Created by sagi on 2/27/16. + */ +public class SettingsMenuScene extends Scene { + private BufferedImage background; + + + public SettingsMenuScene(int stageWidth, int stageHeight, GameEngine engine) { + super(stageWidth, stageHeight, engine); + try { + background = ImageIO.read(Utils.getImageResourceAsURL("Settigns_menu.jpg")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void update() { + + } + + @Override + public void render(JPanel p) { + sceneImage = new BufferedImage(this.stageWidth, this.stageHeight, Image.SCALE_FAST); + Graphics g = sceneImage.getGraphics(); + g.drawImage(background, 0,0,p); + + } + + @Override + public void keyTyped(KeyEvent keyEvent) { + + } + + @Override + public void keyPressed(KeyEvent keyEvent) { + switch (keyEvent.getKeyCode()){ + case KeyEvent.VK_ESCAPE: + Utils.playSound("menuItem.wav"); + engine.goToMenu(); + break; + } + } + + @Override + public void keyReleased(KeyEvent keyEvent) { + + } +} diff --git a/SixthStage.java b/SixthStage.java new file mode 100644 index 0000000..dad4664 --- /dev/null +++ b/SixthStage.java @@ -0,0 +1,84 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class SixthStage extends Level{ + + protected final int NUM_OF_WAVES = 4; + + public SixthStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 25; + fireDelay = 0.5; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 1: + numOfEnemies = 25; + fireDelay = 0.3; + launchDelay = 0.5; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(1); + break; + case 2: + numOfEnemies = 30; + fireDelay = 0.3; + launchDelay = 0.5; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(0); + break; + case 3: + numOfEnemies = 15; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 4; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 4: + numOfEnemies = 35; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 4; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 5: + numOfEnemies = 35; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 4; + wc = engine.getWaveConfigs().getWaveConfig(4); + break; + case 6: + numOfEnemies = 35; + fireDelay = 0.2; + launchDelay = 0.4; + numOfHits = 4; + wc = engine.getWaveConfigs().getWaveConfig(7); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/Stage.java b/Stage.java new file mode 100644 index 0000000..14cfa11 --- /dev/null +++ b/Stage.java @@ -0,0 +1,111 @@ +package com.sagi.dayan.Games.Stage; + +import java.awt.Graphics; +import java.util.Vector; + +import javax.swing.JPanel; + +import com.sagi.dayan.Games.Engine.GameEngine; + +/** + * Created by sagi on 2/8/16. + */ +public class Stage extends JPanel implements Runnable{ + + private Vector scenes; + private int currentScene; + private int fWidth, fHeight; + private long startTime; + private GameEngine engine; + + + + public Stage(int width, int height) { + this.setDoubleBuffered(true); + this.fHeight = height; + this.setSize(width, height); + this.setVisible(true); + this.scenes = new Vector<>(); + this.engine = new GameEngine(width, height, this); + startTime = System.currentTimeMillis(); + currentScene = 0; + + + + this.setFocusable(true); + this.requestFocus(); + } + + public synchronized void update() { + engine.update(); + } + + public synchronized void render() { + engine.render(this); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(engine.getScene(),0,0,this); + g.dispose(); + } + + @Override + public void run() { + double nsPerTick = 1000000000D / 60D; // ( 1 Billion / 60) + long lastTimer = System.currentTimeMillis(); + boolean toRender = false; + long lastTime = System.nanoTime(); + int ticks = 0; + int frames = 0; + double delta = 0; + + while(engine.gameOn){ + + long now = System.nanoTime(); + delta += (now - lastTime) / nsPerTick; + lastTime = now; + + if (delta >= 1) { + update(); + ticks++; + delta -= 1; + toRender = true; + } + + if (toRender) { // render + frames++; + render(); + toRender = false; + repaint(); + } + + try { + Thread.sleep(20); + } catch (Exception e) { + e.printStackTrace(); + } + + if (System.currentTimeMillis() - lastTimer > 1000) { + lastTimer += 1000; + if(frames <= 35){ + System.err.println("Ticks: " + ticks + "\tFps: " + frames); + }else{ + System.out.println("Ticks: " + ticks + "\tFps: " + frames); + } + frames = 0; + ticks = 0; + } + + } + } + + + @Override + public void addNotify(){ + super.addNotify(); + (new Thread(this)).start(); + } + +} diff --git a/ThirdStage.java b/ThirdStage.java new file mode 100644 index 0000000..46fc271 --- /dev/null +++ b/ThirdStage.java @@ -0,0 +1,63 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class ThirdStage extends Level{ + + protected final int NUM_OF_WAVES = 4; + + public ThirdStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + numOfWaves = NUM_OF_WAVES; + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! " + currentWave + ", Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 10; + fireDelay = 0.8; + launchDelay = 1.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(7); + break; + case 1: + numOfEnemies = 15; + fireDelay = 0.7; + launchDelay = 1.4; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 2: + numOfEnemies = 25; + fireDelay = 0.5; + launchDelay = 1.4; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(0); + break; + case 3: + numOfEnemies = 5; + fireDelay = 0.4; + launchDelay = 1; + numOfHits = 4; + wc = engine.getWaveConfigs().getWaveConfig(1); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +}