|
@@ -3,110 +3,57 @@ package model.state;
|
|
|
import java.awt.Color;
|
|
import java.awt.Color;
|
|
|
import java.awt.Graphics2D;
|
|
import java.awt.Graphics2D;
|
|
|
import java.awt.event.KeyEvent;
|
|
import java.awt.event.KeyEvent;
|
|
|
-import java.io.File;
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
-import java.nio.file.Files;
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Collection;
|
|
|
|
|
-import java.util.ConcurrentModificationException;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
-import java.util.ListIterator;
|
|
|
|
|
|
|
|
|
|
import model.GameStateManager;
|
|
import model.GameStateManager;
|
|
|
import model.InfoPanel;
|
|
import model.InfoPanel;
|
|
|
-import model.levels.Level;
|
|
|
|
|
|
|
+import model.NetworkConnection;
|
|
|
import model.objects.Ball;
|
|
import model.objects.Ball;
|
|
|
import model.objects.Player;
|
|
import model.objects.Player;
|
|
|
import model.objects.ShootingLine;
|
|
import model.objects.ShootingLine;
|
|
|
import resources.image.Images;
|
|
import resources.image.Images;
|
|
|
import resources.image.Images.ImageType;
|
|
import resources.image.Images.ImageType;
|
|
|
-import server.Main;
|
|
|
|
|
|
|
|
|
|
public class PlayState extends State{
|
|
public class PlayState extends State{
|
|
|
|
|
|
|
|
- private Player player;
|
|
|
|
|
|
|
+ private Player player1;
|
|
|
private Player player2;
|
|
private Player player2;
|
|
|
- private ShootingLine line;
|
|
|
|
|
|
|
+ private ShootingLine line1;
|
|
|
|
|
+ private ShootingLine line2;
|
|
|
private ArrayList<Ball> balls;
|
|
private ArrayList<Ball> balls;
|
|
|
- private ArrayList<Level> levels;
|
|
|
|
|
private InfoPanel infopanel;
|
|
private InfoPanel infopanel;
|
|
|
- private int direction;
|
|
|
|
|
-
|
|
|
|
|
- private int currentlevel;
|
|
|
|
|
- private int timeleft;
|
|
|
|
|
- private long lasttime;
|
|
|
|
|
|
|
+ private NetworkConnection nwc;
|
|
|
|
|
+ private int timeleftpercent, direction, shoot;
|
|
|
|
|
|
|
|
public PlayState(GameStateManager gsm) {
|
|
public PlayState(GameStateManager gsm) {
|
|
|
super("play", gsm);
|
|
super("play", gsm);
|
|
|
- player = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "Janco");
|
|
|
|
|
- player2 = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "Kenneth");
|
|
|
|
|
- infopanel = new InfoPanel(player, player2, this);
|
|
|
|
|
|
|
+ player1 = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "");
|
|
|
|
|
+ player2 = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "");
|
|
|
|
|
+ infopanel = new InfoPanel(this);
|
|
|
balls = new ArrayList<Ball>();
|
|
balls = new ArrayList<Ball>();
|
|
|
- readLevelsFromFiles();
|
|
|
|
|
- playLevel(levels.get(currentlevel));
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- /* LEVEL FILE READING, PARSING AND PLAYING */
|
|
|
|
|
-
|
|
|
|
|
- private void readLevelsFromFiles(){
|
|
|
|
|
- levels = new ArrayList<>();
|
|
|
|
|
- File root = new File(Main.class.getResource("/model/levels").getPath());
|
|
|
|
|
- File[] list = root.listFiles();
|
|
|
|
|
- for ( File f : list ) {
|
|
|
|
|
- if(f.isFile() && f.getName().endsWith(".bb")){
|
|
|
|
|
- try {
|
|
|
|
|
- levels.add(readLevel(Files.readAllLines(f.toPath())));
|
|
|
|
|
- }catch (IOException | IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
|
|
|
|
|
- System.out.println("Level file corrputed");
|
|
|
|
|
- e.printStackTrace();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private Level readLevel(List<String> levelfile) throws NumberFormatException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{
|
|
|
|
|
- Level level = new Level();
|
|
|
|
|
- if(levelfile.size() == 3){
|
|
|
|
|
- String[] ballsstrings = levelfile.get(0).split("\\|"); //split all the balls
|
|
|
|
|
- for(String ball:ballsstrings){
|
|
|
|
|
- String[]ballstring = ball.split(",");
|
|
|
|
|
- if(ballstring.length == 7){
|
|
|
|
|
- level.addBall(new Ball(
|
|
|
|
|
- Integer.parseInt(ballstring[0]),
|
|
|
|
|
- Integer.parseInt(ballstring[1]),
|
|
|
|
|
- (Color)Color.class.getField(ballstring[2]).get(null),
|
|
|
|
|
- Integer.parseInt(ballstring[3]),
|
|
|
|
|
- Integer.parseInt(ballstring[4]),
|
|
|
|
|
- Integer.parseInt(ballstring[5]),
|
|
|
|
|
- Double.parseDouble(ballstring[6])
|
|
|
|
|
- )
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- String[] powerupsstring = levelfile.get(1).split("\\|");
|
|
|
|
|
-
|
|
|
|
|
- level.setTime(Integer.parseInt(levelfile.get(2)));
|
|
|
|
|
- }
|
|
|
|
|
- return level;
|
|
|
|
|
|
|
+ /* NETWORK CONTROL */
|
|
|
|
|
+ public void newMatch(String p1, String p2){
|
|
|
|
|
+ player1 = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, p1);
|
|
|
|
|
+ player2 = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, p2);
|
|
|
|
|
+ infopanel = new InfoPanel(this);
|
|
|
|
|
+ balls = new ArrayList<Ball>();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public void playLevel(Level level){
|
|
|
|
|
- balls.clear();
|
|
|
|
|
- for(Ball b:level.getStartballs()){
|
|
|
|
|
- balls.add(b.clone());
|
|
|
|
|
- }
|
|
|
|
|
- timeleft = level.getTime();
|
|
|
|
|
- player.reset();
|
|
|
|
|
- line=null;
|
|
|
|
|
- lasttime = System.currentTimeMillis();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
/* INIT AND EXIT */
|
|
/* INIT AND EXIT */
|
|
|
@Override
|
|
@Override
|
|
|
public void init() {
|
|
public void init() {
|
|
|
- playLevel(levels.get(0));
|
|
|
|
|
|
|
+ nwc = new NetworkConnection(this);
|
|
|
|
|
+ try {
|
|
|
|
|
+ nwc.connect("Janco");
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -115,89 +62,78 @@ public class PlayState extends State{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
- /* UPDATE */
|
|
|
|
|
|
|
+ /* UPDATE AND PAINTING*/
|
|
|
|
|
+ public void updatePlayerInfo(int x, int y, int health, int speed, int score, Player player){
|
|
|
|
|
+ player.setX(x);
|
|
|
|
|
+ player.setY(y);
|
|
|
|
|
+ player.setHealth(health);
|
|
|
|
|
+ player.setScore(score);
|
|
|
|
|
+ }
|
|
|
|
|
+ public void updateLines(int l1x, int l1y, int l1h, int l2x, int l2y, int l2h){
|
|
|
|
|
+ if(line1 == null)
|
|
|
|
|
+ line1 = new ShootingLine(l1x, l1y);
|
|
|
|
|
+ line1.setLength(l1h);
|
|
|
|
|
+ line1.setStartx(l1x);
|
|
|
|
|
+ line1.setStarty(l1y);
|
|
|
|
|
+ if(line2 == null)
|
|
|
|
|
+ line2 = new ShootingLine(l2x, l2y);
|
|
|
|
|
+ line2.setLength(l2h);
|
|
|
|
|
+ line2.setStartx(l2x);
|
|
|
|
|
+ line2.setStarty(l2y);
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public void update() {
|
|
public void update() {
|
|
|
- if(direction == 1)
|
|
|
|
|
- player.walkRight();
|
|
|
|
|
- else if(direction == -1)
|
|
|
|
|
- player.walkLeft();
|
|
|
|
|
- player.update();
|
|
|
|
|
- if(line != null){
|
|
|
|
|
- line.setLength(line.getLength()+1);
|
|
|
|
|
- if(line.getMaxHeight() < 0){ //Line hit the ceiling, so "remove" it
|
|
|
|
|
- line = null;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- //Collision detection
|
|
|
|
|
- try{
|
|
|
|
|
- ListIterator<Ball> b = balls.listIterator();
|
|
|
|
|
- while(b.hasNext()){
|
|
|
|
|
- Ball bal = b.next();
|
|
|
|
|
- if(line != null && bal.hitLine(line)){ // Collision between line and ball
|
|
|
|
|
- line = null;
|
|
|
|
|
- b.remove();
|
|
|
|
|
- b.add(new Ball(bal.getSize()-1, (int) Math.max(bal.getBounceHeight()/1.5, player.getHeigth() +5), bal.getColor(), bal.getX(), bal.getY(), -1, Math.abs(bal.getYSpeed())*-1));
|
|
|
|
|
- b.add(new Ball(bal.getSize()-1, (int) Math.max(bal.getBounceHeight()/1.5, player.getHeigth() +5), bal.getColor(), bal.getX(), bal.getY(), 1, Math.abs(bal.getYSpeed())*-1));
|
|
|
|
|
- }else if(bal.hitPlayer(player)){ // Collision between player and ball
|
|
|
|
|
- player.setHealth(player.getHealth()-1);
|
|
|
|
|
- playLevel(getCurrentLevel());
|
|
|
|
|
- }else if(bal.getSize() <= 0 ){ // Remove ball from arraylist when size is 0 (not visible)
|
|
|
|
|
- b.remove();
|
|
|
|
|
- }else{
|
|
|
|
|
- bal.update();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }catch(ConcurrentModificationException e){
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
- timeleft -= (System.currentTimeMillis() - lasttime);
|
|
|
|
|
- if(balls.size() == 0){
|
|
|
|
|
- if(player.getHealth() > 0)
|
|
|
|
|
- player.setScore(player.getScore()+(timeleft/100));
|
|
|
|
|
- else
|
|
|
|
|
- player.setScore(player.getScore()+(timeleft/100)/2);
|
|
|
|
|
-
|
|
|
|
|
- if(player2.getHealth() > 0)
|
|
|
|
|
- player2.setScore(player2.getScore()+(timeleft/100));
|
|
|
|
|
- else
|
|
|
|
|
- player2.setScore(player2.getScore()+(timeleft/100)/2);
|
|
|
|
|
-
|
|
|
|
|
- if(currentlevel+1 >= levels.size())
|
|
|
|
|
- gsm.setState("end");
|
|
|
|
|
- else
|
|
|
|
|
- playLevel(levels.get(currentlevel+=1));
|
|
|
|
|
- }else if(timeleft < 0){
|
|
|
|
|
- player.setHealth(player.getHealth()-1);
|
|
|
|
|
- playLevel(getCurrentLevel());
|
|
|
|
|
- }else if(player.getHealth() <= 0) {
|
|
|
|
|
- gsm.setState("end");
|
|
|
|
|
- }
|
|
|
|
|
- lasttime = System.currentTimeMillis();
|
|
|
|
|
|
|
+ player1.update();
|
|
|
|
|
+ player2.update();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public void paint(Graphics2D g2d) {
|
|
public void paint(Graphics2D g2d) {
|
|
|
g2d.drawImage(Images.getImage(ImageType.BACKGROUND),null,0,0);
|
|
g2d.drawImage(Images.getImage(ImageType.BACKGROUND),null,0,0);
|
|
|
- if(line != null){
|
|
|
|
|
- line.paint(g2d);
|
|
|
|
|
|
|
+ if(line1 != null){
|
|
|
|
|
+ line1.paint(g2d);
|
|
|
|
|
+ }
|
|
|
|
|
+ if(line2 != null){
|
|
|
|
|
+ line2.paint(g2d);
|
|
|
}
|
|
}
|
|
|
for(Ball b: balls){
|
|
for(Ball b: balls){
|
|
|
b.paint(g2d);
|
|
b.paint(g2d);
|
|
|
}
|
|
}
|
|
|
- player.paint(g2d);
|
|
|
|
|
|
|
+ player1.paint(g2d);
|
|
|
|
|
+ player2.paint(g2d);
|
|
|
infopanel.paint(g2d);
|
|
infopanel.paint(g2d);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* GETTERS AND SETTERS */
|
|
/* GETTERS AND SETTERS */
|
|
|
|
|
|
|
|
- public Level getCurrentLevel(){
|
|
|
|
|
- return levels.get(currentlevel);
|
|
|
|
|
|
|
+ public Player getPlayer1(){
|
|
|
|
|
+ return player1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Player getPlayer2(){
|
|
|
|
|
+ return player2;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public int getTimeleft() {
|
|
|
|
|
- return timeleft;
|
|
|
|
|
|
|
+ public int getTimeleftpercent() {
|
|
|
|
|
+ return timeleftpercent;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Ball getBall(int i){
|
|
|
|
|
+ try{
|
|
|
|
|
+ return balls.get(i);
|
|
|
|
|
+ }catch(IndexOutOfBoundsException e){
|
|
|
|
|
+ balls.add(i, new Ball());
|
|
|
|
|
+ return balls.get(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public ArrayList<Ball> getBalls(){
|
|
|
|
|
+ return balls;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void setTimeleftpercent(int timeleftpercent) {
|
|
|
|
|
+ this.timeleftpercent = timeleftpercent;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* EVENTS */
|
|
/* EVENTS */
|
|
@@ -212,10 +148,10 @@ public class PlayState extends State{
|
|
|
direction = -1;
|
|
direction = -1;
|
|
|
break;
|
|
break;
|
|
|
case KeyEvent.VK_SPACE:
|
|
case KeyEvent.VK_SPACE:
|
|
|
- if(line == null){
|
|
|
|
|
- line = new ShootingLine((int)player.getX()+player.getWidth()/2, 600);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ shoot = 1;
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
|
|
+ nwc.sendInput(direction, shoot);
|
|
|
}
|
|
}
|
|
|
@Override
|
|
@Override
|
|
|
public void keyReleased(KeyEvent e) {
|
|
public void keyReleased(KeyEvent e) {
|
|
@@ -226,10 +162,14 @@ public class PlayState extends State{
|
|
|
case KeyEvent.VK_LEFT:
|
|
case KeyEvent.VK_LEFT:
|
|
|
direction = 0;
|
|
direction = 0;
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case KeyEvent.VK_SPACE:
|
|
|
|
|
+ shoot = 0;
|
|
|
|
|
+ break;
|
|
|
case KeyEvent.VK_ESCAPE:
|
|
case KeyEvent.VK_ESCAPE:
|
|
|
gsm.setState("menu");
|
|
gsm.setState("menu");
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
+ nwc.sendInput(direction, shoot);
|
|
|
}
|
|
}
|
|
|
@Override
|
|
@Override
|
|
|
public void keyTyped(KeyEvent e) {};
|
|
public void keyTyped(KeyEvent e) {};
|