From d9085b8570bb208c4f5e2438f0d0c8c4ab64b9d6 Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Sun, 28 Feb 2016 00:21:28 +0200 Subject: [PATCH 1/4] Fire fix + used @aranzaiger s wav file --- src/com/sagi/dayan/Games/Stage/FirstStage.java | 4 ++-- src/com/sagi/dayan/Games/Stage/MainMenuScene.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/sagi/dayan/Games/Stage/FirstStage.java b/src/com/sagi/dayan/Games/Stage/FirstStage.java index 6d129aa..bd23982 100644 --- a/src/com/sagi/dayan/Games/Stage/FirstStage.java +++ b/src/com/sagi/dayan/Games/Stage/FirstStage.java @@ -152,7 +152,7 @@ public class FirstStage extends Scene { } if(keys.get(engine.getP1Controlles()[GameEngine.FIRE]) ){ if(players.get(0).isAbleToFire()){ - missiles.add(new Missile(players.get(0).getCenterX() - 3, (int)players.get(0).getLocY(), players.get(0).getAcceleration() + 3, "P1Laser.png")); + missiles.add(new Missile(players.get(0).getCenterX() - 15, (int)players.get(0).getLocY(), players.get(0).getAcceleration() + 3, "P1Laser.png")); players.get(0).updateFireTime(); } } @@ -181,7 +181,7 @@ public class FirstStage extends Scene { } if(keys.get(engine.getP2Controlles()[GameEngine.FIRE]) ){ if(players.get(1).isAbleToFire()){ - missiles.add(new Missile(players.get(1).getCenterX() - 3, (int)players.get(1).getLocY(), players.get(1).getAcceleration() + 3, "P1Laser.png")); + missiles.add(new Missile(players.get(1).getCenterX() - 15, (int)players.get(1).getLocY(), players.get(1).getAcceleration() + 3, "P1Laser.png")); players.get(1).updateFireTime(); } } diff --git a/src/com/sagi/dayan/Games/Stage/MainMenuScene.java b/src/com/sagi/dayan/Games/Stage/MainMenuScene.java index d34e9c2..2a92576 100644 --- a/src/com/sagi/dayan/Games/Stage/MainMenuScene.java +++ b/src/com/sagi/dayan/Games/Stage/MainMenuScene.java @@ -31,7 +31,7 @@ public class MainMenuScene extends Scene { menuItem = 0; menuBox = new MenuBoxSprite(X_AXIS, axis[menuItem], stageWidth, stageHeight, 0, "menu.jpg", 0, 425, 110); //bImage is the background... not trivial try { - AudioPlayer.player.start(new AudioStream(Utils.getSoundResourceAsStream("intro.wav"))); + AudioPlayer.player.start(new AudioStream(Utils.getSoundResourceAsStream("intro_LowQuality.wav"))); } catch (IOException e) { e.printStackTrace(); } From d5ca3d4dd917193c967135ccebd673ebea3d2254 Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Sat, 12 Mar 2016 12:24:42 +0200 Subject: [PATCH 2/4] Added Enemy Waves - And a start for collision detection --- .../Games/Elements/AnimatedDemoSprite.java | 55 ------ .../dayan/Games/Elements/AnimatedSprite.java | 14 +- .../sagi/dayan/Games/Elements/DemoSprite.java | 64 ------ .../sagi/dayan/Games/Elements/EnemyShip.java | 64 +++++- .../dayan/Games/Elements/MenuBoxSprite.java | 6 +- .../sagi/dayan/Games/Elements/Missile.java | 9 +- src/com/sagi/dayan/Games/Elements/Player.java | 9 +- src/com/sagi/dayan/Games/Elements/Sprite.java | 12 +- src/com/sagi/dayan/Games/Elements/Wave.java | 87 +++++++++ .../dayan/Games/Engine/CollisionUtil.java | 5 +- .../sagi/dayan/Games/Engine/GameEngine.java | 22 ++- src/com/sagi/dayan/Games/Images/E1-Fire.png | Bin 0 -> 4578 bytes .../{animatedSample2.png => explosion.png} | Bin src/com/sagi/dayan/Games/Main.java | 2 +- .../Stage/{FirstStage.java => Level.java} | 182 ++++++++++++------ .../sagi/dayan/Games/Stage/MainMenuScene.java | 2 +- .../sagi/dayan/Games/Stage/SampleScene.java | 118 ------------ src/com/sagi/dayan/Games/Stage/Scene.java | 10 + src/com/sagi/dayan/Games/Stage/Stage.java | 6 +- 19 files changed, 338 insertions(+), 329 deletions(-) delete mode 100644 src/com/sagi/dayan/Games/Elements/AnimatedDemoSprite.java delete mode 100644 src/com/sagi/dayan/Games/Elements/DemoSprite.java create mode 100644 src/com/sagi/dayan/Games/Elements/Wave.java create mode 100644 src/com/sagi/dayan/Games/Images/E1-Fire.png rename src/com/sagi/dayan/Games/Images/{animatedSample2.png => explosion.png} (100%) rename src/com/sagi/dayan/Games/Stage/{FirstStage.java => Level.java} (58%) delete mode 100644 src/com/sagi/dayan/Games/Stage/SampleScene.java diff --git a/src/com/sagi/dayan/Games/Elements/AnimatedDemoSprite.java b/src/com/sagi/dayan/Games/Elements/AnimatedDemoSprite.java deleted file mode 100644 index 70d646a..0000000 --- a/src/com/sagi/dayan/Games/Elements/AnimatedDemoSprite.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sagi.dayan.Games.Elements; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -/** - * Created by sagi on 2/10/16. - */ -public class AnimatedDemoSprite extends AnimatedSprite { - - private int timerCouner = 0; - protected Timer t; - - public AnimatedDemoSprite(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight) { - super(x, y, w, h, acc, imgName, angle, sWidth, sHeight); - setScreenLoop(true); - animations.add(new Animation("animatedSample2.png", 16, 2000)); - t = new Timer(1 * 1000, new TimerTick()); - t.start(); - } - - @Override - public void update() { - locX += acceleration; - } - - @Override - protected void initFirstAnimation(String spriteSheet) { - animations.add(new Animation(spriteSheet, 8, 1 * 1000)); - } - - private class TimerTick implements ActionListener { - - @Override - public void actionPerformed(ActionEvent actionEvent) { - if(timerCouner < 5){ - timerCouner++; - } - else if(5 <= timerCouner && timerCouner < 7){ - System.out.println("Explode"); - timerCouner++; - currentAnimation = 1; - acceleration = 0; - }else{ - currentAnimation = 0; - timerCouner = 0; - acceleration = 5; - } - } - } - - -} diff --git a/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java b/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java index 2437cae..0ab0690 100644 --- a/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java +++ b/src/com/sagi/dayan/Games/Elements/AnimatedSprite.java @@ -6,6 +6,7 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.awt.image.ImageProducer; import java.io.IOException; import java.util.Vector; @@ -17,15 +18,17 @@ 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) { + + + 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<>(); - initFirstAnimation(imgName); + initFirstAnimation(imgName, numOfFirstFrames); currentAnimation = 0; } - protected abstract void initFirstAnimation(String spriteSheet); + protected abstract void initFirstAnimation(String spriteSheet, int numOfFirstFrames); @Override public void drawSprite(Graphics g, JPanel p) { @@ -57,6 +60,9 @@ public abstract class AnimatedSprite extends Sprite { } } + public BufferedImage getImageFrame() { + return animations.get(currentAnimation).getCurrentFrame(); + } protected class Animation { @@ -82,6 +88,8 @@ public abstract class AnimatedSprite extends Sprite { } int frameHeight = spriteSheet.getHeight(); int frameWidth = spriteSheet.getWidth() / numOfFrames; + sWidth = frameWidth; + sHeight = frameHeight; int currentX = 0; for(int i = 0 ; i < numOfFrames ; i++) { addFrame(spriteSheet.getSubimage(currentX, 0, frameWidth, frameHeight), (double)totalAnimationTime/numOfFrames); diff --git a/src/com/sagi/dayan/Games/Elements/DemoSprite.java b/src/com/sagi/dayan/Games/Elements/DemoSprite.java deleted file mode 100644 index 08c760b..0000000 --- a/src/com/sagi/dayan/Games/Elements/DemoSprite.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.sagi.dayan.Games.Elements; - -import java.util.Random; - -/** - * Created by sagi on 2/10/16. - */ -public class DemoSprite extends Sprite { - private final int STOP=0, UP=1, DOWN=-1, TURN_SPEED=10; - private final double MAX_SPEED = 6, SLOWING_FACTOR = 0.1; - Random r; - private double selfAccel; - private int direction, turnDirection; - int counter = 0; - public DemoSprite(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight) { - super(x, y, w, h, acc, imgName, angle, sWidth, sHeight); - selfRotationSpeed = 5; - direction = STOP; - turnDirection = STOP; - selfAccel = acceleration; - setScreenLoop(true); - - } - - @Override - public void update() { - setSpeed(); - this.angle+=TURN_SPEED*turnDirection; - locX += selfAccel * Math.cos(Math.toRadians(angle)); - locY -= selfAccel * (-1 * Math.sin(Math.toRadians(angle))); - System.out.println("locX: " + locX + "\tlocY: "+locY); - } - - private void setSpeed(){ - if (direction == UP && !(selfAccel > MAX_SPEED)){ - selfAccel+=SLOWING_FACTOR*2; - } - else if (direction == DOWN && (selfAccel > MAX_SPEED*(-1))){ - selfAccel-=SLOWING_FACTOR*2; - } - else { //slowing down - if (selfAccel > 0) { - selfAccel -= SLOWING_FACTOR; - if (selfAccel < 0) { - selfAccel = 0; - } - } - if (selfAccel < 0) { - selfAccel += SLOWING_FACTOR; - if (selfAccel > 0) { - selfAccel = 0; - } - } - } - } - - public void setDirection(int direction) { - this.direction = direction; - } - - public void turnShip(int direction){ - turnDirection=direction; - } -} diff --git a/src/com/sagi/dayan/Games/Elements/EnemyShip.java b/src/com/sagi/dayan/Games/Elements/EnemyShip.java index 3868b77..e8fbd6d 100644 --- a/src/com/sagi/dayan/Games/Elements/EnemyShip.java +++ b/src/com/sagi/dayan/Games/Elements/EnemyShip.java @@ -1,6 +1,7 @@ package com.sagi.dayan.Games.Elements; import javax.swing.*; +import javax.swing.border.MatteBorder; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -9,23 +10,68 @@ import java.awt.event.ActionListener; * Created by sagi on 2/20/16. */ public class EnemyShip extends AnimatedSprite { - Timer t; - public EnemyShip(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight, ActionListener timerListener) { - super(x, y, w, h, acc, imgName, angle, sWidth, sHeight); - - t = new Timer(1000,timerListener); + protected int fireDelay, stepDelay, currentStep; + protected long lastFireTime, lastStepTime; + protected int[] moveVector; + protected Wave wave; + protected int hitsToDestroy; + protected boolean isDone; + protected long startExploded; + public EnemyShip(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight,int fireDelay, int stepDelay, Wave wave, int[] moveVector,int numOfFirstFrames, int hitsToDestroy) { + super(x, y, w, h, acc, imgName, angle, sWidth, sHeight, numOfFirstFrames); + this.fireDelay = fireDelay; + this.stepDelay = stepDelay; + this.currentStep = 0; + this.lastFireTime = System.currentTimeMillis(); + this.lastStepTime = System.currentTimeMillis(); + this.moveVector = moveVector; + this.wave = wave; + this.hitsToDestroy = hitsToDestroy; } @Override - protected void initFirstAnimation(String spriteSheet) { - animations.add(new Animation("P1Laser.png", 4, 500)); + protected void initFirstAnimation(String spriteSheet, int numOfFirstFrames) { + animations.add(new Animation(imageName, 8, 500)); + } @Override public void update() { - locX = 200; - locY += acceleration; + long now = System.currentTimeMillis(); + if(currentAnimation == 1){ + if(now - startExploded >= 500){ + isDone = true; + } + } + if(now - lastFireTime >= fireDelay*1000){ + wave.fireFromEnemy(this); + lastFireTime = now; + } + + if(now - lastStepTime >= stepDelay*1000 && currentStep < moveVector.length - 1){ + currentStep++; + lastStepTime = now; + } + + locX += acceleration * Math.cos(Math.toRadians(moveVector[currentStep])); + locY -= acceleration * -1* Math.sin(Math.toRadians(moveVector[currentStep])); + } + public void gotHit() { + hitsToDestroy--; + if(hitsToDestroy == 0){ + startExploded = System.currentTimeMillis(); + animations.add(new Animation("explosion.png", 16, 500)); + currentAnimation++; + } + System.out.println("GOT HIT " + hitsToDestroy); + } + public int getHitToDestroy() { + return hitsToDestroy; + } + + public boolean isDone(){ + return isDone; } diff --git a/src/com/sagi/dayan/Games/Elements/MenuBoxSprite.java b/src/com/sagi/dayan/Games/Elements/MenuBoxSprite.java index 2cb72a2..df2f75c 100644 --- a/src/com/sagi/dayan/Games/Elements/MenuBoxSprite.java +++ b/src/com/sagi/dayan/Games/Elements/MenuBoxSprite.java @@ -4,12 +4,12 @@ package com.sagi.dayan.Games.Elements; * Created by sagi on 2/24/16. */ public class MenuBoxSprite extends AnimatedSprite { - public MenuBoxSprite(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight) { - super(x, y, w, h, acc, imgName, angle, sWidth, sHeight); + public MenuBoxSprite(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, numOfFirstFrames); } @Override - protected void initFirstAnimation(String spriteSheet) { + protected void initFirstAnimation(String spriteSheet, int numOfFirstFrames) { animations.add(new Animation("menuBox.png", 15, 150)); } diff --git a/src/com/sagi/dayan/Games/Elements/Missile.java b/src/com/sagi/dayan/Games/Elements/Missile.java index 2bb3a5d..f662f3b 100644 --- a/src/com/sagi/dayan/Games/Elements/Missile.java +++ b/src/com/sagi/dayan/Games/Elements/Missile.java @@ -6,13 +6,14 @@ package com.sagi.dayan.Games.Elements; public class Missile extends AnimatedSprite { - public Missile(int x, int y, int acc, String imgName) { - super(x, y, 0, 0, acc, imgName, 0, 15, 15); + public Missile(int x, int y, int acc, String imgName, int numOfFrames) { + super(x, y, 0, 0, acc, imgName, 0, 15, 15, numOfFrames); + } @Override - protected void initFirstAnimation(String spriteSheet) { - animations.add(new Animation("P1Laser.png", 4, 500)); + protected void initFirstAnimation(String spriteSheet, int numOfFirstFrames) { + animations.add(new Animation(imageName, numOfFirstFrames, 500)); } @Override diff --git a/src/com/sagi/dayan/Games/Elements/Player.java b/src/com/sagi/dayan/Games/Elements/Player.java index 4f7ec5d..0dbcf7f 100644 --- a/src/com/sagi/dayan/Games/Elements/Player.java +++ b/src/com/sagi/dayan/Games/Elements/Player.java @@ -12,17 +12,18 @@ public class Player extends AnimatedSprite { private long lastFired; - public Player(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight, String imagePrefix) { - super(x, y, w, h, acc, imgName, angle, sWidth, sHeight); + public Player(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight, String imagePrefix, int numOfFirstFrames) { + super(x, y, w, h, acc, imgName, angle, sWidth, sHeight, numOfFirstFrames); this.imagePrefix = imagePrefix; - initFirstAnimation(""); + initFirstAnimation("", numOfFirstFrames); this.ableToFire = true; fireDelay = 100; lastFired = System.currentTimeMillis(); + setImageDimensions(); } @Override - protected void initFirstAnimation(String spriteSheet) { + protected void initFirstAnimation(String spriteSheet, int numOfFirstFrames) { if(imagePrefix == null) return; System.out.println(imagePrefix); diff --git a/src/com/sagi/dayan/Games/Elements/Sprite.java b/src/com/sagi/dayan/Games/Elements/Sprite.java index 0f336ba..1949eec 100644 --- a/src/com/sagi/dayan/Games/Elements/Sprite.java +++ b/src/com/sagi/dayan/Games/Elements/Sprite.java @@ -14,6 +14,7 @@ public abstract class Sprite { protected BufferedImage bImage; protected int imageWidth, imageHeight; // image dimensions protected URL imagePath; + protected String imageName; protected int locX, locY; protected int acceleration; protected int pWidth, pHeight; // panel's dimensions @@ -27,6 +28,7 @@ public abstract class Sprite { public Sprite(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight) { this.imagePath = getClass().getResource("/com/sagi/dayan/Games/Images/" + imgName); + this.imageName = imgName; this.sWidth = sWidth; this.sHeight = sHeight; locX = x; @@ -165,7 +167,7 @@ public abstract class Sprite { * @return Rectangle */ public Rectangle getBounds() { - return new Rectangle((int) locX, (int) locY, sWidth, sHeight); + return new Rectangle((int) locX, (int) locY, bImage.getWidth(), bImage.getHeight()); } public boolean isScreenLoop() { @@ -258,4 +260,12 @@ 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; + } else { + return false; + } + } + } \ No newline at end of file diff --git a/src/com/sagi/dayan/Games/Elements/Wave.java b/src/com/sagi/dayan/Games/Elements/Wave.java new file mode 100644 index 0000000..3b20e8d --- /dev/null +++ b/src/com/sagi/dayan/Games/Elements/Wave.java @@ -0,0 +1,87 @@ +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.util.Vector; + +/** + * Created by sagi on 3/11/16. + */ +public class Wave { + + protected Level level; + protected int enemyMaxAmount, currentAmount,fireDelay, launchDelay, stepDelay, acc, startX, startY; + protected int[] moveVector; + protected Vector enemies; + protected Vector bullets; + protected long lastLaunchTime; + protected String imageName; + protected int hitsToDestroy; + + public Wave(int enemyMaxAmount, int[] moveVector, int fireDelay, int stepDelay, int launchDelay, int acc, String imageName, int startX, int startY, Level stage, int hitsToDestroy){ + this.enemies = new Vector<>(); + this.bullets = new Vector<>(); + this.enemyMaxAmount = enemyMaxAmount; + this.currentAmount = 0; + this.imageName = imageName; + this.level = stage; + this.fireDelay = fireDelay; + this.launchDelay = launchDelay; + this.acc = acc; + this.startX = startX; + this.startY = startY; + this.stepDelay = stepDelay; + this.moveVector = moveVector; + this.lastLaunchTime = System.currentTimeMillis(); + this.hitsToDestroy = hitsToDestroy; + } + + public void update(){ + long now = System.currentTimeMillis(); + Vector enemiesToRemove = new Vector<>(); + if(now - lastLaunchTime >= launchDelay * 1000 && currentAmount <= enemyMaxAmount){ + // Create new enemy + enemies.add(new EnemyShip(startX, startY, level.getStageHeight(), level.getStageHeight(), acc, imageName, 0, 15, 15, fireDelay, stepDelay, this, moveVector, 7, hitsToDestroy)); + lastLaunchTime = now; + currentAmount++; + } + 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)); + } + } + for (int i = 0; i < bullets.size() ; i++){ + bullets.get(i).update(); + } + enemies.removeAll(enemiesToRemove); + + } + + public void render(Graphics g, JPanel p){ + for (int i = 0; i < bullets.size() ; i++){ + bullets.get(i).drawSprite(g, p); + } + for (int i = 0; i < enemies.size() ; i++){ + enemies.get(i).drawSprite(g, p); + } + } + + public void fireFromEnemy(EnemyShip e){ + level.enemyFire(e.getCenterX(), (int)(e.getLocY() + e.getsHeight()), -(e.getAcceleration() + 2)); + } + + public Vector getEnemies() { + return enemies; + } + + public void enemyHit(EnemyShip es) { + es.gotHit(); + } + public boolean isWaveOver() { + 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 f26f18f..a407cb6 100644 --- a/src/com/sagi/dayan/Games/Engine/CollisionUtil.java +++ b/src/com/sagi/dayan/Games/Engine/CollisionUtil.java @@ -7,6 +7,7 @@ package com.sagi.dayan.Games.Engine; * Created by sagi on 12/19/15. */ +import com.sagi.dayan.Games.Elements.AnimatedSprite; import com.sagi.dayan.Games.Elements.Sprite; import java.awt.*; @@ -78,8 +79,8 @@ public class CollisionUtil { int[] pixels2 = new int[width*height]; //Create the pixelgrabber and fill the arrays - PixelGrabber pg1 = new PixelGrabber(sprite1.getbImage(), cornerTopX-(int)sprite1.getLocX(), cornerTopY-(int)sprite1.getLocY(), width, height, pixels1, 0, width); - PixelGrabber pg2 = new PixelGrabber(sprite2.getbImage(), cornerTopX-(int)sprite2.getLocX(), cornerTopY-(int)sprite2.getLocY(), width, height, pixels2, 0, width); + PixelGrabber pg1 = new PixelGrabber(((AnimatedSprite)sprite1).getImageFrame(), cornerTopX-(int)sprite1.getLocX(), cornerTopY-(int)sprite1.getLocY(), width, height, pixels1, 0, width); + PixelGrabber pg2 = new PixelGrabber(((AnimatedSprite)sprite2).getImageFrame(), cornerTopX-(int)sprite2.getLocX(), cornerTopY-(int)sprite2.getLocY(), width, height, pixels2, 0, width); //Grab the pixels try { diff --git a/src/com/sagi/dayan/Games/Engine/GameEngine.java b/src/com/sagi/dayan/Games/Engine/GameEngine.java index ab99002..3591209 100644 --- a/src/com/sagi/dayan/Games/Engine/GameEngine.java +++ b/src/com/sagi/dayan/Games/Engine/GameEngine.java @@ -4,7 +4,6 @@ package com.sagi.dayan.Games.Engine; * Created by sagi on 2/8/16. */ -import com.sagi.dayan.Games.Elements.*; import com.sagi.dayan.Games.Stage.*; import com.sagi.dayan.Games.Utils.Utils; @@ -36,6 +35,8 @@ public class GameEngine { 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 p1Strikes, p2Strikes, p1CurrentStrikes, p2CurentStrikes; + private Font gameFont; public GameEngine(int width, int height, Stage stage){ @@ -46,7 +47,7 @@ public class GameEngine { this.pHeight = height; this.scenes = new Vector<>(); this.stage = stage; -// scenes.add(new FirstStage(width, height, 2)); // Need to be a menu Scene +// 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)); @@ -127,7 +128,7 @@ public class GameEngine { public void startGame(int numOfPlayers){ this.numOfPlayers = numOfPlayers; - scenes.add(new FirstStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-")); + scenes.add(new Level(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 20})); changeScene(currentScene+1); } @@ -160,4 +161,19 @@ public class GameEngine { public Font getGameFont() { return gameFont; } + + public int getP1Strikes() { + return p1Strikes; + } + public int getP2Strikes() { + return p2Strikes; + } + public void setPlayerStrikes(int i, int strike) { + if (i == 0) { + p1Strikes += strike; + } else { + p2Strikes += strike; + } + } + } \ No newline at end of file diff --git a/src/com/sagi/dayan/Games/Images/E1-Fire.png b/src/com/sagi/dayan/Games/Images/E1-Fire.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c1dab023c053dc8df3a51cea6388f3d82501ed GIT binary patch literal 4578 zcmV<85gqP{P)L;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru z-~$U6A`4?UX08AL01s(YSad^gZEa<4bN~PV002icGzC?J0{{RK5J^NqR9M69nE6|i z=bpx&wpy!Joj0g;fpADr>jIgOpwnpdtLW8_ml7a z+yMOJ`Ty}O>heE79>&=Y^x=UpPO;c;e-p;B2J@9oVSK95pV=73`wI23Rbjj-k?&s` z#>+zS&Us-x%@gdH9>!B_?uH3r+)Je|c@)NNM9SPdVO)%E;)-5F z2zB+(1*ILD5ULJ6;1;$jLMYpPi<}^+>_g&886l+2 z{LUX)Nc{sv@A_Ty&3FCCpMv-f>YSnf)zkG)K^*02o~S-&bNqJ@N7@=*%1@Xq{}sd$ zrn<-CgF3^12Ju5(^%!1t;jM1;T#~ z;s^ZfgOp`l!C!;;J~MF>GK0?gJcxs7u^aspDfGVtaS$P5HTsf3`IjKRhj^FSA0vc+ zeygHEWS`BgcU!t*10R2nlF#5( z2L>>#ibKmJWKr4DzyLldPK`6rv`ZdWivL2fv(a*O}yVHFieu%Nb^sPCQLvrUt*9u9v9<<0X1x za2!c$k&OFXsKy1y5hv%1SPyyf?%+5g#T-8UHd`F@!>C>XlS8?}5Cr`&vV%)w63$S$ zK|hRWWhJB_$0)3zABLZ&KuJ3hO3(nqY6!k)`;Klx&;Ua#5RcEi!GQz~@Ik5H=FzXT z_<4VQiz0Af_A=cuu}U+pkdEOuQ|7Do3uKCCxfBdHjh!Le$rVW+WDqdi_;jLZ2a7Mf zm5yMz>i$dq20DlLOOhYMWj7ylR#KSkpW;vq=U=|dTtc8Rjz-!soN@YB+FT@oy06!a z;lxwt5~leH#P2%v7`{Am0vV4Yxb3ZK4DW8+g+4TUx;_(#F}%8dv*)(n=2%=K!0_yf zHMT2ilVwf?7sKO=R-4Yqb%v>>thXq7FWL9|h0WY&d-1LaIO=yvp5JQMupVsdcX;8b z-@)5{u3SyOwcc%U!BLOuH~m<)jPlD0tHB9JJ<_fFp=dtgr$t6hGj!evtLpo_8OYJu zT15k#{D(%_w;2=t`=%%*b#U^-wW6=nU!vcQtrS+n$q!TVzes*;-~P0WCxw$ATE+P^ z{;v7U`$g;$IQb#Psh{+nQ!l=pNzI1lc|V{0apwv7oYN`9G-#f|S)`BJ4vMFqO2#EZ z^9)MC|Lxi?!MG#w-q=44Py_~(`pwxT?DJd9P8@vKAiP_jR=}uPt8eax?|QG_s!q(N zR^+G~obX-mx{dPKG-Bxjd0jJn*E?3NI3f{OI8$8R0N*vrs1$f(yK^TAq;+sQBehjr zS43CFXl_Y0oX!YkIm_vFr1!82q;NVPRu$8mU6!PFdUgq%&hYYlN`uo7*Fs4vfYTY8 zpMq33D0&-_*fcnf53-W|(mF{;y`RW{;~0_}kCs#mTMwZ)DjdiAWW2pV%4^zfcM(4y zpa^8)-D>F)>KK`(*_#MJs?RDfnM-^kQZ%??0U&#f;(}?odwfZqGXemTO)JPA-+hB4 ztZw!KfHx_*Y0tYZF?rGk7XbabDpuk{$3+^uq|OO|TUAbvy=^&}z$mD02EZySrbJvZ z9FC!8OB(<%it-8GGnzfo#I%w+0JQup#C1%u)rU(gs0N^lNk*G@3YXiuBGO6#C{HEX z8+Py(njGH50sxB1cyrwb_AH&n6`Kt}KB-?{y^=9mWpGBM4NwH=sZpxDLY!!pqP>&} z0EOHq%gpWOPnNV4(%@ntb&66lx;SHm*K-r#s>HYPlhYl{C%ncCco6;l*EsP>7TP^_ zeL6gdsQUslD$bB_gK;Pc9z?sfmev=kiMd4G9p?eSY^+S^>{UcxByNec0if5G#k6%u zd?#^hdrbhSl||9lT7{m&-8mgP0L0~)p4#(l(^kjKCK&*N;uKqD4MVriGU>bs0B(M= zsjPykT5cF!!v}zs6|XBQCCV0RdMY>r6oCSc*O*sDxH_vr{^hR#WHVjb%yQ)H(Ohb8mmi?Q1C9J8t0EmdLD~?Jv zZ@N)HAGa9*udh14kF4K#DVy?a4FE2WG^>-OUUe~z@L)9nPFqQ88(zNjWFm5F834_u z0`j$f@w~&a{$J(;P^U`6*IKy~wtDSHCjw9{OYE;SvRs0Gz9xS3?d34MlC({*CD6b3h)C_koCL)JCIlLdpDik}tTrXZ>6;mLx* zO~y&}U6bHthv3PA!Hu6vveok3{4Ex5A`EUEGTv0lwsO`Q+GAmGW0LxHWeg)TN7E7k zgBuO+RuxgTv;~T0FLi(-kPzS+Vp@=60tzc|iEk<_?T&p@VPRLqn+kJL@0$uU?5;Nz zrkkB_DooNhzo{@z-SDQuNO|2Wg)~fI2T%G+VFISGm0j{mVGO3QiBa%MVKk=jJT*J0 z@b46XBE0*0BY__GwcCOH#CiSJ#(IPj`GwVj{luAWWBnmNq4!gx0W)oiReNYRigf&0 ztHDg0Y*g;vV)wUxqEuj}jn~SytTm%eA6H2*(?%)F*XHQ$=RYbJVy5k@D$ZG;HrM>E zn1`9Rvpj#nOu4?|_k1>H+P31XnUloo(%-Tem}xI$kw^D%#koHs#55@YwW*|@c9tOH z2R{xoZ6z7s-a_Z5e~)%!rY$4&w_K;NlD@TfVW#~%MSy)^nl@K}J2C6fq}jy)FuobD z%;0t(oV;pB9Mg}bcK8+ZFHWjI-4B3e!hUiq zDw%O|^r2I301Pj7lA7$oiHCc3AF%?UxU-?ZM$dk{wPo!#EdY|ME8P`p#@%(-bJi;X z5T0FPEtOM$UEa80MHK+N<8zILV&b`l^)nZh4^RYXfMe>JQ&;f`N_80lMMM5%V;)?ZJexlQ{`c*c&(v_0b?68 zHA+{uhbYL=v{P9F6ai+mTPOOIUi=8|N6gbctBU_;O8yY;nv5J%M03{uS8y`ER+Hz*h?{@qyxbd-5sw}2O z|7Pyr3^zV@N~`h{d_U{mYv9JmPHA~ojORzSbv4}h@RZ8($v)HfV(mP*@!_!)Wsy9( zZw1QfaN`TH{~^3h^)N8D-+kY5x6_ zFG#SMI#eqXq>M**j;R%5G4%r_pPT&LzT-(H4~wZosyM9phvp6U%Gg*;9b8PK^j%Re zxs*rEh6)GeClET%$md?n48+v;vJj;0n0VUBl!!#A@ZD6u|Jr`R_`}KG*slgCf;W+c zNxC}mI?erGmIrPkv*J|Mg5`>vKP?R0L?%bdq}+v)%SUGg?p9-ZMJ23R!qfXE2kur+ zI`{?j$-GnFjS1YX?zM8VDP!12wm%8nt!^|i(+E!(d%wJg;nGXzX^F@^>bB2rU^wq$ z4I$QlgSdY2B@CyZtUw~rOSlztE@Jp%Pa*0upX{1F?l6Xrw&r@A`ooSX&-P$=XI+M^ zS-r3YYc;2k&Ftk#Jq zs4b&|ciecrTqSrRH}nMWxKV1cjQdEeX%F6U`{V)<>yALt61?Mfin)CHRj%ZE@Q&Li zU~wpCS;EHPmH!%-&LkYC^Xh|F{tGM$4LLwz9|~M~hgMRM7<3at-4eXxmJ$5X_Kkkx z+Tb0x2tj@3RVXeecx%t|+dcZF_U;9rzeN!kl;E@X=}~*A#fb5kJJoh`sKto3>D%OH zeW=ConbgZ1xaZBlZZm7jj@mYlw z4lC4R$T;*|0+SwUG5D#3bbkUN)M9YRND>-@gjx(H$sccz_J>*w8Xk=@`_NE}@xK*8 zO@42j{dYeSs&P|rJ5)@0oW1&=J!q(yvNd<8f3(>{#gwU`RsMs?94e-Cbxq>$ zb^1^-rK&zJ_*SJ36;m>44fkuAJXB1HODb4jh{T~{ieFGl|CB3uRZI_jbOn;$p^m z%r|ztE*GPp+4Pq-ye=1g4@~NdE5qgDEuH-2l5n~Bi%NWWZn#|hNha7cEnF@h6>+zY z50{Jk_^fr$Uzdxb?M%wT+rro7;+HhStSjMi@iQ_q`AoQ6TukzhImY+{MezS)wSO!> zjGLCBPdQ=Sm}I}t4CAUe^G#Y9mqzL@CxmfculjUM7^ip0Peq4uLaX?QFN`mm1baPU zd~}|>%@)S174#LlFrF=?EK-H>_-4XvSr`wjL8gfQP|-i0|I^R^00m~mT8%fadjJ3c M07*qoM6N<$f*tF@umAu6 literal 0 HcmV?d00001 diff --git a/src/com/sagi/dayan/Games/Images/animatedSample2.png b/src/com/sagi/dayan/Games/Images/explosion.png similarity index 100% rename from src/com/sagi/dayan/Games/Images/animatedSample2.png rename to src/com/sagi/dayan/Games/Images/explosion.png diff --git a/src/com/sagi/dayan/Games/Main.java b/src/com/sagi/dayan/Games/Main.java index 10a21fa..e7bcb5c 100644 --- a/src/com/sagi/dayan/Games/Main.java +++ b/src/com/sagi/dayan/Games/Main.java @@ -20,7 +20,7 @@ public class Main { public static final int WIDTH = 1000, HEIGHT = 1000; public static void main(String[] args) { - JFrame frame = new JFrame("Game"); + JFrame frame = new JFrame("Far Out - Cold Shit IV"); frame.setSize(WIDTH, HEIGHT); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); diff --git a/src/com/sagi/dayan/Games/Stage/FirstStage.java b/src/com/sagi/dayan/Games/Stage/Level.java similarity index 58% rename from src/com/sagi/dayan/Games/Stage/FirstStage.java rename to src/com/sagi/dayan/Games/Stage/Level.java index bd23982..d35e0bf 100644 --- a/src/com/sagi/dayan/Games/Stage/FirstStage.java +++ b/src/com/sagi/dayan/Games/Stage/Level.java @@ -1,9 +1,7 @@ package com.sagi.dayan.Games.Stage; -import com.sagi.dayan.Games.Elements.Background; -import com.sagi.dayan.Games.Elements.EnemyShip; -import com.sagi.dayan.Games.Elements.Missile; -import com.sagi.dayan.Games.Elements.Player; +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; @@ -20,28 +18,35 @@ import java.util.*; /** * Created by sagi on 2/20/16. */ -public class FirstStage extends Scene { +public class Level extends Scene { protected Vector players; protected int p1Speed = 10; - protected Vector missiles; + protected Vector p1Missiles, p2Missiles, enemyMissiles; protected Background bg; - protected Timer enemyWaveT, enemyT; - protected Vector enemies; + 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; - - public FirstStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle){ + public Level(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay){ super(width, height, engine); players = new Vector<>(); - missiles = 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)}; @@ -52,19 +57,14 @@ public class FirstStage extends Scene { 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")); + 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")); - 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")); + 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(); - enemies = new Vector<>(); - enemyWaveT = new Timer(10000, new enemyWaveLaunch()); - enemyT = new Timer(10000, new enemyLaunch()); - enemyWaveT.start(); - Utils.playSound("jetSound.wav"); } @@ -86,6 +86,15 @@ public class FirstStage extends Scene { bg.update(); movePlayers(); + Vector wavesToRemove = new Vector(); + + long now = System.currentTimeMillis(); + if(currentWave < waveDelay.length && now - lastWaveTime >= waveDelay[currentWave] * 1000){ + lastWaveTime = now; + System.out.println("New Wave!! Time: "+ now); + currentWave++; + waves.add(new Wave(5, new int[]{90,90,120, 120, 150, 150, 270, 270, 270} , 4, 1, 2, 4, "L1-ES1.png" , 500, 0, this, 1)); + } if(startingAnimationIndex < 3 && !isStarted){ if(startingAnimationIndex == 0){ @@ -110,22 +119,30 @@ public class FirstStage extends Scene { } } }else{ - isStarted = true; for(int i = 0 ; i < players.size() ; i++){ players.get(i).update(); } - for(int i = 0 ; i < missiles.size() ; i++){ - missiles.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 < enemies.size() ; i++){ - enemies.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(); } private void movePlayers() { @@ -152,7 +169,7 @@ public class FirstStage extends Scene { } if(keys.get(engine.getP1Controlles()[GameEngine.FIRE]) ){ if(players.get(0).isAbleToFire()){ - missiles.add(new Missile(players.get(0).getCenterX() - 15, (int)players.get(0).getLocY(), players.get(0).getAcceleration() + 3, "P1Laser.png")); + 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(); } } @@ -181,7 +198,7 @@ public class FirstStage extends Scene { } if(keys.get(engine.getP2Controlles()[GameEngine.FIRE]) ){ if(players.get(1).isAbleToFire()){ - missiles.add(new Missile(players.get(1).getCenterX() - 15, (int)players.get(1).getLocY(), players.get(1).getAcceleration() + 3, "P1Laser.png")); + 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(); } } @@ -200,9 +217,9 @@ public class FirstStage extends Scene { if(f == null) { f = g.getFont(); } - f = f.deriveFont(60F); - g.setColor(Color.DARK_GRAY); - g.setFont(f); + f = f.deriveFont(60F); + g.setColor(Color.DARK_GRAY); + g.setFont(f); // Get the FontMetrics @@ -216,16 +233,85 @@ public class FirstStage extends Scene { } - for(int i = 0 ; i < missiles.size() ; i++){ - missiles.get(i).drawSprite(g,p); + for(int i = 0 ; i < p1Missiles.size() ; i++){ + p1Missiles.get(i).drawSprite(g,p); + } + for(int i = 0 ; i < p2Missiles.size() ; i++){ + p2Missiles.get(i).drawSprite(g,p); + } + for(int i = 0 ; i < enemyMissiles.size() ; i++){ + enemyMissiles.get(i).drawSprite(g,p); } for(int i = 0 ; i < players.size() ; i++){ players.get(i).drawSprite(g,p); } - - for(int i = 0 ; i < enemies.size() ; i++){ - enemies.get(i).drawSprite(g,p); + for(int i = 0 ; i < waves.size() ; i++){ + waves.get(i).render(g,p); } + + } + + public void checkCollision() { + Vector p1MTR, p2MTR, eMTR; + eMTR = new Vector<>(); + p1MTR = new Vector<>(); + p2MTR = new Vector<>(); + for (int i = 0; i < players.size(); i++) { + for (int j = 0; j < enemyMissiles.size(); j++) { + if(CollisionUtil.collidesWith(players.get(i),enemyMissiles.get(j))){ + //Remove players Life + eMTR.add(enemyMissiles.get(j)); + System.out.println("Hit Missile"); + } + } + 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))) { + engine.setPlayerStrikes(i, -1); + waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); + System.out.println("PIN"); + } + } + } + + if(i == 0){ + for(int m = 0 ; m < p1Missiles.size() ; m++){ + 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), p1Missiles.get(m))) { + waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); + p1MTR.add(p1Missiles.get(m)); + } + } + } + } + }else{ + for(int m = 0 ; m < p2Missiles.size() ; m++){ + 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), p2Missiles.get(m))) { + waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); + p2MTR.add(p2Missiles.get(m)); + } + } + } + } + } + } + + + + 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)); } @Override @@ -246,29 +332,5 @@ public class FirstStage extends Scene { keys.put(keyEvent.getKeyCode(), false); } - private class fireTimer implements ActionListener { - @Override - public void actionPerformed(ActionEvent actionEvent) { - missiles.add(new Missile(((EnemyShip)actionEvent.getSource()).getCenterX(), (int)((EnemyShip)actionEvent.getSource()).getLocY(), ((EnemyShip)actionEvent.getSource()).getAcceleration() + 3, "P1Laser.png")); - } - } - - private class enemyWaveLaunch implements ActionListener { - - @Override - public void actionPerformed(ActionEvent actionEvent) { - } - - - } - - private class enemyLaunch implements ActionListener { - - @Override - public void actionPerformed(ActionEvent actionEvent) { - enemies.add(new EnemyShip(0,0,0,0,3,"L1-ES1.png",0,15,15,new fireTimer())); - } - - } } diff --git a/src/com/sagi/dayan/Games/Stage/MainMenuScene.java b/src/com/sagi/dayan/Games/Stage/MainMenuScene.java index 2a92576..865a33a 100644 --- a/src/com/sagi/dayan/Games/Stage/MainMenuScene.java +++ b/src/com/sagi/dayan/Games/Stage/MainMenuScene.java @@ -29,7 +29,7 @@ public class MainMenuScene extends Scene { 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); //bImage is the background... not trivial + 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) { diff --git a/src/com/sagi/dayan/Games/Stage/SampleScene.java b/src/com/sagi/dayan/Games/Stage/SampleScene.java deleted file mode 100644 index 3fbefff..0000000 --- a/src/com/sagi/dayan/Games/Stage/SampleScene.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.sagi.dayan.Games.Stage; - -import com.sagi.dayan.Games.Elements.*; -import com.sagi.dayan.Games.Engine.GameEngine; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.awt.image.BufferedImage; - -/** - * Created by sagi on 2/10/16. - */ -public class SampleScene extends Scene { - private final int STOP=0, UP=1, DOWN=-1, TURN_SPEED=10; - private DemoSprite sprite; - private AnimatedDemoSprite animated; - private int r = 0, g = 0, b = 0; - private boolean toWhite = true; - - public SampleScene(int width, int height, GameEngine engine){ - super(width, height, engine); -// sprite = new DemoSprite(50,50,width, height, 50); - animated = new AnimatedDemoSprite(width/2, height/2, width, height,5,"animatedSample.png", 0, 58,87); - } - - @Override - public void update() { - sprite.update(); - animated.update(); - } - - @Override - public void render(JPanel p) { - sceneImage = new BufferedImage(this.stageWidth, this.stageHeight, Image.SCALE_FAST); - Graphics g = sceneImage.getGraphics(); - g.setColor(getColor()); - g.fillRect(0,0,stageWidth, stageWidth); - sprite.drawSprite(g, p); - animated.drawSprite(g, p); - } - - - @Override - public void keyTyped(KeyEvent keyEvent) { - - } - - @Override - public void keyPressed(KeyEvent keyEvent) { - System.out.println("Pressed!"); - - if (keyEvent.getKeyCode() == keyEvent.VK_LEFT) { - sprite.turnShip(DOWN); - } - if (keyEvent.getKeyCode() == keyEvent.VK_RIGHT) { - sprite.turnShip(UP); - } - if (keyEvent.getKeyCode() == keyEvent.VK_UP) { - sprite.setDirection(UP); - } - if (keyEvent.getKeyCode() == keyEvent.VK_DOWN) { - sprite.setDirection(DOWN); - } - - } - - @Override - public void keyReleased(KeyEvent keyEvent) { - switch (keyEvent.getKeyCode()){ - case KeyEvent.VK_UP: - case KeyEvent.VK_DOWN: - sprite.setDirection(STOP); - break; - case KeyEvent.VK_RIGHT: - case KeyEvent.VK_LEFT: - sprite.turnShip(STOP); - break; -// case KeyEvent.VK_SPACE: -// laserAudioClip.stop(); -// break; - default: - break; - - } - } - - public void mousePressed(MouseEvent e){ - System.out.println("Mouse pressed"); - } - - private Color getColor() { - if(toWhite){ - if(r < 225) { - r++; - } else if (g < 225) { - g++; - } else if ( b < 225) { - b++; - }else if (r == 225 && g ==225 && b == 225){ - toWhite = false; - } - } else { - if(b > 0) { - b--; - } else if (g > 0) { - g--; - } else if ( r > 0) { - r--; - }else if (r == 0 && g ==0 && b == 0){ - toWhite = true; - } - } - return new Color(r, g, b); - - } -} diff --git a/src/com/sagi/dayan/Games/Stage/Scene.java b/src/com/sagi/dayan/Games/Stage/Scene.java index ae08d57..7fd1e62 100644 --- a/src/com/sagi/dayan/Games/Stage/Scene.java +++ b/src/com/sagi/dayan/Games/Stage/Scene.java @@ -15,6 +15,14 @@ import java.awt.image.BufferedImage; 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; @@ -33,4 +41,6 @@ public abstract class Scene extends MouseAdapter implements KeyListener{ return sceneImage; } + + } diff --git a/src/com/sagi/dayan/Games/Stage/Stage.java b/src/com/sagi/dayan/Games/Stage/Stage.java index 48bbc87..9d52c14 100644 --- a/src/com/sagi/dayan/Games/Stage/Stage.java +++ b/src/com/sagi/dayan/Games/Stage/Stage.java @@ -91,7 +91,11 @@ public class Stage extends JPanel implements Runnable{ if (System.currentTimeMillis() - lastTimer > 1000) { lastTimer += 1000; - System.out.println("Ticks: " + ticks + "\tFps: " + frames + "\tScenes Size: " + engine.getScenesSize()); + if(frames <= 35){ + System.err.println("Ticks: " + ticks + "\tFps: " + frames + "\tScenes Size: " + engine.getScenesSize()); + }else{ + System.out.println("Ticks: " + ticks + "\tFps: " + frames + "\tScenes Size: " + engine.getScenesSize()); + } frames = 0; ticks = 0; } From f6407115e6d400e2ff867980094d022243634719 Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Sat, 19 Mar 2016 00:33:29 +0200 Subject: [PATCH 3/4] wave & stage abstraction also cleaned some code. --- .../sagi/dayan/Games/Elements/EnemyShip.java | 5 +- src/com/sagi/dayan/Games/Elements/Wave.java | 5 +- .../sagi/dayan/Games/Engine/GameEngine.java | 11 ++++- src/com/sagi/dayan/Games/Images/E1-Fire.png | Bin 4578 -> 2425 bytes .../sagi/dayan/Games/Stage/FirstStage.java | 46 ++++++++++++++++++ src/com/sagi/dayan/Games/Stage/Level.java | 12 ++--- .../sagi/dayan/Games/Utils/WaveConfig.java | 41 ++++++++++++++++ .../sagi/dayan/Games/Utils/WaveConfigs.java | 34 +++++++++++++ 8 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 src/com/sagi/dayan/Games/Stage/FirstStage.java create mode 100644 src/com/sagi/dayan/Games/Utils/WaveConfig.java create mode 100644 src/com/sagi/dayan/Games/Utils/WaveConfigs.java diff --git a/src/com/sagi/dayan/Games/Elements/EnemyShip.java b/src/com/sagi/dayan/Games/Elements/EnemyShip.java index e8fbd6d..6eca8dc 100644 --- a/src/com/sagi/dayan/Games/Elements/EnemyShip.java +++ b/src/com/sagi/dayan/Games/Elements/EnemyShip.java @@ -10,14 +10,15 @@ import java.awt.event.ActionListener; * Created by sagi on 2/20/16. */ public class EnemyShip extends AnimatedSprite { - protected int fireDelay, stepDelay, currentStep; + protected int currentStep; + protected double stepDelay, fireDelay; protected long lastFireTime, lastStepTime; protected int[] moveVector; protected Wave wave; protected int hitsToDestroy; protected boolean isDone; protected long startExploded; - public EnemyShip(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight,int fireDelay, int stepDelay, Wave wave, int[] moveVector,int numOfFirstFrames, int hitsToDestroy) { + public EnemyShip(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight,double fireDelay, double stepDelay, Wave wave, int[] moveVector,int numOfFirstFrames, int hitsToDestroy) { super(x, y, w, h, acc, imgName, angle, sWidth, sHeight, numOfFirstFrames); this.fireDelay = fireDelay; this.stepDelay = stepDelay; diff --git a/src/com/sagi/dayan/Games/Elements/Wave.java b/src/com/sagi/dayan/Games/Elements/Wave.java index 3b20e8d..f089ab0 100644 --- a/src/com/sagi/dayan/Games/Elements/Wave.java +++ b/src/com/sagi/dayan/Games/Elements/Wave.java @@ -13,7 +13,8 @@ import java.util.Vector; public class Wave { protected Level level; - protected int enemyMaxAmount, currentAmount,fireDelay, launchDelay, stepDelay, acc, startX, startY; + protected int enemyMaxAmount, currentAmount, acc, startX, startY; + protected double stepDelay,fireDelay, launchDelay; protected int[] moveVector; protected Vector enemies; protected Vector bullets; @@ -21,7 +22,7 @@ public class Wave { protected String imageName; protected int hitsToDestroy; - public Wave(int enemyMaxAmount, int[] moveVector, int fireDelay, int stepDelay, int launchDelay, int acc, String imageName, int startX, int startY, Level stage, int hitsToDestroy){ + public Wave(int enemyMaxAmount, int[] moveVector, double fireDelay, double stepDelay, double launchDelay, int acc, String imageName, int startX, int startY, Level stage, int hitsToDestroy){ this.enemies = new Vector<>(); this.bullets = new Vector<>(); this.enemyMaxAmount = enemyMaxAmount; diff --git a/src/com/sagi/dayan/Games/Engine/GameEngine.java b/src/com/sagi/dayan/Games/Engine/GameEngine.java index 3591209..1cb5771 100644 --- a/src/com/sagi/dayan/Games/Engine/GameEngine.java +++ b/src/com/sagi/dayan/Games/Engine/GameEngine.java @@ -6,6 +6,7 @@ package com.sagi.dayan.Games.Engine; 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.*; @@ -37,8 +38,12 @@ public class GameEngine { private int p1Strikes, p2Strikes, p1CurrentStrikes, p2CurentStrikes; + + private Font gameFont; + private WaveConfigs waveConfigs; + public GameEngine(int width, int height, Stage stage){ this.currentScene = 0; this.isFirstGame = true; @@ -61,6 +66,7 @@ public class GameEngine { e.printStackTrace(); gameFont = null; } + this.waveConfigs = new WaveConfigs(); startNewGame(); } @@ -83,6 +89,9 @@ public class GameEngine { } + public WaveConfigs getWaveConfigs() { + return waveConfigs; + } @@ -128,7 +137,7 @@ public class GameEngine { public void startGame(int numOfPlayers){ this.numOfPlayers = numOfPlayers; - scenes.add(new Level(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 20})); + scenes.add(new FirstStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 20})); changeScene(currentScene+1); } diff --git a/src/com/sagi/dayan/Games/Images/E1-Fire.png b/src/com/sagi/dayan/Games/Images/E1-Fire.png index a7c1dab023c053dc8df3a51cea6388f3d82501ed..9ba35319decc98dc8a67125ac9718bc0c5ed02d7 100644 GIT binary patch delta 2308 zcmV+f3H$cqBl!{`iBL{Q4GJ0x0000DNk~Le0003j0000K1Oos70L2X*GLa#62n`Ak zFvEIyJ$PuXN$FMqi$rMEn2&Q@|AtINbwiaNA}smS?`H&*k=nRy>fiP zeoq14fBX15?6>20y`_1L{dRm7SFz{WZ^x^DnRUwapB7&HB;!%*0=&zk+22?6_#M2< zjcul96m>!&7ptZ^G4mM|N-zp&;fYV6P`odl>T{+93dQL06lb3sP$*g*M%wRk5eh|U zUPN8n+4f75dYP{{B24LdNb3Wa=TQ>@lO8HcqN zAaIV+S5*5RdGKT(J+t@~^59W=bz;_Yg5E}@xcFX0&>JWu zbJxoV`U{DuXK@Zezb87X=$}N;uN=*!^o~Nb$bG!#u+%PudP@^KIJXT_g|1>*tsNWS zf5#NO%wjxl`x3L(0`T8lPkYA>uLD49%Ho7`^uTuj6yNF}+8@~R34oQCTleX@Kl&Sh z$%oQAm2C?D0-*oy{O0w>8Gi!Me0_M+tVY5g0MuL<{5CD`^E&_qr`x6mmRx=VApJz` z+m>Y zf$FI^E9;vLz-!8}mFY#-WB{5-c9R367Lfo{5qI~ubm{v8kY=V(Q&=u-1wb5rf4Lx| zblwtxP|XkN3E3kC0C-|w$A>3(sIIl}?!}~rs2Sa&nDXc_$w9K}S4rC3S`#6JMY+pF zB`(F@AluQ;=MG9rtTYl#y2ei0&xlV}+T!ZEkM0=~>(4jAl-D27Y!_`##W73o?ZQ44 zsUc$~vU9hw%7hC-n7zq48yGhQf8z~6Xr+M%> z;qu9b*7vCnKP-Ts!pcigHGUHi%tvCR#L8&AIO4%e?2Ce_g%B=u^l~JJS0Xx zzq`St%QCB7wEEQc3S6B*f6`MC+Hr+EOu2qUnK1R>atgC_tM5%Aiv5S!iEL@tD+0%N zGzB(BcIpT7AKX~wUg=-A)q~Ie>usBSw{mF*-aQ}Fj8m;j=1qTC;8uVm(Gp={Aiuu*@Kf;)k&C zkVQI-u>NlWd_-JI$X25U0|#D5Ol**}dWEVfj~O$XFfW%Uqs@(<2(%sfoU)+ArP=Fl z(lHkMPErEfXoG9(j_#ZhXH^he_j!!5*qSd1D5<^1Sqx@sTN1Z4+ry;O!CP3);*RUKP-S(XE`lI z)hbuTlt=4BT#$@mj+8c+;_Fbtg4(4yC5e?LPuq90QNxlFlU2t|Iu`>5XT{0(Rji+ zvUU-!ioVK2`~8bY;i{nL@6&b5LRLj}>P}^=BxF_4$eY(2Mj)$#8nS6t%@=3`s{%W5 zAw0W7ZLI~Y`!o^nLmr0X_o?16mykio`t-KZ%RHzBvi^Qq>7++^1X+JQ%-^eGTL@Wy z-c8k!GRc6fKdzIt=5Ps+_4|bo#bHc1Wc_wJXl0P;e+^l`o*+!NPB=r>FZ)cIiyCzy z>*t-gn#@WS$ogp=rXVq23bM9*XQrP?ol{$D0epnXzM|I8NYL2!(=#8BAwgr(T%B0d zjRXy@hIS^i9tj#u0o5n*9uhRnbc)NFTqI~F;z{N{IY`j-h7t8#E+OgI=;f$l9)+Z1 zr4tOFe*hRcLa911e5{e6A#1_#F+zeSM3L1xtd4|U&CK>bnmjGSH~Le#e&+)fcY0hNDq^`n^MYg(wBp=PkHn!B=T^Kw2CX<(!`ztciX(W= z$*`AQ-~>+YRck~m&QTrNO0?n}&|1uQ_@@OLj(z47JubU3PSKOt-OVX_;@j&v&xtAA zPU93k(dArD(G&TQ!zp^guP@DTs$5ePr}7C_1#l`Kf0{L?=<&rFaf%*qs5+-~@_5R{ e{M+(hy#5DSGYej0yJpV-0000D?hj+ZXGblDb0Z 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 QdjJ3c07*qoM6N<$f@S@(wg3PC diff --git a/src/com/sagi/dayan/Games/Stage/FirstStage.java b/src/com/sagi/dayan/Games/Stage/FirstStage.java new file mode 100644 index 0000000..a90e9ae --- /dev/null +++ b/src/com/sagi/dayan/Games/Stage/FirstStage.java @@ -0,0 +1,46 @@ +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{ + + public FirstStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 5; + fireDelay = 0.2; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + case 1: + numOfEnemies = 5; + fireDelay = 5; + launchDelay = 1; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + 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 d35e0bf..25a54ea 100644 --- a/src/com/sagi/dayan/Games/Stage/Level.java +++ b/src/com/sagi/dayan/Games/Stage/Level.java @@ -4,6 +4,8 @@ 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; @@ -18,7 +20,7 @@ import java.util.*; /** * Created by sagi on 2/20/16. */ -public class Level extends Scene { +public abstract class Level extends Scene { protected Vector players; protected int p1Speed = 10; protected Vector p1Missiles, p2Missiles, enemyMissiles; @@ -83,17 +85,13 @@ public class Level extends Scene { @Override public void update() { - bg.update(); movePlayers(); Vector wavesToRemove = new Vector(); long now = System.currentTimeMillis(); if(currentWave < waveDelay.length && now - lastWaveTime >= waveDelay[currentWave] * 1000){ - lastWaveTime = now; - System.out.println("New Wave!! Time: "+ now); - currentWave++; - waves.add(new Wave(5, new int[]{90,90,120, 120, 150, 150, 270, 270, 270} , 4, 1, 2, 4, "L1-ES1.png" , 500, 0, this, 1)); + launchWave(now); } if(startingAnimationIndex < 3 && !isStarted){ @@ -145,6 +143,8 @@ public class Level extends Scene { checkCollision(); } + protected abstract void launchWave(long time); + private void movePlayers() { /** * Player 1 Movement: diff --git a/src/com/sagi/dayan/Games/Utils/WaveConfig.java b/src/com/sagi/dayan/Games/Utils/WaveConfig.java new file mode 100644 index 0000000..fb1ac76 --- /dev/null +++ b/src/com/sagi/dayan/Games/Utils/WaveConfig.java @@ -0,0 +1,41 @@ +package com.sagi.dayan.Games.Utils; + +/** + * Created by sagi on 3/18/16. + */ +public class WaveConfig { + protected int[] moveVector; + protected double stepDelay; + protected int acc; + protected int startX; + protected int startY; + + public WaveConfig(int[] moveVector, double stepDelay, int acc, int staryX, int startY){ + this.moveVector = moveVector; + this.stepDelay = stepDelay; + this.acc = acc; + this.startX = staryX; + this.startY = startY; + } + + + public int[] getMoveVector() { + return moveVector; + } + + public double getStepDelay() { + return stepDelay; + } + + public int getAcc() { + return acc; + } + + public int getStartX() { + return startX; + } + + public int getStartY() { + return startY; + } +} diff --git a/src/com/sagi/dayan/Games/Utils/WaveConfigs.java b/src/com/sagi/dayan/Games/Utils/WaveConfigs.java new file mode 100644 index 0000000..d26621c --- /dev/null +++ b/src/com/sagi/dayan/Games/Utils/WaveConfigs.java @@ -0,0 +1,34 @@ +package com.sagi.dayan.Games.Utils; + +import java.util.Vector; + +/** + * Created by sagi on 3/18/16. + */ +public class WaveConfigs { + public static final int DEMO = 0; + Vector configs; + + public WaveConfigs(){ + configs = new Vector<>(); +// int[] moveVector, double stepDelay, int acc, int staryX, int startY + configs.add(new WaveConfig(new int[]{90,90,120, 120, 150, 150, 270, 270, 270} , 0.5, 8,500 , 0)); + +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); + } + + public WaveConfig getWaveConfig(int config){ + if (config < 0 || configs.size() <= config) + throw new IllegalArgumentException("no such config..."); + return configs.get(config); + } +} From 224c3b824c596145c8a23941f28aa8092bc7832b Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Sat, 19 Mar 2016 02:01:49 +0200 Subject: [PATCH 4/4] Added player stats UI --- .../sagi/dayan/Games/Elements/EnemyShip.java | 4 +- src/com/sagi/dayan/Games/Elements/Player.java | 42 +++++++++-- .../sagi/dayan/Games/Engine/GameEngine.java | 70 ++++++++++++++++--- src/com/sagi/dayan/Games/Stage/Level.java | 66 ++++++++++++++--- 4 files changed, 159 insertions(+), 23 deletions(-) diff --git a/src/com/sagi/dayan/Games/Elements/EnemyShip.java b/src/com/sagi/dayan/Games/Elements/EnemyShip.java index 6eca8dc..a4a507d 100644 --- a/src/com/sagi/dayan/Games/Elements/EnemyShip.java +++ b/src/com/sagi/dayan/Games/Elements/EnemyShip.java @@ -67,8 +67,8 @@ public class EnemyShip extends AnimatedSprite { } System.out.println("GOT HIT " + hitsToDestroy); } - public int getHitToDestroy() { - return hitsToDestroy; + public boolean isDead() { + return hitsToDestroy == 0; } public boolean isDone(){ diff --git a/src/com/sagi/dayan/Games/Elements/Player.java b/src/com/sagi/dayan/Games/Elements/Player.java index 0dbcf7f..5c1c857 100644 --- a/src/com/sagi/dayan/Games/Elements/Player.java +++ b/src/com/sagi/dayan/Games/Elements/Player.java @@ -1,15 +1,21 @@ package com.sagi.dayan.Games.Elements; +import javax.swing.*; +import java.awt.*; + /** * Created by sagi on 2/20/16. */ public class Player extends AnimatedSprite { - private final int NORMAL_ANIMATION = 0, RIGHT_ANIMATION = 1, LEFT_ANIMATION = 2, PADDING_BOTTOM = 35; + private final int NORMAL_ANIMATION = 0, RIGHT_ANIMATION = 1, LEFT_ANIMATION = 2, PADDING_BOTTOM = 35, MORTAL_DELAY = 3; private int hDirection = 0, vDirection = 0; private String imagePrefix; - private boolean ableToFire; + private boolean ableToFire, isMortal, toDraw; private int fireDelay; - private long lastFired; + private double imortalPulse = 0.2; + private long lastFired, lastDrawn, created; + + public Player(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight, String imagePrefix, int numOfFirstFrames) { @@ -17,9 +23,13 @@ public class Player extends AnimatedSprite { this.imagePrefix = imagePrefix; initFirstAnimation("", numOfFirstFrames); this.ableToFire = true; - fireDelay = 100; + fireDelay = 200; lastFired = System.currentTimeMillis(); + lastDrawn = lastFired; + created = lastDrawn; setImageDimensions(); + isMortal = false; + toDraw = true; } @Override @@ -32,6 +42,10 @@ public class Player extends AnimatedSprite { animations.add(new Animation(imagePrefix+"LeftSheet.png", 7, 200)); } + public boolean isMortal() { + return isMortal; + } + @Override public void update() { long now = System.currentTimeMillis(); @@ -70,6 +84,7 @@ public class Player extends AnimatedSprite { } } + public boolean isAbleToFire() { return ableToFire; } @@ -89,4 +104,23 @@ public class Player extends AnimatedSprite { public void updateFireTime(){ lastFired = System.currentTimeMillis(); } + + @Override + public void drawSprite(Graphics g, JPanel p){ + long now = System.currentTimeMillis(); + if(isMortal){ + super.drawSprite(g, p); + }else{ + if(now - lastDrawn >= imortalPulse * 1000){ + toDraw = !toDraw; + lastDrawn = now; + if(now-created >= MORTAL_DELAY * 1000){ + isMortal = true; + } + } + if(toDraw) { + super.drawSprite(g, p); + } + } + } } diff --git a/src/com/sagi/dayan/Games/Engine/GameEngine.java b/src/com/sagi/dayan/Games/Engine/GameEngine.java index 1cb5771..ae8f2f8 100644 --- a/src/com/sagi/dayan/Games/Engine/GameEngine.java +++ b/src/com/sagi/dayan/Games/Engine/GameEngine.java @@ -36,7 +36,7 @@ public class GameEngine { 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 p1Strikes, p2Strikes, p1CurrentStrikes, p2CurentStrikes; + private int p1Lives, p2Lives, p1Health, p2Health, credits, p1Score, p2Score; @@ -68,9 +68,31 @@ public class GameEngine { } this.waveConfigs = new WaveConfigs(); startNewGame(); + resetPlayerHealth(0); + resetPlayerHealth(1); + credits = 3; } + private void resetPlayerHealth(int i){ + if (i==0){ + p1Health = 100; + } + else{ + p2Health = 100; + } + } + private void resetPlayer(int i){ + resetPlayerHealth(i); + + if (i==0){ + p1Lives = 3; + } + else{ + p2Lives = 3; + } + } + /** * initialize and reset vars and timers to "new game" configuration. @@ -171,17 +193,49 @@ public class GameEngine { return gameFont; } - public int getP1Strikes() { - return p1Strikes; + public int getP1Lives() { + return p1Lives; } - public int getP2Strikes() { - return p2Strikes; + public int getP2Lives() { + return p2Lives; } - public void setPlayerStrikes(int i, int strike) { + + 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 setScore(int i, int score) + { if (i == 0) { - p1Strikes += strike; + p1Score += score; } else { - p2Strikes += strike; + p2Score += score; + } + } + public void setPlayerHealth(int i, int strike) { + if (i == 0) { + p1Health += strike; + } else { + p2Health += strike; } } diff --git a/src/com/sagi/dayan/Games/Stage/Level.java b/src/com/sagi/dayan/Games/Stage/Level.java index 25a54ea..1e79898 100644 --- a/src/com/sagi/dayan/Games/Stage/Level.java +++ b/src/com/sagi/dayan/Games/Stage/Level.java @@ -212,8 +212,9 @@ public abstract class Level extends Scene { bg.drawSprite(g, p); Color c = g.getColor(); + Font f = engine.getGameFont(); + if(!isStarted){ - Font f = engine.getGameFont(); if(f == null) { f = g.getFont(); } @@ -230,8 +231,37 @@ public abstract class Level extends Scene { int y = ((stageHeight - metrics.getHeight()) / 2) - metrics.getAscent(); g.drawString(this.title, x, y); g.setColor(c); + } + //print score + f = f.deriveFont(15F); + g.setFont(f); + + //print life bar + for(int i=0; i(); p1MTR = new Vector<>(); p2MTR = new Vector<>(); + + //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))){ - //Remove players Life + if(players.get(i).isMortal()) + engine.setPlayerHealth(i, -10); eMTR.add(enemyMissiles.get(j)); System.out.println("Hit Missile"); } } + + //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))) { - engine.setPlayerStrikes(i, -1); + if(players.get(i).isMortal()) + engine.setPlayerHealth(i, -10); waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); - System.out.println("PIN"); } } } + //player 1 missile vs. enemy if(i == 0){ for(int m = 0 ; m < p1Missiles.size() ; m++){ 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), p1Missiles.get(m))) { - waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); + 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)); } } } } - }else{ + + } + + //player 1 missile vs. enemy + else { for(int m = 0 ; m < p2Missiles.size() ; m++){ 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), p2Missiles.get(m))) { - waves.get(j).enemyHit(waves.get(j).getEnemies().get(k)); + + 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)); + } } } @@ -304,6 +351,7 @@ public abstract class Level extends Scene { + p1Missiles.removeAll(p1MTR); p2Missiles.removeAll(p2MTR); enemyMissiles.removeAll(eMTR);