PlayState.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package model.state;
  2. import java.awt.Color;
  3. import java.awt.Graphics2D;
  4. import java.awt.event.KeyEvent;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.nio.file.Files;
  8. import java.util.ArrayList;
  9. import java.util.Collection;
  10. import java.util.ConcurrentModificationException;
  11. import java.util.List;
  12. import java.util.ListIterator;
  13. import model.GameStateManager;
  14. import model.InfoPanel;
  15. import model.levels.Level;
  16. import model.objects.Ball;
  17. import model.objects.Player;
  18. import model.objects.ShootingLine;
  19. import resources.image.Images;
  20. import resources.image.Images.ImageType;
  21. import server.Main;
  22. public class PlayState extends State{
  23. private Player player;
  24. private Player player2;
  25. private ShootingLine line;
  26. private ArrayList<Ball> balls;
  27. private ArrayList<Level> levels;
  28. private InfoPanel infopanel;
  29. private int direction;
  30. private int currentlevel;
  31. private int timeleft;
  32. private long lasttime;
  33. public PlayState(GameStateManager gsm) {
  34. super("play", gsm);
  35. player = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "Janco");
  36. player2 = new Player(Images.getImage(ImageType.PLAYER1), 40, 550, "Kenneth");
  37. infopanel = new InfoPanel(player, player2, this);
  38. balls = new ArrayList<Ball>();
  39. readLevelsFromFiles();
  40. playLevel(levels.get(currentlevel));
  41. }
  42. /* LEVEL FILE READING, PARSING AND PLAYING */
  43. private void readLevelsFromFiles(){
  44. levels = new ArrayList<>();
  45. File root = new File(Main.class.getResource("/model/levels").getPath());
  46. File[] list = root.listFiles();
  47. for ( File f : list ) {
  48. if(f.isFile() && f.getName().endsWith(".bb")){
  49. try {
  50. levels.add(readLevel(Files.readAllLines(f.toPath())));
  51. }catch (IOException | IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
  52. System.out.println("Level file corrputed");
  53. e.printStackTrace();
  54. }
  55. }
  56. }
  57. }
  58. private Level readLevel(List<String> levelfile) throws NumberFormatException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException{
  59. Level level = new Level();
  60. if(levelfile.size() == 3){
  61. String[] ballsstrings = levelfile.get(0).split("\\|"); //split all the balls
  62. for(String ball:ballsstrings){
  63. String[]ballstring = ball.split(",");
  64. if(ballstring.length == 7){
  65. level.addBall(new Ball(
  66. Integer.parseInt(ballstring[0]),
  67. Integer.parseInt(ballstring[1]),
  68. (Color)Color.class.getField(ballstring[2]).get(null),
  69. Integer.parseInt(ballstring[3]),
  70. Integer.parseInt(ballstring[4]),
  71. Integer.parseInt(ballstring[5]),
  72. Double.parseDouble(ballstring[6])
  73. )
  74. );
  75. }
  76. }
  77. String[] powerupsstring = levelfile.get(1).split("\\|");
  78. level.setTime(Integer.parseInt(levelfile.get(2)));
  79. }
  80. return level;
  81. }
  82. public void playLevel(Level level){
  83. balls.clear();
  84. for(Ball b:level.getStartballs()){
  85. balls.add(b.clone());
  86. }
  87. timeleft = level.getTime();
  88. player.reset();
  89. line=null;
  90. lasttime = System.currentTimeMillis();
  91. }
  92. /* INIT AND EXIT */
  93. @Override
  94. public void init() {
  95. }
  96. @Override
  97. public void exit()
  98. {
  99. }
  100. /* UPDATE */
  101. @Override
  102. public void update() {
  103. if(direction == 1)
  104. player.walkRight();
  105. else if(direction == -1)
  106. player.walkLeft();
  107. player.update();
  108. if(line != null){
  109. line.setLength(line.getLength()+1);
  110. if(line.getMaxHeight() < 0){ //Line hit the ceiling, so "remove" it
  111. line = null;
  112. }
  113. }
  114. //Collision detection
  115. try{
  116. ListIterator<Ball> b = balls.listIterator();
  117. while(b.hasNext()){
  118. Ball bal = b.next();
  119. if(line != null && bal.hitLine(line)){ // Collision between line and ball
  120. line = null;
  121. b.remove();
  122. 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));
  123. 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));
  124. }else if(bal.hitPlayer(player)){ // Collision between player and ball
  125. player.setHealth(player.getHealth()-1);
  126. playLevel(getCurrentLevel());
  127. }else if(bal.getSize() <= 0 ){ // Remove ball from arraylist when size is 0 (not visible)
  128. b.remove();
  129. }else{
  130. bal.update();
  131. }
  132. }
  133. }catch(ConcurrentModificationException e){
  134. }
  135. timeleft -= (System.currentTimeMillis() - lasttime);
  136. if(balls.size() == 0){
  137. if(player.getHealth() > 0)
  138. player.setScore(player.getScore()+(timeleft/100));
  139. else
  140. player.setScore(player.getScore()+(timeleft/100)/2);
  141. if(player2.getHealth() > 0)
  142. player2.setScore(player2.getScore()+(timeleft/100));
  143. else
  144. player2.setScore(player2.getScore()+(timeleft/100)/2);
  145. if(currentlevel+1 >= levels.size())
  146. gsm.setState("end");
  147. else
  148. playLevel(levels.get(currentlevel+=1));
  149. }else if(timeleft < 0){
  150. player.setHealth(player.getHealth()-1);
  151. playLevel(getCurrentLevel());
  152. }else if(player.getHealth() <= 0) {
  153. gsm.setState("end");
  154. }
  155. lasttime = System.currentTimeMillis();
  156. }
  157. @Override
  158. public void paint(Graphics2D g2d) {
  159. g2d.drawImage(Images.getImage(ImageType.BACKGROUND),null,0,0);
  160. if(line != null){
  161. line.paint(g2d);
  162. }
  163. for(Ball b: balls){
  164. b.paint(g2d);
  165. }
  166. player.paint(g2d);
  167. infopanel.paint(g2d);
  168. }
  169. /* GETTERS AND SETTERS */
  170. public Level getCurrentLevel(){
  171. return levels.get(currentlevel);
  172. }
  173. public int getTimeleft() {
  174. return timeleft;
  175. }
  176. /* EVENTS */
  177. @Override
  178. public void keyPressed(KeyEvent e) {
  179. switch(e.getKeyCode())
  180. {
  181. case KeyEvent.VK_RIGHT:
  182. direction = 1;
  183. break;
  184. case KeyEvent.VK_LEFT:
  185. direction = -1;
  186. break;
  187. case KeyEvent.VK_SPACE:
  188. if(line == null){
  189. line = new ShootingLine((int)player.getX()+player.getWidth()/2, 600);
  190. }
  191. }
  192. }
  193. @Override
  194. public void keyReleased(KeyEvent e) {
  195. switch(e.getKeyCode())
  196. {
  197. case KeyEvent.VK_RIGHT:
  198. direction = 0;
  199. case KeyEvent.VK_LEFT:
  200. direction = 0;
  201. break;
  202. case KeyEvent.VK_ESCAPE:
  203. gsm.setState("menu");
  204. break;
  205. }
  206. }
  207. @Override
  208. public void keyTyped(KeyEvent e) {};
  209. }