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

package playground;
import java.awt.Color;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import controller.EgoController;
import controller.FallingStarController;
import controller.ObjectController;
import gameobjects.AnimatedGameobject;
import gameobjects.EgoObject;
import gameobjects.FallingStar;
import gameobjects.GameObject;
import gameobjects.TextObject;
/**
* Class that realizes all the game logic of a very simple game level. The level contains for now
* only two objects that are {@link GameObject} subclasses: {@link FallingStar} and
* {@link EgoObject}. Functions performed by this class are:
* <ul>
* <li>initially set up the level, spawn all object etc., in method {@link #prepareLevel}
* <li>React to keyboard commands in method {@link #processKeyEvents(java.util.Stack)}
* <li>define basic object movement rules for all objects in the level in the various
* ObjectController subclasses: {@link EgoController} and {@link FallingStarController}.
* </ul>
*/
public class LevelBoss extends SpaceInvadersLevel {
private static int MAX_SHOTS = 10;
private static Logger logger = LogManager.getLogger(LevelBoss.class);
@Override
void actionIfEnemyIsHit(GameObject e, GameObject shot) {
Object counterFlag = e.getOrCreateObjectFlag("counter", Integer.valueOf(1));
int counter = (Integer) counterFlag;
if (counter >= LevelBoss.MAX_SHOTS) {
logger.trace("enemy was hit before for " + counter + " times, which is equal or above "
+ LevelHitTwice.MAX_HITS);
super.actionIfEnemyIsHit(e, shot);
} else {
logger.trace("enemy was hit before for " + counter + " times, which is below "
+ LevelHitTwice.MAX_HITS);
e.setObjectFlag("counter", Integer.valueOf(counter + 1));
}
deleteObject(shot.getId());
}
@Override
double calcEnemyShotProb() {
return 1.5 * this.getTimestep();
}
@Override
protected double calcEnemySpeedX() {
return ENEMYSPEEDX * 2;
}
@Override
protected double calcEnemySpeedY() {
return ENEMYSPEEDY * 2;
}
@Override
protected int calcNrEnemies() {
return (int) 1;
}
@Override
protected GameObject createEnemyShotObject(GameObject parentObject, String name,
ObjectController limitedTimeController) {
GameObject ego = this.getObject("ego");
double deltax = parentObject.getX() - ego.getX();
double deltay = parentObject.getY() - ego.getY();
double norm = Math.sqrt(deltax * deltax + deltay * deltay);
deltax *= -ENEMYSHOTSPEED / norm;
deltay *= -ENEMYSHOTSPEED / norm;
logger.trace("Creating EnemyShot as TextObject [" + name + "] in direction " + deltax + "/"
+ deltay + " towards ego");
GameObject to = new TextObject(name, this, parentObject.getX(), parentObject.getY(), deltax,
deltay, "*", 20, Color.GREEN).generateColliders().addController(limitedTimeController);
return to;
}
@Override
protected GameObject createSingleEnemy(String name, double x_enemy, double y_enemy,
double vx_enemy, double vy_enemy, ObjectController enemyController, double gameTime) {
GameObject go = new AnimatedGameobject(name, this, this.canvasX / 2, 10, vx_enemy, 50,
ENEMYSCALE * 3, this.enemyAnim, this.getGameTime(), "loop").generateColliders()
.addController(enemyController);
return go;
}
@Override
protected String getStartupMessage() {
return "BOSS LEVEL!";
}
}