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.

112 lines
3.4 KiB

  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 "
  33. + LevelHitTwice.MAX_HITS);
  34. super.actionIfEnemyIsHit(e, shot);
  35. } else {
  36. logger.trace("enemy was hit before for " + counter + " times, which is below "
  37. + LevelHitTwice.MAX_HITS);
  38. e.setObjectFlag("counter", Integer.valueOf(counter + 1));
  39. }
  40. deleteObject(shot.getId());
  41. }
  42. @Override
  43. double calcEnemyShotProb() {
  44. return 1.5 * this.getTimestep();
  45. }
  46. @Override
  47. protected double calcEnemySpeedX() {
  48. return ENEMYSPEEDX * 2;
  49. }
  50. @Override
  51. protected double calcEnemySpeedY() {
  52. return ENEMYSPEEDY * 2;
  53. }
  54. @Override
  55. protected int calcNrEnemies() {
  56. return (int) 1;
  57. }
  58. @Override
  59. protected GameObject createEnemyShotObject(GameObject parentObject, String name,
  60. ObjectController limitedTimeController) {
  61. GameObject ego = this.getObject("ego");
  62. double deltax = parentObject.getX() - ego.getX();
  63. double deltay = parentObject.getY() - ego.getY();
  64. double norm = Math.sqrt(deltax * deltax + deltay * deltay);
  65. deltax *= -ENEMYSHOTSPEED / norm;
  66. deltay *= -ENEMYSHOTSPEED / norm;
  67. logger.trace("Creating EnemyShot as TextObject [" + name + "] in direction " + deltax + "/"
  68. + deltay + " towards ego");
  69. GameObject to = new TextObject(name, this, parentObject.getX(), parentObject.getY(), deltax,
  70. deltay, "*", 20, Color.GREEN).generateColliders().addController(limitedTimeController);
  71. return to;
  72. }
  73. @Override
  74. protected GameObject createSingleEnemy(String name, double x_enemy, double y_enemy,
  75. double vx_enemy, double vy_enemy, ObjectController enemyController, double gameTime) {
  76. GameObject go = new AnimatedGameobject(name, this, this.canvasX / 2, 10, vx_enemy, 50,
  77. ENEMYSCALE * 3, this.enemyAnim, this.getGameTime(), "loop").generateColliders()
  78. .addController(enemyController);
  79. return go;
  80. }
  81. @Override
  82. protected String getStartupMessage() {
  83. return "BOSS LEVEL!";
  84. }
  85. }