PlayState.java 5.7 KB

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