2016-02-27 20:45:32 +00:00
|
|
|
package com.sagi.dayan.Games.Stage;
|
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
import com.sagi.dayan.Games.Elements.*;
|
|
|
|
import com.sagi.dayan.Games.Engine.CollisionUtil;
|
2016-02-27 20:45:32 +00:00
|
|
|
import com.sagi.dayan.Games.Engine.GameEngine;
|
|
|
|
import com.sagi.dayan.Games.Utils.Utils;
|
2016-03-18 22:33:29 +00:00
|
|
|
import com.sagi.dayan.Games.Utils.WaveConfig;
|
|
|
|
import com.sagi.dayan.Games.Utils.WaveConfigs;
|
2016-02-27 20:45:32 +00:00
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
import javax.swing.Timer;
|
|
|
|
import java.awt.*;
|
|
|
|
import java.awt.event.ActionEvent;
|
|
|
|
import java.awt.event.ActionListener;
|
|
|
|
import java.awt.event.KeyEvent;
|
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Created by sagi on 2/20/16.
|
|
|
|
*/
|
2016-03-18 22:33:29 +00:00
|
|
|
public abstract class Level extends Scene {
|
2016-02-27 20:45:32 +00:00
|
|
|
protected Vector<Player> players;
|
|
|
|
protected int p1Speed = 10;
|
2016-03-12 10:24:42 +00:00
|
|
|
protected Vector<Missile> p1Missiles, p2Missiles, enemyMissiles;
|
2016-02-27 20:45:32 +00:00
|
|
|
protected Background bg;
|
2016-03-12 10:24:42 +00:00
|
|
|
protected int[] waveDelay;
|
|
|
|
protected int currentWave;
|
2016-02-27 20:45:32 +00:00
|
|
|
protected int[] yAxisStartingAnimation;
|
|
|
|
protected int startingAnimationIndex;
|
|
|
|
protected boolean isStarted;
|
2016-03-12 10:24:42 +00:00
|
|
|
protected Vector<Wave> waves;
|
2016-02-27 20:45:32 +00:00
|
|
|
protected int numOfPlayers;
|
|
|
|
protected Map<Integer, Boolean> keys;
|
|
|
|
protected String title;
|
|
|
|
protected JLabel stageTitle;
|
2016-03-12 10:24:42 +00:00
|
|
|
protected long lastWaveTime;
|
2016-02-27 20:45:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
public Level(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay){
|
2016-02-27 20:45:32 +00:00
|
|
|
super(width, height, engine);
|
|
|
|
players = new Vector<>();
|
2016-03-12 10:24:42 +00:00
|
|
|
p1Missiles = new Vector<>();
|
|
|
|
p2Missiles = new Vector<>();
|
|
|
|
enemyMissiles = new Vector<>();
|
|
|
|
this.waveDelay = waveDelay;
|
|
|
|
this.lastWaveTime = System.currentTimeMillis();
|
|
|
|
this.currentWave = 0;
|
|
|
|
this.waves = new Vector<>();
|
2016-02-27 20:45:32 +00:00
|
|
|
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) {
|
2016-03-12 10:24:42 +00:00
|
|
|
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));
|
2016-02-27 20:45:32 +00:00
|
|
|
}else{
|
2016-03-12 10:24:42 +00:00
|
|
|
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));
|
2016-02-27 20:45:32 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
setupKeys();
|
|
|
|
Utils.playSound("jetSound.wav");
|
|
|
|
}
|
|
|
|
|
|
|
|
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();
|
2016-03-12 10:24:42 +00:00
|
|
|
Vector <Wave> wavesToRemove = new Vector<Wave>();
|
|
|
|
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
if(currentWave < waveDelay.length && now - lastWaveTime >= waveDelay[currentWave] * 1000){
|
2016-03-18 22:33:29 +00:00
|
|
|
launchWave(now);
|
2016-03-12 10:24:42 +00:00
|
|
|
}
|
2016-02-27 20:45:32 +00:00
|
|
|
|
|
|
|
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{
|
|
|
|
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
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();
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
for(int i = 0 ; i < waves.size() ; i++){
|
|
|
|
waves.get(i).update();
|
|
|
|
if(waves.get(i).isWaveOver()) {
|
|
|
|
wavesToRemove.add(waves.get(i));
|
|
|
|
}
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
2016-03-12 10:24:42 +00:00
|
|
|
waves.removeAll(wavesToRemove);
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
2016-03-12 10:24:42 +00:00
|
|
|
checkCollision();
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
|
|
|
|
2016-03-18 22:33:29 +00:00
|
|
|
protected abstract void launchWave(long time);
|
|
|
|
|
2016-02-27 20:45:32 +00:00
|
|
|
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()){
|
2016-03-12 10:24:42 +00:00
|
|
|
p1Missiles.add(new Missile(players.get(0).getCenterX() - 15, (int)players.get(0).getLocY(), players.get(0).getAcceleration() + 3, "P1Laser.png", 4));
|
2016-02-27 20:45:32 +00:00
|
|
|
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()){
|
2016-03-12 10:24:42 +00:00
|
|
|
p2Missiles.add(new Missile(players.get(1).getCenterX() - 15, (int)players.get(1).getLocY(), players.get(1).getAcceleration() + 3, "P1Laser.png", 4));
|
2016-02-27 20:45:32 +00:00
|
|
|
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();
|
2016-03-19 00:01:49 +00:00
|
|
|
Font f = engine.getGameFont();
|
|
|
|
|
2016-02-27 20:45:32 +00:00
|
|
|
if(!isStarted){
|
|
|
|
if(f == null) {
|
|
|
|
f = g.getFont();
|
|
|
|
}
|
2016-03-12 10:24:42 +00:00
|
|
|
f = f.deriveFont(60F);
|
|
|
|
g.setColor(Color.DARK_GRAY);
|
|
|
|
g.setFont(f);
|
2016-02-27 20:45:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
// 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);
|
2016-03-19 00:01:49 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//print score
|
|
|
|
f = f.deriveFont(15F);
|
|
|
|
g.setFont(f);
|
|
|
|
|
|
|
|
//print life bar
|
|
|
|
for(int i=0; i<players.size(); i++){
|
|
|
|
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));
|
|
|
|
|
|
|
|
g.drawRect(15,35*(i+1)+10,100,10);
|
|
|
|
g.setColor(Color.GREEN);
|
|
|
|
|
|
|
|
if (i==0 && engine.getP1Health()<=30)
|
|
|
|
g.setColor(Color.RED);
|
|
|
|
else if( i==1 && engine.getP2Health()<=30)
|
|
|
|
g.setColor(Color.RED);
|
|
|
|
|
|
|
|
g.fillRect(15,35*(i+1)+10,((i == 0) ? engine.getP1Health() : engine.getP2Health()),10);
|
|
|
|
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-03-19 00:01:49 +00:00
|
|
|
//print credits
|
|
|
|
g.setColor(Color.WHITE);
|
|
|
|
g.drawString("Credits: "+ engine.getCredits(), stageWidth/2, 30);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
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);
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
|
|
|
for(int i = 0 ; i < players.size() ; i++){
|
|
|
|
players.get(i).drawSprite(g,p);
|
|
|
|
}
|
2016-03-12 10:24:42 +00:00
|
|
|
for(int i = 0 ; i < waves.size() ; i++){
|
|
|
|
waves.get(i).render(g,p);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void checkCollision() {
|
|
|
|
Vector<Missile> p1MTR, p2MTR, eMTR;
|
|
|
|
eMTR = new Vector<>();
|
|
|
|
p1MTR = new Vector<>();
|
|
|
|
p2MTR = new Vector<>();
|
2016-03-19 00:01:49 +00:00
|
|
|
|
|
|
|
//for each player check collisions
|
2016-03-12 10:24:42 +00:00
|
|
|
for (int i = 0; i < players.size(); i++) {
|
2016-03-19 00:01:49 +00:00
|
|
|
|
|
|
|
//player vs. enemy missile
|
2016-03-12 10:24:42 +00:00
|
|
|
for (int j = 0; j < enemyMissiles.size(); j++) {
|
|
|
|
if(CollisionUtil.collidesWith(players.get(i),enemyMissiles.get(j))){
|
2016-03-19 00:01:49 +00:00
|
|
|
if(players.get(i).isMortal())
|
|
|
|
engine.setPlayerHealth(i, -10);
|
2016-03-12 10:24:42 +00:00
|
|
|
eMTR.add(enemyMissiles.get(j));
|
|
|
|
System.out.println("Hit Missile");
|
|
|
|
}
|
|
|
|
}
|
2016-03-19 00:01:49 +00:00
|
|
|
|
|
|
|
//player vs. enemy ship
|
2016-03-12 10:24:42 +00:00
|
|
|
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))) {
|
2016-03-19 00:01:49 +00:00
|
|
|
if(players.get(i).isMortal())
|
|
|
|
engine.setPlayerHealth(i, -10);
|
2016-03-12 10:24:42 +00:00
|
|
|
waves.get(j).enemyHit(waves.get(j).getEnemies().get(k));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-02-27 20:45:32 +00:00
|
|
|
|
2016-03-19 00:01:49 +00:00
|
|
|
//player 1 missile vs. enemy
|
2016-03-12 10:24:42 +00:00
|
|
|
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))) {
|
2016-03-19 00:01:49 +00:00
|
|
|
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);
|
2016-03-12 10:24:42 +00:00
|
|
|
p1MTR.add(p1Missiles.get(m));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-19 00:01:49 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//player 1 missile vs. enemy
|
|
|
|
else {
|
2016-03-12 10:24:42 +00:00
|
|
|
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))) {
|
2016-03-19 00:01:49 +00:00
|
|
|
|
|
|
|
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);
|
2016-03-12 10:24:42 +00:00
|
|
|
p2MTR.add(p2Missiles.get(m));
|
2016-03-19 00:01:49 +00:00
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
2016-03-12 10:24:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-19 00:01:49 +00:00
|
|
|
|
2016-03-12 10:24:42 +00:00
|
|
|
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));
|
2016-02-27 20:45:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void keyTyped(KeyEvent keyEvent) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void keyPressed(KeyEvent keyEvent) {
|
|
|
|
if(isStarted)
|
|
|
|
keys.put(keyEvent.getKeyCode(), true);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void keyReleased(KeyEvent keyEvent) {
|
|
|
|
if(isStarted)
|
|
|
|
keys.put(keyEvent.getKeyCode(), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|