|
|
@@ -3,12 +3,19 @@ package model.state;
|
|
|
import java.awt.Color;
|
|
|
import java.awt.Graphics2D;
|
|
|
import java.awt.event.KeyEvent;
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.nio.file.Files;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.ConcurrentModificationException;
|
|
|
+import java.util.List;
|
|
|
import java.util.ListIterator;
|
|
|
|
|
|
-import main.Window;
|
|
|
+import main.Main;
|
|
|
import model.GameStateManager;
|
|
|
import model.InfoPanel;
|
|
|
+import model.levels.Level;
|
|
|
import model.objects.Ball;
|
|
|
import model.objects.Player;
|
|
|
import model.objects.ShootingLine;
|
|
|
@@ -20,27 +27,101 @@ public class PlayState extends State{
|
|
|
private Player player;
|
|
|
private ShootingLine line;
|
|
|
private ArrayList<Ball> balls;
|
|
|
+ private ArrayList<Level> levels;
|
|
|
private InfoPanel infopanel;
|
|
|
private int direction;
|
|
|
|
|
|
+ private int currentlevel;
|
|
|
+ private int timeleft;
|
|
|
+ private long lasttime;
|
|
|
+
|
|
|
public PlayState(GameStateManager gsm) {
|
|
|
super("play", gsm);
|
|
|
player = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "Janco");
|
|
|
infopanel = new InfoPanel(player, player);
|
|
|
balls = new ArrayList<Ball>();
|
|
|
- balls.add(new Ball(5, 400, Color.red, 300, 50,-1));
|
|
|
+ readLevelsFromFiles();
|
|
|
+ playLevel(levels.get(currentlevel));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /** Level file reading **/
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Read all level files from a specific directory into level objects
|
|
|
+ */
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param levelfile
|
|
|
+ * @return
|
|
|
+ * @throws NumberFormatException
|
|
|
+ * @throws IllegalArgumentException
|
|
|
+ * @throws IllegalAccessException
|
|
|
+ * @throws NoSuchFieldException
|
|
|
+ * @throws SecurityException
|
|
|
+ */
|
|
|
+ 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]),
|
|
|
+ Boolean.parseBoolean(ballstring[6])
|
|
|
+ )
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] powerupsstring = levelfile.get(1).split("\\|");
|
|
|
+
|
|
|
+ level.setTime(Integer.parseInt(levelfile.get(2)));
|
|
|
+ }
|
|
|
+ return level;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 */
|
|
|
@Override
|
|
|
public void init() {
|
|
|
- System.out.println("Starting play state");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void exit()
|
|
|
{
|
|
|
- System.out.println("Stopping play state");
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -54,32 +135,43 @@ public class PlayState extends State{
|
|
|
player.update();
|
|
|
if(line != null){
|
|
|
line.setLength(line.getLength()+1);
|
|
|
- if(line.getMaxHeight() < 0){ //Line hit the ceiling, so "remove" it
|
|
|
+ if(line.getMaxHeight() < 0){ //Line hit the ceiling, so "remove" it
|
|
|
line = null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//Collision detection
|
|
|
- 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, 400, bal.getColor(), bal.getX(), bal.getY(), -1));
|
|
|
- b.add(new Ball(bal.getSize()-1, 400, bal.getColor(), bal.getX(), bal.getY(), 1));
|
|
|
- }else if(bal.hitPlayer(player)){ // Collision between player and ball
|
|
|
- try {
|
|
|
- throw new Exception("YOU DIED MOTHERFUCKER");
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ 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, 400, bal.getColor(), bal.getX(), bal.getY(), -1, true));
|
|
|
+ b.add(new Ball(bal.getSize()-1, 400, bal.getColor(), bal.getX(), bal.getY(), 1, true));
|
|
|
+ }else if(bal.hitPlayer(player)){ // Collision between player and ball
|
|
|
+ player.setHealth(player.getHealth()-1);
|
|
|
+ playLevel(levels.get(currentlevel));
|
|
|
+ }else if(bal.getSize() <= 0 ){ // Remove ball from arraylist when size is 0 (not visible)
|
|
|
+ b.remove();
|
|
|
+ }else{
|
|
|
+ bal.update();
|
|
|
}
|
|
|
- }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){
|
|
|
+ playLevel(levels.get(currentlevel+=1));
|
|
|
+ }else if(timeleft < 0){
|
|
|
+ player.setHealth(player.getHealth()-1);
|
|
|
+ playLevel(levels.get(currentlevel));
|
|
|
+ }else if(player.getHealth() <= 0) {
|
|
|
+ int i = 1/0;
|
|
|
}
|
|
|
+ lasttime = System.currentTimeMillis();
|
|
|
}
|
|
|
|
|
|
@Override
|