From 14e85df71cb4b6a596eb0a51041fdfc654aa3636 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 24 Jun 2021 10:57:03 +0200 Subject: [PATCH] new Entity help methods line of sight and vector to entity --- Zoelda/src/main/entities/Entity.java | 30 +++++++++++++++++ Zoelda/src/main/entities/LivingEntity.java | 6 +++- Zoelda/src/main/entities/Player.java | 11 +++++++ Zoelda/src/main/entities/Snake.java | 31 ++++-------------- .../images/snake_spritesheet_calciumtrice.png | Bin 3035 -> 2329 bytes 5 files changed, 52 insertions(+), 26 deletions(-) diff --git a/Zoelda/src/main/entities/Entity.java b/Zoelda/src/main/entities/Entity.java index 3a8dd90..719ed11 100644 --- a/Zoelda/src/main/entities/Entity.java +++ b/Zoelda/src/main/entities/Entity.java @@ -1,6 +1,9 @@ package main.entities; import ea.Ticker; +import ea.Vektor; +import main.Main; +import main.Tile; import main.maps.Map; /* @@ -107,5 +110,32 @@ public abstract class Entity implements Ticker { public float dist(Entity e) { return (float) Math.sqrt((e.posX - posX) * (e.posX - posX) + (e.posY - posY) * (e.posY - posY)); } + + /** + * Generiert einen vektor von diesm Entity zu einem anderen + */ + public Vektor vectorToEntity(Entity e) { + return new Vektor(e.posX - posX, e.posY - posY); + } + + protected boolean lineOfSightClear(Entity e) { + Vektor direct = vectorToEntity(e).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; + } } diff --git a/Zoelda/src/main/entities/LivingEntity.java b/Zoelda/src/main/entities/LivingEntity.java index a280da0..91ac26c 100644 --- a/Zoelda/src/main/entities/LivingEntity.java +++ b/Zoelda/src/main/entities/LivingEntity.java @@ -7,7 +7,7 @@ import main.World; /* * Alles was zustände hat und sich Bewegen kann, ist ein LivingEntity. */ -public class LivingEntity extends Entity { +public abstract class LivingEntity extends Entity { protected boolean side; // true = gespiegelt, false = nicht public ActionFigur actionFigur; // Sprite des Entities @@ -60,4 +60,8 @@ public class LivingEntity extends Entity { protected float getHealthPoints() { return hp; } + + public void takeDamage(float damage) { + hp -= damage; + } } diff --git a/Zoelda/src/main/entities/Player.java b/Zoelda/src/main/entities/Player.java index fe18eb1..261bd72 100644 --- a/Zoelda/src/main/entities/Player.java +++ b/Zoelda/src/main/entities/Player.java @@ -1,5 +1,7 @@ package main.entities; +import java.util.ArrayList; + import ea.Taste; import main.Main; import main.SheetLoader; @@ -73,6 +75,15 @@ public class Player extends LivingEntity { if (Main.instance.tasteGedrueckt(Taste.F)) { zustandSetzen("die"); } + + if (actionFigur.aktuellesVerhalten().equals("swipe") && actionFigur.aktuelleFigur().aktuellesBild() == 1) { + ArrayList entities = Main.instance.getWorld().getCurrentMap().getEntities(); + for (Entity e : entities) { + if (e instanceof LivingEntity) { + ((LivingEntity) e).takeDamage(0.1f); + } + } + } } // auf Kollisionen prüfen diff --git a/Zoelda/src/main/entities/Snake.java b/Zoelda/src/main/entities/Snake.java index 5ff1cbf..24f612e 100644 --- a/Zoelda/src/main/entities/Snake.java +++ b/Zoelda/src/main/entities/Snake.java @@ -10,7 +10,7 @@ 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 }); + new int[] { 10, 10, 10, 10, 10, 8}); public Snake() { super(loader.getFigur(0), "idle"); @@ -27,6 +27,7 @@ public class Snake extends LivingEntity { actionFigur.neuerZustand(loader.getFigur(2), "walk"); actionFigur.neuerZustand(loader.getFigur(3), "attack"); actionFigur.neuerZustand(loader.getFigur(4), "die"); + actionFigur.neuerZustand(loader.getFigur(5), "damage"); } @Override @@ -44,16 +45,16 @@ public class Snake extends LivingEntity { if (dist(nearestPlayer) < 1f) { zustandSetzen("attack"); } else { + if (actionFigur.aktuellesVerhalten().equals("attack")) { + actionFigur.aktuelleFigur().animationsBildSetzen(0); + } Vektor toPlayer = new Vektor(nearestPlayer.posX - posX, nearestPlayer.posY - posY); toPlayer = toPlayer.normiert(); velX += toPlayer.x * accelleration; velY += toPlayer.y * accelleration; zustandSetzen("walk"); } - - } else - - { + } else { if (actionFigur.aktuellesVerhalten().equals("walk")) { zustandSetzen("lost_sight"); } @@ -66,24 +67,4 @@ public class Snake extends LivingEntity { 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; - } } diff --git a/Zoelda/src/res/images/snake_spritesheet_calciumtrice.png b/Zoelda/src/res/images/snake_spritesheet_calciumtrice.png index 0417b5e8ff883b8a2ff20002da2b0f1d57666bc6..ceaf5fe9795b6586c61b41e5156a3144fd24a42c 100644 GIT binary patch literal 2329 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