PlayState.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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 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. playLevel(levels.get(0));
  96. }
  97. @Override
  98. public void exit()
  99. {
  100. }
  101. /* UPDATE */
  102. @Override
  103. public void update() {
  104. if(direction == 1)
  105. player.walkRight();
  106. else if(direction == -1)
  107. player.walkLeft();
  108. player.update();
  109. if(line != null){
  110. line.setLength(line.getLength()+1);
  111. if(line.getMaxHeight() < 0){ //Line hit the ceiling, so "remove" it
  112. line = null;
  113. }
  114. }
  115. //Collision detection
  116. try{
  117. ListIterator<Ball> b = balls.listIterator();
  118. while(b.hasNext()){
  119. Ball bal = b.next();
  120. if(line != null && bal.hitLine(line)){ // Collision between line and ball
  121. line = null;
  122. b.remove();
  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. 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));
  125. }else if(bal.hitPlayer(player)){ // Collision between player and ball
  126. player.setHealth(player.getHealth()-1);
  127. playLevel(getCurrentLevel());
  128. }else if(bal.getSize() <= 0 ){ // Remove ball from arraylist when size is 0 (not visible)
  129. b.remove();
  130. }else{
  131. bal.update();
  132. }
  133. }
  134. }catch(ConcurrentModificationException e){
  135. }
  136. timeleft -= (System.currentTimeMillis() - lasttime);
  137. if(balls.size() == 0){
  138. if(player.getHealth() > 0)
  139. player.setScore(player.getScore()+(timeleft/100));
  140. else
  141. player.setScore(player.getScore()+(timeleft/100)/2);
  142. if(player2.getHealth() > 0)
  143. player2.setScore(player2.getScore()+(timeleft/100));
  144. else
  145. player2.setScore(player2.getScore()+(timeleft/100)/2);
  146. if(currentlevel+1 >= levels.size())
  147. gsm.setState("end");
  148. else
  149. playLevel(levels.get(currentlevel+=1));
  150. }else if(timeleft < 0){
  151. player.setHealth(player.getHealth()-1);
  152. playLevel(getCurrentLevel());
  153. }else if(player.getHealth() <= 0) {
  154. gsm.setState("end");
  155. }
  156. lasttime = System.currentTimeMillis();
  157. }
  158. @Override
  159. public void paint(Graphics2D g2d) {
  160. g2d.drawImage(Images.getImage(ImageType.BACKGROUND),null,0,0);
  161. if(line != null){
  162. line.paint(g2d);
  163. }
  164. for(Ball b: balls){
  165. b.paint(g2d);
  166. }
  167. player.paint(g2d);
  168. infopanel.paint(g2d);
  169. }
  170. /* GETTERS AND SETTERS */
  171. public Level getCurrentLevel(){
  172. return levels.get(currentlevel);
  173. }
  174. public int getTimeleft() {
  175. return timeleft;
  176. }
  177. /* EVENTS */
  178. @Override
  179. public void keyPressed(KeyEvent e) {
  180. switch(e.getKeyCode())
  181. {
  182. case KeyEvent.VK_RIGHT:
  183. direction = 1;
  184. break;
  185. case KeyEvent.VK_LEFT:
  186. direction = -1;
  187. break;
  188. case KeyEvent.VK_SPACE:
  189. if(line == null){
  190. line = new ShootingLine((int)player.getX()+player.getWidth()/2, 600);
  191. }
  192. }
  193. }
  194. @Override
  195. public void keyReleased(KeyEvent e) {
  196. switch(e.getKeyCode())
  197. {
  198. case KeyEvent.VK_RIGHT:
  199. direction = 0;
  200. case KeyEvent.VK_LEFT:
  201. direction = 0;
  202. break;
  203. case KeyEvent.VK_ESCAPE:
  204. gsm.setState("menu");
  205. break;
  206. }
  207. }
  208. @Override
  209. public void keyTyped(KeyEvent e) {};
  210. }