81 lines
2.4 KiB
Java
81 lines
2.4 KiB
Java
package main.entities;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import ea.Vektor;
|
|
import main.Main;
|
|
import main.SheetLoader;
|
|
import main.Tile;
|
|
|
|
public class Snake extends LivingEntity {
|
|
|
|
private static SheetLoader loader = new SheetLoader("/res/images/snake_spritesheet_calciumtrice.png", 32, 32, new int[] { 10, 10, 10, 10, 10 });
|
|
|
|
public Snake() {
|
|
super(loader.getFigur(0), "idle");
|
|
|
|
posX = 9f;
|
|
posY = 9f;
|
|
accelleration = 0.008f;
|
|
spriteOffsetY = -0.6f;
|
|
width = 0.65f;
|
|
height = 0.8f;
|
|
mirrored = true;
|
|
|
|
actionFigur.neuerZustand(loader.getFigur(1), "lost_sight");
|
|
actionFigur.neuerZustand(loader.getFigur(2), "walk");
|
|
actionFigur.neuerZustand(loader.getFigur(3), "attack");
|
|
actionFigur.neuerZustand(loader.getFigur(4), "die");
|
|
}
|
|
|
|
@Override
|
|
protected void update() {
|
|
ArrayList<Entity> entities = Main.instance.getWorld().getCurrentMap().getEntities();
|
|
Entity nearestPlayer = null;
|
|
for (Entity e : entities) {
|
|
if (e instanceof Player) {
|
|
if (nearestPlayer == null || e.dist(this) < nearestPlayer.dist(this)) {
|
|
nearestPlayer = e;
|
|
}
|
|
}
|
|
}
|
|
if (nearestPlayer != null && lineOfSightClear(nearestPlayer)) {
|
|
Vektor toPlayer = new Vektor(nearestPlayer.posX - posX, nearestPlayer.posY - posY);
|
|
toPlayer = toPlayer.normiert();
|
|
velX += toPlayer.x * accelleration;
|
|
velY += toPlayer.y * accelleration;
|
|
zustandSetzen("walk");
|
|
} else {
|
|
if (actionFigur.aktuellesVerhalten().equals("walk")) {
|
|
zustandSetzen("lost_sight");
|
|
}
|
|
if (actionFigur.aktuellesVerhalten().equals("lost_sight") && actionFigur.aktuelleFigur().aktuellesBild() == actionFigur.aktuelleFigur().animation().length - 1) {
|
|
actionFigur.aktuelleFigur().animationsBildSetzen(0);
|
|
zustandSetzen("idle");
|
|
}
|
|
}
|
|
this.checkTileCollisions(Main.instance.getWorld().getCurrentMap());
|
|
super.update();
|
|
}
|
|
|
|
private boolean lineOfSightClear(Entity e) {
|
|
Vektor direct = new Vektor(e.posX - posX, e.posY - posY).normiert();
|
|
direct = direct.teilen(4f);
|
|
Vektor loc = new Vektor(posX, posY);
|
|
float lastDist;
|
|
float dist = Float.MAX_VALUE;
|
|
boolean clear = true;
|
|
do {
|
|
loc = loc.summe(direct);
|
|
lastDist = dist;
|
|
dist = Math.abs(e.posX - loc.x) + Math.abs(e.posY - loc.y);
|
|
Tile t = Main.instance.getWorld().getCurrentMap().getTile((int) loc.x, (int) loc.y);
|
|
if (t != null && t.isCollidable()) {
|
|
clear = false;
|
|
break;
|
|
}
|
|
} while (dist < lastDist);
|
|
return clear;
|
|
}
|
|
}
|