Files
Zoelda/Zoelda/src/main/entities/Snake.java
2021-06-23 22:32:50 +02:00

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;
}
}