|
|
|
|
package Main;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.newdawn.slick.Animation;
|
|
|
|
|
import org.newdawn.slick.Color;
|
|
|
|
|
import org.newdawn.slick.GameContainer;
|
|
|
|
|
import org.newdawn.slick.Graphics;
|
|
|
|
|
import org.newdawn.slick.Image;
|
|
|
|
|
import org.newdawn.slick.Input;
|
|
|
|
|
import org.newdawn.slick.SlickException;
|
|
|
|
|
import org.newdawn.slick.SpriteSheet;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class Level{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Image cyberg,title,paused,instructionScreen,missionScreen,alert,clearedLevel;
|
|
|
|
|
private Invader invader;
|
|
|
|
|
private Player protector;
|
|
|
|
|
private UserInterface ui;
|
|
|
|
|
private State state;
|
|
|
|
|
|
|
|
|
|
//Levelbezeichnungen
|
|
|
|
|
private String[] level = {"-1- First Contact |", "-2- Two Paths to Core |", "-3- Cyberlabyrinth", "-4-", " -5- Final Fight |"};
|
|
|
|
|
|
|
|
|
|
//Game Over Screen Erstellung
|
|
|
|
|
private Image game_over_screen0,game_over_screen1,game_over_screen2,game_over_screen3,game_over_screen4,game_over_screen5,game_over_screen6,game_over_screen7,game_over_screen8;
|
|
|
|
|
Image[] game_over_screens = { game_over_screen0,
|
|
|
|
|
game_over_screen1,
|
|
|
|
|
game_over_screen2,
|
|
|
|
|
game_over_screen3,
|
|
|
|
|
game_over_screen4,
|
|
|
|
|
game_over_screen5,
|
|
|
|
|
game_over_screen6,
|
|
|
|
|
game_over_screen7,
|
|
|
|
|
game_over_screen8};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int selectedString,currentLevel;
|
|
|
|
|
SpriteSheet shock,arrows_sheet,walk_demo_sheet,virus_demo_sheet,rider_demo_sheet,shock_demo_sheet;
|
|
|
|
|
Animation selected,arrows,walk_demo,game_over,virus_demo,rider_demo,shock_demo;
|
|
|
|
|
Panel panel;
|
|
|
|
|
|
|
|
|
|
float waiter;//Ingame Zeit
|
|
|
|
|
|
|
|
|
|
boolean changedDirection = false;//Indikator f<>r Richtungswechsel
|
|
|
|
|
|
|
|
|
|
public void init(GameContainer gc, Invader invader, Player player, UserInterface ui, State gameState, Panel panel, float waiter) throws SlickException{
|
|
|
|
|
|
|
|
|
|
game_over_screen0 = new Image("Main/cybergrid.png");
|
|
|
|
|
game_over_screen1 = new Image("Main/game_Over1.png");
|
|
|
|
|
game_over_screen2 = new Image("Main/game_Over2.png");
|
|
|
|
|
game_over_screen3 = new Image("Main/game_Over3.png");
|
|
|
|
|
game_over_screen4 = new Image("Main/game_Over4.png");
|
|
|
|
|
game_over_screen5 = new Image("Main/game_Over5.png");
|
|
|
|
|
game_over_screen6 = new Image("Main/game_Over6.png");
|
|
|
|
|
game_over_screen7 = new Image("Main/game_Over7.png");
|
|
|
|
|
game_over_screen8 = new Image("Main/game_Over8.png");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.waiter = waiter;
|
|
|
|
|
this.panel = panel;
|
|
|
|
|
this.state = gameState;
|
|
|
|
|
this.invader = invader;
|
|
|
|
|
this.protector = player;
|
|
|
|
|
this.ui = ui;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alert = new Image("Main/Hack_Alert.png");
|
|
|
|
|
clearedLevel = new Image("Main/level_cleared_screen.png");
|
|
|
|
|
instructionScreen = new Image("Main/key_instructions.png");
|
|
|
|
|
missionScreen = new Image("Main/mission.png");
|
|
|
|
|
arrows_sheet = new SpriteSheet("Main/arrows_sheet.png" ,101, 101);
|
|
|
|
|
walk_demo_sheet = new SpriteSheet("Main/robot_sheet_good.png",50,100);
|
|
|
|
|
virus_demo_sheet = new SpriteSheet("Main/Virus_sheet.png",72,72);
|
|
|
|
|
rider_demo_sheet = new SpriteSheet("Main/rider.png",75,75);
|
|
|
|
|
shock_demo_sheet = new SpriteSheet("Main/shock.png",75,45);
|
|
|
|
|
|
|
|
|
|
arrows = new Animation(arrows_sheet,0,0,3,2,true,200, true);
|
|
|
|
|
walk_demo = new Animation(walk_demo_sheet,0,0,5,2,true,200,true);
|
|
|
|
|
virus_demo = new Animation(virus_demo_sheet,2,1,3,4,true,200,true);
|
|
|
|
|
rider_demo = new Animation(rider_demo_sheet,0,0,2,0,true,200,true);
|
|
|
|
|
shock_demo = new Animation(shock_demo_sheet,0,0,3,0,true,200,true);
|
|
|
|
|
|
|
|
|
|
selectedString = 0;//Default Auswahl im Menu
|
|
|
|
|
currentLevel = 1;//Initial Level zu Begin
|
|
|
|
|
|
|
|
|
|
cyberg = new Image("Main/cybergrid.png");
|
|
|
|
|
title = new Image("Main/titel.png");
|
|
|
|
|
paused = new Image("Main/paused_menu.png");
|
|
|
|
|
shock = new SpriteSheet("Main/shock.png", 75, 45);
|
|
|
|
|
selected = new Animation(shock,0,0,3,0,true,250,true);
|
|
|
|
|
|
|
|
|
|
protector.init(gc,gameState,100);//Roboter Initialisierung an YPosition 100
|
|
|
|
|
invader.init(gc,gameState);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void render (GameContainer gc, Graphics g)throws SlickException{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Rendering abh<62>ngig von State
|
|
|
|
|
switch(state.currentState){
|
|
|
|
|
|
|
|
|
|
case "win" ://Sieges Screen
|
|
|
|
|
g.drawImage(clearedLevel, 0, 0);
|
|
|
|
|
g.setColor(Color.cyan);
|
|
|
|
|
g.drawLine(0, 100, 800, 100);
|
|
|
|
|
break;
|
|
|
|
|
//game over Pseudo-Animation
|
|
|
|
|
case "gameOver":
|
|
|
|
|
if(waiter > 5)
|
|
|
|
|
g.drawImage(game_over_screen8, 0, 0);
|
|
|
|
|
else if ( waiter > 4.2)
|
|
|
|
|
g.drawImage(game_over_screen7, 0, 0);
|
|
|
|
|
else if(waiter > 3.8)
|
|
|
|
|
g.drawImage(game_over_screen6, 0, 0);
|
|
|
|
|
else if(waiter > 3.2)
|
|
|
|
|
g.drawImage(game_over_screen5, 0, 0);
|
|
|
|
|
else if(waiter > 2.8)
|
|
|
|
|
g.drawImage(game_over_screen4, 0, 0);
|
|
|
|
|
else if(waiter > 2.2)
|
|
|
|
|
g.drawImage(game_over_screen3, 0, 0);
|
|
|
|
|
else if(waiter > 1.8)
|
|
|
|
|
g.drawImage(game_over_screen2, 0, 0);
|
|
|
|
|
else if(waiter > 1.2)
|
|
|
|
|
g.drawImage(game_over_screen1, 0, 0);
|
|
|
|
|
else
|
|
|
|
|
g.drawImage(game_over_screen0, 0, 0);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
//Steuerungs Screens
|
|
|
|
|
case "controlInstructions":
|
|
|
|
|
if(waiter < 5){
|
|
|
|
|
g.drawImage(instructionScreen, 0, 0);
|
|
|
|
|
arrows.draw(150, 200);
|
|
|
|
|
walk_demo.draw(550, 200);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if(waiter >6){//"Missions screen"
|
|
|
|
|
g.drawImage(missionScreen, 0, 0);
|
|
|
|
|
walk_demo.draw(550, 200);
|
|
|
|
|
virus_demo.draw(550, 300);
|
|
|
|
|
rider_demo.draw(550, 430);
|
|
|
|
|
shock_demo.draw(550, 460);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "level_intro":
|
|
|
|
|
//Level intro je nach currentLevel
|
|
|
|
|
switch(currentLevel){
|
|
|
|
|
case 1:alert.draw(0, 0);
|
|
|
|
|
g.setColor(Color.red);
|
|
|
|
|
g.drawLine(0, 200, 800, 200);
|
|
|
|
|
g.drawLine(0, 400, 800, 400);
|
|
|
|
|
g.setColor(Color.white);
|
|
|
|
|
g.drawString("1", 300, 330);
|
|
|
|
|
g.drawString("-First Contact-", 330, 330);
|
|
|
|
|
break;
|
|
|
|
|
case 2:alert.draw(0, 0);
|
|
|
|
|
g.setColor(Color.red);
|
|
|
|
|
g.drawLine(0, 200, 800, 200);
|
|
|
|
|
g.drawLine(0, 400, 800, 400);
|
|
|
|
|
g.setColor(Color.white);
|
|
|
|
|
g.drawString("2", 300, 330);
|
|
|
|
|
g.drawString("-Two Paths to the Core-", 330, 330);
|
|
|
|
|
break;
|
|
|
|
|
case 3:alert.draw(0, 0);
|
|
|
|
|
g.setColor(Color.red);
|
|
|
|
|
g.drawLine(0, 200, 800, 200);
|
|
|
|
|
g.drawLine(0, 400, 800, 400);
|
|
|
|
|
g.setColor(Color.white);
|
|
|
|
|
g.drawString("3", 300, 330);
|
|
|
|
|
g.drawString("-The Cyberlabyrinth-", 330, 330);
|
|
|
|
|
break;
|
|
|
|
|
case 4:alert.draw(0, 0);
|
|
|
|
|
g.setColor(Color.red);
|
|
|
|
|
g.drawLine(0, 200, 800, 200);
|
|
|
|
|
g.drawLine(0, 400, 800, 400);
|
|
|
|
|
g.setColor(Color.white);
|
|
|
|
|
g.drawString("4", 300, 330);
|
|
|
|
|
g.drawString("-The prelast level-", 330, 330);
|
|
|
|
|
break;
|
|
|
|
|
case 5:alert.draw(0, 0);
|
|
|
|
|
g.setColor(Color.red);
|
|
|
|
|
g.drawLine(0, 200, 800, 200);
|
|
|
|
|
g.drawLine(0, 400, 800, 400);
|
|
|
|
|
g.setColor(Color.white);
|
|
|
|
|
g.drawString("5", 300, 330);
|
|
|
|
|
g.drawString("-Final Fight-", 330, 330);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "titel":
|
|
|
|
|
g.drawImage(title, 0, 0);break;
|
|
|
|
|
case"paused":
|
|
|
|
|
cyberg.draw(0, 0, 800, 600);
|
|
|
|
|
panel.render(gc,g);
|
|
|
|
|
protector.render(gc, g);
|
|
|
|
|
invader.render(gc, g);
|
|
|
|
|
|
|
|
|
|
g.setColor(Color.magenta);
|
|
|
|
|
//Pause Men<65> Tags
|
|
|
|
|
paused.draw(225, 250);
|
|
|
|
|
g.drawString("Resume Game", 425, 290);
|
|
|
|
|
g.drawString("Options(Not Implemented)", 425, 320);
|
|
|
|
|
g.drawString("Exit Game", 425, 350);
|
|
|
|
|
//Name des Levels in der UI
|
|
|
|
|
switch(currentLevel){
|
|
|
|
|
case 1:g.drawString(level[0], 30, 555);break;
|
|
|
|
|
case 2:g.drawString(level[1], 30, 555);break;
|
|
|
|
|
case 3:g.drawString(level[2], 30, 555);break;
|
|
|
|
|
case 4:g.drawString(level[3], 30, 555);break;
|
|
|
|
|
case 5:g.drawString(level[4], 30, 555);break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch(selectedString){
|
|
|
|
|
case 0: selected.draw(325, 280);break;
|
|
|
|
|
case 1: selected.draw(325, 310);break;
|
|
|
|
|
case 2: selected.draw(325, 340);break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case"start":
|
|
|
|
|
cyberg.draw(0, 0, 800, 600);
|
|
|
|
|
panel.render(gc,g);
|
|
|
|
|
protector.render(gc, g);
|
|
|
|
|
invader.render(gc, g);
|
|
|
|
|
|
|
|
|
|
g.setColor(Color.red);
|
|
|
|
|
g.drawLine(0, gc.getHeight()-50, 800, gc.getHeight()-50);//Systemlebenslinie
|
|
|
|
|
g.setColor(Color.magenta);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch(currentLevel){
|
|
|
|
|
case 1:g.drawString(level[0], 30, 555);break;
|
|
|
|
|
case 2:g.drawString(level[1], 30, 555);break;
|
|
|
|
|
case 3:g.drawString(level[2], 30, 555);break;
|
|
|
|
|
case 4:g.drawString(level[3], 30, 555);break;
|
|
|
|
|
case 5:g.drawString(level[4], 30, 555);break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void update (GameContainer gc,float _delta)throws SlickException{
|
|
|
|
|
this.waiter += _delta;//Ingame Zeit
|
|
|
|
|
|
|
|
|
|
switch(state.currentState){
|
|
|
|
|
|
|
|
|
|
case "paused":
|
|
|
|
|
//Kontrolle im Men<65>
|
|
|
|
|
if(gc.getInput().isKeyPressed(Input.KEY_UP)&& selectedString >0)
|
|
|
|
|
selectedString--;
|
|
|
|
|
if(gc.getInput().isKeyPressed(Input.KEY_DOWN)&& selectedString <2)
|
|
|
|
|
selectedString++;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "start":
|
|
|
|
|
protector.update(gc, _delta);
|
|
|
|
|
invader.update(gc, _delta);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!invader.isParalized&& invader.para_timer >=5 && currentLevel == 5){
|
|
|
|
|
//invader movement in final level//
|
|
|
|
|
if(invader.riderX+75 > panel.xPos+panel.xSize*15 && changedDirection == false){
|
|
|
|
|
invader.flightSpdX *= -1;
|
|
|
|
|
invader.fly_right = false;
|
|
|
|
|
changedDirection = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(invader.riderX -75 < panel.xPos+panel.xSize*1 && changedDirection == false){
|
|
|
|
|
invader.flightSpdX *= -1;
|
|
|
|
|
invader.fly_right = true;
|
|
|
|
|
changedDirection = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(invader.riderX < panel.xPos+panel.xSize*9 &&
|
|
|
|
|
invader.riderX > panel.xPos+panel.xSize*6 && changedDirection == true)
|
|
|
|
|
changedDirection = false;
|
|
|
|
|
|
|
|
|
|
//Ball Bewegung im letzten level
|
|
|
|
|
if(invader.ball.xPos-36 > panel.xPos+panel.xSize*15)
|
|
|
|
|
invader.ball.collisionManager("x_inverted");
|
|
|
|
|
|
|
|
|
|
if(invader.ball.xPos+36 < panel.xPos+panel.xSize*1)
|
|
|
|
|
invader.ball.collisionManager("x_inverted");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Level ende und wechsel zum n<>chsten Level
|
|
|
|
|
if(panel.xPos <= -4350 && protector.isLanded){
|
|
|
|
|
currentLevel++;
|
|
|
|
|
waiter = 0;
|
|
|
|
|
state.stateId = 5;
|
|
|
|
|
panel.init(gc, state, currentLevel);
|
|
|
|
|
protector.init(gc, state, -100);
|
|
|
|
|
invader.init(gc, state);
|
|
|
|
|
ui.sbar_width = 0;
|
|
|
|
|
invader.isParalized = false;
|
|
|
|
|
panel.xPos = 350;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Roboter - Panel kollision
|
|
|
|
|
for(int i = 1; i< panel.collisionarea.length;i++){
|
|
|
|
|
if(panel.collisionarea[i].intersects(protector.getCollisionarea())&&!protector.hasFloorContact){
|
|
|
|
|
protector.ySpd = 0;
|
|
|
|
|
protector.setFloorContact(true);
|
|
|
|
|
protector.isLanded = true;
|
|
|
|
|
|
|
|
|
|
} else
|
|
|
|
|
protector.hasFloorContact = false;
|
|
|
|
|
|
|
|
|
|
//einsetzen der "Gravitation"
|
|
|
|
|
if(panel.collisionarea[i].intersects(protector.getCollisionarea())&& !protector.hasFloorContact){
|
|
|
|
|
|
|
|
|
|
protector.ySpd *=0;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Roboter Sprung
|
|
|
|
|
if(gc.getInput().isKeyDown(Input.KEY_UP)&& protector.isLanded)
|
|
|
|
|
{
|
|
|
|
|
if(protector.isRunningRight){
|
|
|
|
|
|
|
|
|
|
protector.move = 3;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if(protector.isRunningLeft){
|
|
|
|
|
|
|
|
|
|
protector.move = 4;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
protector.move = 0;
|
|
|
|
|
protector.hasFloorContact = false;
|
|
|
|
|
protector.ySpd = -400;
|
|
|
|
|
protector.isLanded = false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Ball fliegt oben aus dem Screen
|
|
|
|
|
if(invader.ball.yPos < 0&& !invader.ball.ballIsKilled){
|
|
|
|
|
invader.ball.killBall(gc);
|
|
|
|
|
protector.ballhit =false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//Kollision Ball - Hacker
|
|
|
|
|
if(invader.ball.yPos < invader.riderY + 75 &&
|
|
|
|
|
invader.ball.yPos > invader.riderY &&
|
|
|
|
|
invader.ball.xPos < invader.riderX + 75 &&
|
|
|
|
|
invader.ball.xPos > invader.riderX ){
|
|
|
|
|
invader.ball.killBall(gc);
|
|
|
|
|
ui.sbar_width += 20;
|
|
|
|
|
protector.ballhit=false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Disconnected Erzeugung
|
|
|
|
|
if(ui.sbar_width >= 100 && !invader.isParalized){
|
|
|
|
|
invader.isParalized = true;
|
|
|
|
|
invader.paralized();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//ReConect des Hackers
|
|
|
|
|
if(invader.para_timer >= 5 && ui.sbar_width >= 100){
|
|
|
|
|
ui.sbar_width -=100;
|
|
|
|
|
invader.isParalized = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Ball Kollidiert mit Systemlebenslinie
|
|
|
|
|
if( (invader.ball.yPos >= gc.getHeight()-50)){
|
|
|
|
|
|
|
|
|
|
invader.ball.killBall(gc);
|
|
|
|
|
protector.ballhit=false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(ui.dbar_width >0)
|
|
|
|
|
ui.dbar_width -= 20;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Ball - Roboter Kollision
|
|
|
|
|
if(invader.ball.yPos >= protector.yPos -50 &&
|
|
|
|
|
invader.ball.xPos >= protector.xPos -25&&
|
|
|
|
|
invader.ball.xPos <= protector.xPos + 25&&
|
|
|
|
|
invader.ball.yPos <= protector.yPos +50&&
|
|
|
|
|
!protector.ballhit){
|
|
|
|
|
|
|
|
|
|
invader.ball.collisionManager("y_inverted");
|
|
|
|
|
protector.ballhit= true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//roboter rechtsbewegung
|
|
|
|
|
if(gc.getInput().isKeyDown(Input.KEY_RIGHT)){
|
|
|
|
|
if(protector.isLanded)protector.move = 1;
|
|
|
|
|
else
|
|
|
|
|
protector.move = 3;
|
|
|
|
|
panel.xSpd=-200;
|
|
|
|
|
invader.ball.xPos-=3;
|
|
|
|
|
if(!invader.isParalized)
|
|
|
|
|
invader.riderX -=3;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
//roboter Linksbewegung
|
|
|
|
|
if(gc.getInput().isKeyDown(Input.KEY_LEFT)){
|
|
|
|
|
if(protector.isLanded)protector.move = 2;
|
|
|
|
|
else
|
|
|
|
|
protector.move = 4;
|
|
|
|
|
panel.xSpd=200;
|
|
|
|
|
invader.ball.xPos+=3;
|
|
|
|
|
if(!invader.isParalized)
|
|
|
|
|
invader.riderX +=3;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
{//roboter stand bewegung
|
|
|
|
|
protector.move = 0;
|
|
|
|
|
panel.xSpd=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//roboter fliegt unten durch den Screen
|
|
|
|
|
if(protector.yPos > 800){
|
|
|
|
|
protector.init(gc, state,-100 );
|
|
|
|
|
panel.xPos = 350;
|
|
|
|
|
invader.init(gc, state);
|
|
|
|
|
invader.ball.killBall(gc);
|
|
|
|
|
ui.sbar_width = 0;
|
|
|
|
|
ui.dbar_width -=20 ;
|
|
|
|
|
invader.isParalized = false;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|