You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.3 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. package playground;
  2. import java.awt.Color;
  3. import org.apache.logging.log4j.LogManager;
  4. import org.apache.logging.log4j.Logger;
  5. import controller.EgoController;
  6. import controller.FallingStarController;
  7. import controller.ObjectController;
  8. import gameobjects.AnimatedGameobject;
  9. import gameobjects.EgoObject;
  10. import gameobjects.FallingStar;
  11. import gameobjects.GameObject;
  12. import gameobjects.TextObject;
  13. /**
  14. * Class that realizes all the game logic of a very simple game level. The level contains for now
  15. * only two objects that are {@link GameObject} subclasses: {@link FallingStar} and
  16. * {@link EgoObject}. Functions performed by this class are:
  17. * <ul>
  18. * <li>initially set up the level, spawn all object etc., in method {@link #prepareLevel}
  19. * <li>React to keyboard commands in method {@link #processKeyEvents(java.util.Stack)}
  20. * <li>define basic object movement rules for all objects in the level in the various
  21. * ObjectController subclasses: {@link EgoController} and {@link FallingStarController}.
  22. * </ul>
  23. */
  24. public class LevelBoss extends SpaceInvadersLevel {
  25. private static int MAX_SHOTS = 10;
  26. private static Logger logger = LogManager.getLogger(LevelBoss.class);
  27. @Override
  28. void actionIfEnemyIsHit(GameObject e, GameObject shot) {
  29. Object counterFlag = e.getOrCreateObjectFlag("counter", Integer.valueOf(1));
  30. int counter = (Integer) counterFlag;
  31. if (counter >= LevelBoss.MAX_SHOTS) {
  32. logger.trace("enemy was hit before for " + counter + " times, which is equal or above " + LevelHitTwice.MAX_HITS);
  33. super.actionIfEnemyIsHit(e, shot);
  34. } else {
  35. logger.trace("enemy was hit before for " + counter + " times, which is below " + LevelHitTwice.MAX_HITS);
  36. e.setObjectFlag("counter", Integer.valueOf(counter + 1));
  37. }
  38. deleteObject(shot.getId());
  39. }
  40. @Override
  41. double calcEnemyShotProb() {
  42. return 1.5 * this.getTimestep();
  43. }
  44. @Override
  45. protected double calcEnemySpeedX() {
  46. return ENEMYSPEEDX * 2;
  47. }
  48. @Override
  49. protected double calcEnemySpeedY() {
  50. return ENEMYSPEEDY * 2;
  51. }
  52. @Override
  53. protected int calcNrEnemies() {
  54. return (int) 1;
  55. }
  56. @Override
  57. protected GameObject createEnemyShotObject(GameObject parentObject, String name,
  58. ObjectController limitedTimeController) {
  59. GameObject ego = this.getObject("ego");
  60. double deltax = parentObject.getX() - ego.getX();
  61. double deltay = parentObject.getY() - ego.getY();
  62. double norm = Math.sqrt(deltax * deltax + deltay * deltay);
  63. deltax *= -ENEMYSHOTSPEED / norm;
  64. deltay *= -ENEMYSHOTSPEED / norm;
  65. logger.trace(
  66. "Creating EnemyShot as TextObject [" + name + "] in direction " + deltax + "/" + deltay + " towards ego");
  67. GameObject to = new TextObject(name, this, parentObject.getX(), parentObject.getY(), deltax, deltay, "*", 20,
  68. Color.GREEN).generateColliders().addController(limitedTimeController);
  69. return to;
  70. }
  71. @Override
  72. protected GameObject createSingleEnemy(String name, double x_enemy, double y_enemy, double vx_enemy, double vy_enemy,
  73. ObjectController enemyController, double gameTime) {
  74. GameObject go = new AnimatedGameobject(name, this, this.canvasX / 2, 10, vx_enemy, 50, ENEMYSCALE * 3,
  75. this.enemyAnim, this.getGameTime(), "loop").generateColliders().addController(enemyController);
  76. return go;
  77. }
  78. @Override
  79. protected String getStartupMessage() {
  80. return "BOSS LEVEL!";
  81. }
  82. }