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++; + } +}