diff --git a/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java b/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java index 0ab0690..ecc5e09 100644 --- a/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java +++ b/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java @@ -1,15 +1,14 @@ package com.sagi.dayan.Games.Elements; -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import java.awt.image.ImageProducer; import java.io.IOException; import java.util.Vector; +import javax.imageio.ImageIO; +import javax.swing.JPanel; + /** * Created by sagi on 2/10/16. */ @@ -18,8 +17,6 @@ public abstract class AnimatedSprite extends Sprite { protected int currentAnimation; - - public AnimatedSprite(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight, int numOfFirstFrames) { super(x, y, w, h, acc, imgName, angle, sWidth, sHeight); animations = new Vector<>(); @@ -49,6 +46,10 @@ public abstract class AnimatedSprite extends Sprite { bImage = animations.get(currentAnimation).getCurrentFrame(); super.drawScreenLoopFix(g,p); } + + public int getFrameNum(){ + return animations.get(currentAnimation).getFrameIndex(); + } public void setCurrentAnimation(int animation){ if(animation < 0){ diff --git a/src/com/sagi/dayan/Games/Elements/Blast.java b/src/com/sagi/dayan/Games/Elements/Blast.java new file mode 100644 index 0000000..fe4a90e --- /dev/null +++ b/src/com/sagi/dayan/Games/Elements/Blast.java @@ -0,0 +1,33 @@ +package com.sagi.dayan.Games.Elements; + +import com.sagi.dayan.Games.Elements.AnimatedSprite.Animation; + +public class Blast extends AnimatedSprite { + + protected boolean isDone; + protected int numOfFirstFrames; + public Blast(int x, int y, String imgName, int numOfFirstFrames) { + super(x, y, 0, 0, 0, imgName, 0, 15, 15, numOfFirstFrames); + // TODO Auto-generated constructor stub + isDone = false; + this.numOfFirstFrames = numOfFirstFrames; + } + + @Override + protected void initFirstAnimation(String spriteSheet, int numOfFirstFrames) { + animations.add(new Animation("explosion.png", 16, 500)); + } + + @Override + public void update() { + System.out.println("curr: "+currentAnimation+", total: "+numOfFirstFrames); + if (getFrameNum() == numOfFirstFrames-1) + isDone=true; + // TODO Auto-generated method stub + + } + + public boolean isDone(){ + return isDone; + } +} diff --git a/src/com/sagi/dayan/Games/Elements/EnemyShip.java b/src/com/sagi/dayan/Games/Elements/EnemyShip.java index a4a507d..7922914 100644 --- a/src/com/sagi/dayan/Games/Elements/EnemyShip.java +++ b/src/com/sagi/dayan/Games/Elements/EnemyShip.java @@ -1,9 +1,5 @@ package com.sagi.dayan.Games.Elements; -import javax.swing.*; -import javax.swing.border.MatteBorder; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** @@ -68,7 +64,7 @@ public class EnemyShip extends AnimatedSprite { System.out.println("GOT HIT " + hitsToDestroy); } public boolean isDead() { - return hitsToDestroy == 0; + return hitsToDestroy <= 0; } public boolean isDone(){ diff --git a/src/com/sagi/dayan/Games/Elements/Missile.java b/src/com/sagi/dayan/Games/Elements/Missile.java index f662f3b..c161d96 100644 --- a/src/com/sagi/dayan/Games/Elements/Missile.java +++ b/src/com/sagi/dayan/Games/Elements/Missile.java @@ -6,8 +6,8 @@ package com.sagi.dayan.Games.Elements; public class Missile extends AnimatedSprite { - public Missile(int x, int y, int acc, String imgName, int numOfFrames) { - super(x, y, 0, 0, acc, imgName, 0, 15, 15, numOfFrames); + public Missile(int x, int y, int w, int h, int acc, String imgName, int numOfFrames) { + super(x, y, w, h, acc, imgName, 0, 15, 15, numOfFrames); } diff --git a/src/com/sagi/dayan/Games/Elements/Player.java b/src/com/sagi/dayan/Games/Elements/Player.java index 5c1c857..3c4d0d9 100644 --- a/src/com/sagi/dayan/Games/Elements/Player.java +++ b/src/com/sagi/dayan/Games/Elements/Player.java @@ -1,7 +1,8 @@ package com.sagi.dayan.Games.Elements; -import javax.swing.*; -import java.awt.*; +import java.awt.Graphics; + +import javax.swing.JPanel; /** * Created by sagi on 2/20/16. @@ -14,6 +15,8 @@ public class Player extends AnimatedSprite { private int fireDelay; private double imortalPulse = 0.2; private long lastFired, lastDrawn, created; + private int startX, startY; + private boolean isGameOver; @@ -30,8 +33,27 @@ public class Player extends AnimatedSprite { setImageDimensions(); isMortal = false; toDraw = true; + startX = locX; + startY = locY; + isGameOver = false; } + public boolean isGameOver() { + return isGameOver; + } + + public void setGameOver(boolean gameOver) { + isGameOver = gameOver; + } + + public void resetPlayer(){ + locX = startX; + locY = startY; + isMortal = false; + lastDrawn = System.currentTimeMillis(); + created = lastDrawn; + } + @Override protected void initFirstAnimation(String spriteSheet, int numOfFirstFrames) { if(imagePrefix == null) @@ -68,6 +90,10 @@ public class Player extends AnimatedSprite { locY = pHeight - animations.get(currentAnimation).getCurrentFrame().getHeight() - PADDING_BOTTOM; } + if(isGameOver){ + //System.exit(1); + } + } diff --git a/src/com/sagi/dayan/Games/Elements/Sprite.java b/src/com/sagi/dayan/Games/Elements/Sprite.java index 1949eec..bcbaa5c 100644 --- a/src/com/sagi/dayan/Games/Elements/Sprite.java +++ b/src/com/sagi/dayan/Games/Elements/Sprite.java @@ -1,13 +1,16 @@ package com.sagi.dayan.Games.Elements; -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; -import java.util.Vector; + +import javax.imageio.ImageIO; +import javax.swing.JPanel; public abstract class Sprite { @@ -261,8 +264,11 @@ public abstract class Sprite { } public boolean isOutOfScreen() { - if (this.getLocX() + this.sWidth < 0 || this.getLocX() - this.sWidth > pHeight || this.getLocY() + this.sHeight < 0 || this.getLocY() - sHeight > pHeight) { - return true; + if (this.getLocX() + sWidth < 0 + || this.getLocX() > pWidth + || this.getLocY() +sHeight < 0 + || this.getLocY() >pHeight){ + return true; } else { return false; } diff --git a/src/com/sagi/dayan/Games/Elements/Wave.java b/src/com/sagi/dayan/Games/Elements/Wave.java index f089ab0..0cb74e9 100644 --- a/src/com/sagi/dayan/Games/Elements/Wave.java +++ b/src/com/sagi/dayan/Games/Elements/Wave.java @@ -1,12 +1,12 @@ package com.sagi.dayan.Games.Elements; -import com.sagi.dayan.Games.Stage.Level; -import com.sagi.dayan.Games.Stage.Scene; - -import javax.swing.*; -import java.awt.*; +import java.awt.Graphics; import java.util.Vector; +import javax.swing.JPanel; + +import com.sagi.dayan.Games.Stage.Level; + /** * Created by sagi on 3/11/16. */ @@ -52,6 +52,7 @@ public class Wave { for (int i = 0; i < enemies.size() ; i++){ enemies.get(i).update(); if (enemies.get(i).isDone() || enemies.get(i).isOutOfScreen()) { + enemiesToRemove.add(enemies.get(i)); } } @@ -72,7 +73,8 @@ public class Wave { } public void fireFromEnemy(EnemyShip e){ - level.enemyFire(e.getCenterX(), (int)(e.getLocY() + e.getsHeight()), -(e.getAcceleration() + 2)); + if(!e.isDead()) + level.enemyFire(e.getCenterX(), (int)(e.getLocY() + e.getsHeight()), -(e.getAcceleration() + 2)); } public Vector getEnemies() { @@ -83,6 +85,6 @@ public class Wave { es.gotHit(); } public boolean isWaveOver() { - return enemies.size() == 0 && currentAmount == enemyMaxAmount; + return enemies.size() == 0 && currentAmount >= enemyMaxAmount; } } diff --git a/src/com/sagi/dayan/Games/Engine/CollisionUtil.java b/src/com/sagi/dayan/Games/Engine/CollisionUtil.java index a407cb6..793b494 100644 --- a/src/com/sagi/dayan/Games/Engine/CollisionUtil.java +++ b/src/com/sagi/dayan/Games/Engine/CollisionUtil.java @@ -7,11 +7,11 @@ package com.sagi.dayan.Games.Engine; * Created by sagi on 12/19/15. */ +import java.awt.Rectangle; +import java.awt.image.PixelGrabber; + import com.sagi.dayan.Games.Elements.AnimatedSprite; import com.sagi.dayan.Games.Elements.Sprite; - -import java.awt.*; -import java.awt.image.PixelGrabber; public class CollisionUtil { /** diff --git a/src/com/sagi/dayan/Games/Engine/GameEngine.java b/src/com/sagi/dayan/Games/Engine/GameEngine.java index ae8f2f8..3420d20 100644 --- a/src/com/sagi/dayan/Games/Engine/GameEngine.java +++ b/src/com/sagi/dayan/Games/Engine/GameEngine.java @@ -4,58 +4,60 @@ package com.sagi.dayan.Games.Engine; * Created by sagi on 2/8/16. */ -import com.sagi.dayan.Games.Stage.*; -import com.sagi.dayan.Games.Utils.Utils; -import com.sagi.dayan.Games.Utils.WaveConfigs; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; +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 java.util.Vector; -/** - * Created by sagi on 12/18/15. - */ +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 Vector scenes; - private int currentScene; + 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, SPECIAL=5; + 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}; - private int[] p2Controlles = {KeyEvent.VK_W, KeyEvent.VK_D, KeyEvent.VK_S, KeyEvent.VK_A, KeyEvent.VK_SHIFT}; + 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){ - this.currentScene = 0; + p1HighScore = p2HighScore = 0; this.isFirstGame = true; this.gameOver = true; this.pWidth = width; this.pHeight = height; - this.scenes = new Vector<>(); this.stage = stage; -// scenes.add(new Level(width, height, 2)); // Need to be a menu Scene - scenes.add(new MainMenuScene(width, height, this)); - stage.addKeyListener(scenes.get(currentScene)); - stage.addMouseListener(scenes.get(currentScene)); + currentLevel = -1; + goToMenu(); r = new Random(); try{ gameFont = Font.createFont(Font.TRUETYPE_FONT,Utils.getFontStream("transformers.ttf")); @@ -68,9 +70,7 @@ public class GameEngine { } this.waveConfigs = new WaveConfigs(); startNewGame(); - resetPlayerHealth(0); - resetPlayerHealth(1); - credits = 3; + } @@ -82,16 +82,9 @@ public class GameEngine { p2Health = 100; } } - private void resetPlayer(int i){ - resetPlayerHealth(i); + + - if (i==0){ - p1Lives = 3; - } - else{ - p2Lives = 3; - } - } /** @@ -99,6 +92,7 @@ public class GameEngine { */ private void startNewGame(){ this.gameOn = true; + this.currentLevel = -1; initGame(); } @@ -106,9 +100,20 @@ public class GameEngine { * 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() { @@ -135,51 +140,65 @@ public class GameEngine { * Update all sprites, including collision handling. */ public void update(){ - scenes.get(currentScene).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) { - scenes.get(currentScene).render(p); + scene.render(p); } public BufferedImage getScene() { - return scenes.get(currentScene).getSceneImage(); - } - - private void changeScene(int index) { - if (index >= scenes.size()){ - throw new IllegalArgumentException("Invalid Index. scenes size: "+scenes.size()); - } - stage.removeKeyListener(scenes.get(currentScene)); - stage.removeMouseListener(scenes.get(currentScene)); - currentScene = index; - stage.addKeyListener(scenes.get(currentScene)); - stage.addMouseListener(scenes.get(currentScene)); + return scene.getSceneImage(); } public void startGame(int numOfPlayers){ this.numOfPlayers = numOfPlayers; - scenes.add(new FirstStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 20})); - changeScene(currentScene+1); + 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, 1,1,1}); + break; + case 1: + scene = new SecondStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 2.0 =-", new int[]{5, 5,5,5}); + break; + case 2: + scene = new ThirdStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 3.0 =-", new int[]{5, 0,0,8}); + break; + case 3: + scene = new FourthStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 4.0 =-", new int[]{5, 0,0,8}); + break; + + } + stage.addKeyListener(scene); + stage.addMouseListener(scene); } public void goToSettings() { - scenes.add(new SettingsMenuScene(pWidth, pHeight, this)); - changeScene(currentScene+1); + stage.removeMouseListener(scene); + stage.removeKeyListener(scene); + scene = new SettingsMenuScene(pWidth, pHeight, this); + stage.addKeyListener(scene); + stage.addMouseListener(scene); } - public void goToMainMenu() { - - changeScene(0); - for(int i = scenes.size() -1 ; i > 0 ; i--){ - scenes.remove(i); - } - } - - public int getScenesSize(){ - return scenes.size(); - } public int[] getP1Controlles(){ return p1Controlles; @@ -222,6 +241,22 @@ public class GameEngine { 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) { @@ -234,9 +269,65 @@ public class GameEngine { 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/src/com/sagi/dayan/Games/Graphics/Settigns menu.xcf b/src/com/sagi/dayan/Games/Graphics/Settigns menu.xcf index 7400c4d..5cc027a 100644 Binary files a/src/com/sagi/dayan/Games/Graphics/Settigns menu.xcf and b/src/com/sagi/dayan/Games/Graphics/Settigns menu.xcf differ diff --git a/src/com/sagi/dayan/Games/Graphics/main mwnu.xcf b/src/com/sagi/dayan/Games/Graphics/main mwnu.xcf index 9b20fd6..7896085 100644 Binary files a/src/com/sagi/dayan/Games/Graphics/main mwnu.xcf and b/src/com/sagi/dayan/Games/Graphics/main mwnu.xcf differ diff --git a/src/com/sagi/dayan/Games/Images/Boss-Sprite.png b/src/com/sagi/dayan/Games/Images/Boss-Sprite.png new file mode 100644 index 0000000..e625317 Binary files /dev/null and b/src/com/sagi/dayan/Games/Images/Boss-Sprite.png differ diff --git a/src/com/sagi/dayan/Games/Images/L1-ES2.png b/src/com/sagi/dayan/Games/Images/L1-ES2.png new file mode 100644 index 0000000..32cd720 Binary files /dev/null and b/src/com/sagi/dayan/Games/Images/L1-ES2.png differ diff --git a/src/com/sagi/dayan/Games/Images/Settigns_menu.jpg b/src/com/sagi/dayan/Games/Images/Settigns_menu.jpg index 7091b57..2d48a93 100644 Binary files a/src/com/sagi/dayan/Games/Images/Settigns_menu.jpg and b/src/com/sagi/dayan/Games/Images/Settigns_menu.jpg differ diff --git a/src/com/sagi/dayan/Games/Images/menu.jpg b/src/com/sagi/dayan/Games/Images/menu.jpg index 58ab16f..9aaf924 100644 Binary files a/src/com/sagi/dayan/Games/Images/menu.jpg and b/src/com/sagi/dayan/Games/Images/menu.jpg differ diff --git a/src/com/sagi/dayan/Games/Stage/FirstStage.java b/src/com/sagi/dayan/Games/Stage/FirstStage.java index a90e9ae..c296236 100644 --- a/src/com/sagi/dayan/Games/Stage/FirstStage.java +++ b/src/com/sagi/dayan/Games/Stage/FirstStage.java @@ -9,32 +9,49 @@ 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 = 4; 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!! Time: " + 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 = 0.2; + fireDelay = 0.1; launchDelay = 0.5; numOfHits = 1; - wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + wc = engine.getWaveConfigs().getWaveConfig(6); break; case 1: numOfEnemies = 5; - fireDelay = 5; + fireDelay = 1; launchDelay = 1; - numOfHits = 1; - wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 2: + numOfEnemies = 10; + fireDelay = 0.8; + launchDelay = 1; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 3: + numOfEnemies = 15; + fireDelay = 1.5; + launchDelay = 1; + numOfHits = 5; + wc = engine.getWaveConfigs().getWaveConfig(7); break; default: wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); diff --git a/src/com/sagi/dayan/Games/Stage/FourthStage.java b/src/com/sagi/dayan/Games/Stage/FourthStage.java new file mode 100644 index 0000000..5f495bc --- /dev/null +++ b/src/com/sagi/dayan/Games/Stage/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 = 5; + fireDelay = 0.5; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 1: + numOfEnemies = 5; + fireDelay = 0.3; + launchDelay = 1; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 2: + numOfEnemies = 10; + fireDelay = 0.3; + launchDelay = 1; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 3: + numOfEnemies = 15; + fireDelay = 0.2; + launchDelay = 1; + 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/src/com/sagi/dayan/Games/Stage/Level.java b/src/com/sagi/dayan/Games/Stage/Level.java index 1e79898..6f5a925 100644 --- a/src/com/sagi/dayan/Games/Stage/Level.java +++ b/src/com/sagi/dayan/Games/Stage/Level.java @@ -1,384 +1,576 @@ package com.sagi.dayan.Games.Stage; -import com.sagi.dayan.Games.Elements.*; -import com.sagi.dayan.Games.Engine.CollisionUtil; -import com.sagi.dayan.Games.Engine.GameEngine; -import com.sagi.dayan.Games.Utils.Utils; -import com.sagi.dayan.Games.Utils.WaveConfig; -import com.sagi.dayan.Games.Utils.WaveConfigs; - -import javax.swing.*; -import javax.swing.Timer; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +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.*; +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 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 int numOfPlayers; - protected Map keys; - protected String title; - protected JLabel stageTitle; - protected long lastWaveTime; + 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<>(); - 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); + 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)); + 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"); - } + 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); - } - } - } + 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(); + @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){ - launchWave(now); - } + 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)); -// players.get(i).update(); - } - if(players.get(0).getLocY() <= yAxisStartingAnimation[startingAnimationIndex]){ - startingAnimationIndex++; - } - }else{ + 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)); -// players.get(i).update(); - } - 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 < 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 < 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()) { - wavesToRemove.add(waves.get(i)); - } - } - waves.removeAll(wavesToRemove); - } - checkCollision(); - } + 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); - protected abstract void launchWave(long time); - - private void movePlayers() { - /** - * Player 1 Movement: - */ - if(keys.get(engine.getP1Controlles()[GameEngine.UP]) ){ //UP - players.get(0).sethDirection(1); - } - if(keys.get(engine.getP1Controlles()[GameEngine.DOWN])){ // DOWN - players.get(0).sethDirection(-1); - } - if(!keys.get(engine.getP1Controlles()[GameEngine.UP]) && !keys.get(engine.getP1Controlles()[GameEngine.DOWN])){ // Not up Or Down - players.get(0).sethDirection(0); - } - if(keys.get(engine.getP1Controlles()[GameEngine.LEFT])) { // Left - players.get(0).setvDirection(-1); - } - if(keys.get(engine.getP1Controlles()[GameEngine.RIGHT])) { // Right - players.get(0).setvDirection(1); - } - if(!keys.get(engine.getP1Controlles()[GameEngine.LEFT]) && !keys.get(engine.getP1Controlles()[GameEngine.RIGHT])){ // Not right or left - players.get(0).setvDirection(0); - } - if(keys.get(engine.getP1Controlles()[GameEngine.FIRE]) ){ - if(players.get(0).isAbleToFire()){ - p1Missiles.add(new Missile(players.get(0).getCenterX() - 15, (int)players.get(0).getLocY(), players.get(0).getAcceleration() + 3, "P1Laser.png", 4)); - players.get(0).updateFireTime(); - } - } - - /** - * 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()){ - p2Missiles.add(new Missile(players.get(1).getCenterX() - 15, (int)players.get(1).getLocY(), players.get(1).getAcceleration() + 3, "P1Laser.png", 4)); - players.get(1).updateFireTime(); - } - } - } - } - - @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); + 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(); + } - // 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); + for(int i =0; i 0) { + engine.revivePlayer(0); + players.get(0).resetPlayer(); - g.fillRect(15,35*(i+1)+10,((i == 0) ? engine.getP1Health() : engine.getP2Health()),10); + } + } - } + /** + * 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(keys.get(engine.getP2Controlles()[GameEngine.USE_CREDIT]) && engine.getP2Health() <= 0 ){ + if(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); - //print credits - g.setColor(Color.WHITE); - g.drawString("Credits: "+ engine.getCredits(), stageWidth/2, 30); + // 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 p1MTR, p2MTR, eMTR; - eMTR = new Vector<>(); - p1MTR = new Vector<>(); - p2MTR = new Vector<>(); + } - //for each player check collisions - for (int i = 0; i < players.size(); i++) { + protected void renderPressStart(Graphics g, JPanel p, int i){ + long now = System.currentTimeMillis(); + if(now - lastPulseTime >= 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); + } - //player vs. enemy missile - for (int j = 0; j < enemyMissiles.size(); j++) { - if(CollisionUtil.collidesWith(players.get(i),enemyMissiles.get(j))){ - if(players.get(i).isMortal()) - engine.setPlayerHealth(i, -10); - eMTR.add(enemyMissiles.get(j)); - System.out.println("Hit Missile"); - } - } + } + if(toDrawStart) { + g.drawString("PRESS START", 45, 35 * (i + 1)); - //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(players.get(i).isMortal()) - engine.setPlayerHealth(i, -10); - waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); - } - } - } + } + players.get(i).setLocY(-500); + players.get(i).setLocX(-500); + } - //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 + 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)); + } + } - if (waves.get(j).getEnemies().get(k).isDead()) //if enemy is dead - engine.setScore(i,10); - p1MTR.add(p1Missiles.get(m)); - } - } - } - } + 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)); + } + } + } - //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))) { + //for each player check collisions + for (int i = 0; i < players.size(); i++) { - 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)); + //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); + p1Missiles.removeAll(p1MTR); + p2Missiles.removeAll(p2MTR); + enemyMissiles.removeAll(eMTR); - } + } - public void enemyFire(int x, int y, int acc) { - enemyMissiles.add(new Missile(x, y, acc,"E1-Fire.png", 15)); - } + protected boolean playerIsAlive(int i){ + if(i == 0){ + return !(engine.getP1Lives() <= 0); + }else{ + return !(engine.getP2Lives() <= 0); + } + } - @Override - public void keyTyped(KeyEvent keyEvent) { + 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 keyPressed(KeyEvent keyEvent) { - if(isStarted) - keys.put(keyEvent.getKeyCode(), true); + @Override + public void keyTyped(KeyEvent keyEvent) { - } + } - @Override - public void keyReleased(KeyEvent keyEvent) { - if(isStarted) - keys.put(keyEvent.getKeyCode(), false); - } + @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/src/com/sagi/dayan/Games/Stage/MainMenuScene.java b/src/com/sagi/dayan/Games/Stage/MainMenuScene.java index 865a33a..3c2b0a6 100644 --- a/src/com/sagi/dayan/Games/Stage/MainMenuScene.java +++ b/src/com/sagi/dayan/Games/Stage/MainMenuScene.java @@ -1,16 +1,20 @@ 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; -import sun.audio.AudioPlayer; -import sun.audio.AudioStream; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.io.*; /** * Created by sagi on 2/24/16. @@ -20,7 +24,6 @@ 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}; @@ -51,6 +54,25 @@ public class MainMenuScene extends Scene { 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 diff --git a/src/com/sagi/dayan/Games/Stage/Scene.java b/src/com/sagi/dayan/Games/Stage/Scene.java index 7fd1e62..4bae4dd 100644 --- a/src/com/sagi/dayan/Games/Stage/Scene.java +++ b/src/com/sagi/dayan/Games/Stage/Scene.java @@ -4,15 +4,14 @@ package com.sagi.dayan.Games.Stage; * Created by sagi on 2/8/16. */ -import com.sagi.dayan.Games.Elements.*; -import com.sagi.dayan.Games.Engine.GameEngine; - -import javax.swing.*; -import java.awt.*; 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() { diff --git a/src/com/sagi/dayan/Games/Stage/SecondStage.java b/src/com/sagi/dayan/Games/Stage/SecondStage.java new file mode 100644 index 0000000..bebf1fe --- /dev/null +++ b/src/com/sagi/dayan/Games/Stage/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 = 4; + + 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 = 0.5; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 1: + numOfEnemies = 5; + fireDelay = 0.3; + launchDelay = 1; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 2: + numOfEnemies = 10; + fireDelay = 0.3; + launchDelay = 1; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 3: + numOfEnemies = 15; + fireDelay = 0.2; + launchDelay = 1; + 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/src/com/sagi/dayan/Games/Stage/SettingsMenuScene.java b/src/com/sagi/dayan/Games/Stage/SettingsMenuScene.java index 2f5036b..923aede 100644 --- a/src/com/sagi/dayan/Games/Stage/SettingsMenuScene.java +++ b/src/com/sagi/dayan/Games/Stage/SettingsMenuScene.java @@ -1,17 +1,19 @@ package com.sagi.dayan.Games.Stage; -import com.sagi.dayan.Games.Engine.GameEngine; -import com.sagi.dayan.Games.Utils.Utils; -import sun.audio.AudioPlayer; -import sun.audio.AudioStream; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; +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. */ @@ -51,7 +53,7 @@ public class SettingsMenuScene extends Scene { switch (keyEvent.getKeyCode()){ case KeyEvent.VK_ESCAPE: Utils.playSound("menuItem.wav"); - engine.goToMainMenu(); + engine.goToMenu(); break; } } diff --git a/src/com/sagi/dayan/Games/Stage/Stage.java b/src/com/sagi/dayan/Games/Stage/Stage.java index 9d52c14..8712ccd 100644 --- a/src/com/sagi/dayan/Games/Stage/Stage.java +++ b/src/com/sagi/dayan/Games/Stage/Stage.java @@ -1,13 +1,12 @@ package com.sagi.dayan.Games.Stage; -import com.sagi.dayan.Games.Engine.GameEngine; -import com.sagi.dayan.Games.Utils.Utils; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferStrategy; +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. */ @@ -92,9 +91,9 @@ public class Stage extends JPanel implements Runnable{ if (System.currentTimeMillis() - lastTimer > 1000) { lastTimer += 1000; if(frames <= 35){ - System.err.println("Ticks: " + ticks + "\tFps: " + frames + "\tScenes Size: " + engine.getScenesSize()); + System.err.println("Ticks: " + ticks + "\tFps: " + frames); }else{ - System.out.println("Ticks: " + ticks + "\tFps: " + frames + "\tScenes Size: " + engine.getScenesSize()); + System.out.println("Ticks: " + ticks + "\tFps: " + frames); } frames = 0; ticks = 0; diff --git a/src/com/sagi/dayan/Games/Stage/ThirdStage.java b/src/com/sagi/dayan/Games/Stage/ThirdStage.java new file mode 100644 index 0000000..9d3c3ab --- /dev/null +++ b/src/com/sagi/dayan/Games/Stage/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 = 5; + fireDelay = 0.5; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(6); + break; + case 1: + numOfEnemies = 5; + fireDelay = 0.3; + launchDelay = 1; + numOfHits = 2; + wc = engine.getWaveConfigs().getWaveConfig(3); + break; + case 2: + numOfEnemies = 10; + fireDelay = 0.3; + launchDelay = 1; + numOfHits = 3; + wc = engine.getWaveConfigs().getWaveConfig(2); + break; + case 3: + numOfEnemies = 15; + fireDelay = 0.2; + launchDelay = 1; + 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/src/com/sagi/dayan/Games/Utils/Utils.java b/src/com/sagi/dayan/Games/Utils/Utils.java index 5d9d1a4..2db683e 100644 --- a/src/com/sagi/dayan/Games/Utils/Utils.java +++ b/src/com/sagi/dayan/Games/Utils/Utils.java @@ -1,12 +1,12 @@ package com.sagi.dayan.Games.Utils; -import sun.audio.AudioPlayer; -import sun.audio.AudioStream; - import java.io.IOException; import java.io.InputStream; import java.net.URL; +import sun.audio.AudioPlayer; +import sun.audio.AudioStream; + /** * Created by sagi on 2/24/16. */ diff --git a/src/com/sagi/dayan/Games/Utils/WaveConfigs.java b/src/com/sagi/dayan/Games/Utils/WaveConfigs.java index a300cf7..43b4d5d 100644 --- a/src/com/sagi/dayan/Games/Utils/WaveConfigs.java +++ b/src/com/sagi/dayan/Games/Utils/WaveConfigs.java @@ -26,17 +26,17 @@ public class WaveConfigs { //top right to middle top configs.add(new WaveConfig(new int[]{90,90,120, 120, 150, 150, 270} , 0.5, 8,900 , -30)); - //right buttom to middle buttom - configs.add(new WaveConfig(new int[]{270,270,300, 300, 330, 330, 90} , 0.5, 8,100 , 0)); + //right buttom to middle bottom + configs.add(new WaveConfig(new int[]{270,270,300, 300, 330, 330, 90} , 0.5, 8,100 , 1000)); - //left buttom to middle buttom - configs.add(new WaveConfig(new int[]{270,270,240, 240, 210, 210, 90} , 0.5, 8,900 , 0)); + //left buttom to middle bottom + configs.add(new WaveConfig(new int[]{270,270,240, 240, 210, 210, 90} , 0.5, 8,900 , 1000)); //middle right to middle right - configs.add(new WaveConfig(new int[]{180,180,180,90, 90, 0} , 0.5, 8,1010 , 400)); + configs.add(new WaveConfig(new int[]{180,180,180,180,180,90, 90, 0} , 0.5, 8,999 , 400)); //middle left to middle left - configs.add(new WaveConfig(new int[]{0,0,0,90, 90, 180} , 0.5, 8,-30 , 400)); + configs.add(new WaveConfig(new int[]{0,0,0,0,0,90, 90, 180} , 0.5, 8,-10 , 400)); }