From 43a6aecd2eb4183a5e709e0dadec276a012f459b Mon Sep 17 00:00:00 2001 From: Asecave Date: Wed, 23 Jun 2021 20:56:19 +0200 Subject: [PATCH] moved entities from word to map --- Zoelda/src/main/Launcher.java | 2 +- Zoelda/src/main/{Malin.java => Main.java} | 9 ++-- Zoelda/src/main/World.java | 26 +++++------ Zoelda/src/main/entities/Entity.java | 7 +++ Zoelda/src/main/entities/LivingEntity.java | 34 +++++---------- Zoelda/src/main/entities/Player.java | 32 +++++++------- Zoelda/src/main/entities/Snake.java | 41 ++++++++++++++++++ Zoelda/src/main/entities/Spider.java | 8 ++-- Zoelda/src/main/maps/Map.java | 10 +++++ Zoelda/src/main/maps/TestMap.java | 4 +- .../images/snake_spritesheet_calciumtrice.png | Bin 0 -> 3035 bytes 11 files changed, 109 insertions(+), 64 deletions(-) rename Zoelda/src/main/{Malin.java => Main.java} (79%) create mode 100644 Zoelda/src/main/entities/Snake.java create mode 100644 Zoelda/src/res/images/snake_spritesheet_calciumtrice.png diff --git a/Zoelda/src/main/Launcher.java b/Zoelda/src/main/Launcher.java index e41419a..ccdfdf5 100644 --- a/Zoelda/src/main/Launcher.java +++ b/Zoelda/src/main/Launcher.java @@ -3,6 +3,6 @@ package main; public class Launcher { public static void main(String[] args) { - new Malin(); + new Main(); } } diff --git a/Zoelda/src/main/Malin.java b/Zoelda/src/main/Main.java similarity index 79% rename from Zoelda/src/main/Malin.java rename to Zoelda/src/main/Main.java index 3ca2f80..872b4a6 100644 --- a/Zoelda/src/main/Malin.java +++ b/Zoelda/src/main/Main.java @@ -5,18 +5,21 @@ import ea.Game; /** * Von hier wird alles initialisiert. Das ist die höchste Klasse. */ -public class Malin extends Game { +public class Main extends Game { + + public static Main instance; private World world; public static final int WIDTH = 1440; // Fensterbreite public static final int HEIGHT = 1056; // Fensterhöhe - public Malin() { + public Main() { super(WIDTH, HEIGHT); + instance = this; // Welt initialisieren und Spieler hinzufügen - world = new World(this); + world = new World(); // die Welt zu EA hinzufügen wurzel.add(world); } diff --git a/Zoelda/src/main/World.java b/Zoelda/src/main/World.java index 634cd73..e321d0a 100644 --- a/Zoelda/src/main/World.java +++ b/Zoelda/src/main/World.java @@ -1,10 +1,9 @@ package main; -import java.util.ArrayList; - import ea.Knoten; import main.entities.Entity; import main.entities.Player; +import main.entities.Snake; import main.entities.Spider; import main.maps.Map; import main.maps.TestMap; @@ -14,15 +13,12 @@ import main.maps.TestMap; */ public class World extends Knoten { - public static final int SCALE_FACTOR = 4; // Der Basis Zoomfaktor + public static final int SCALE_FACTOR = 6; // Der Basis Zoomfaktor public static final int SCALE = SCALE_FACTOR * Tile.getSize(); // Eine Gameunit ist so viele pixel lang private Map currentMap; // Die Map die aktuell angezeigt werden soll. - private ArrayList entities; - public World(Malin main) { - - entities = new ArrayList<>(100); + public World() { // Map initialisieren currentMap = new TestMap(); @@ -30,18 +26,22 @@ public class World extends Knoten { add(currentMap); // und Entities auch - Player player = new Player(main); + Player player = new Player(); add(player.actionFigur); - entities.add(player); + currentMap.getEntities().add(player); - Spider spider = new Spider(main); + Spider spider = new Spider(); // und Spinnen auch add(spider.actionFigur); - entities.add(spider); + currentMap.getEntities().add(spider); + + Snake snake = new Snake(); + add(snake.actionFigur); + currentMap.getEntities().add(snake); // Alle Entities als ticker registrieren (triggert dann die update methoden) - for (Entity e : entities) { - main.manager.anmelden(e, 20); + for (Entity e : currentMap.getEntities()) { + Main.instance.manager.anmelden(e, 20); } } diff --git a/Zoelda/src/main/entities/Entity.java b/Zoelda/src/main/entities/Entity.java index 50f50ef..1651a5b 100644 --- a/Zoelda/src/main/entities/Entity.java +++ b/Zoelda/src/main/entities/Entity.java @@ -100,5 +100,12 @@ public abstract class Entity implements Ticker { posX = blockX - width / 2; } } + + /** + * @return die entifernung zu diesem Entity + */ + public float dist(Entity e) { + return (float) Math.sqrt(e.posX * e.posX + posY * posY); + } } diff --git a/Zoelda/src/main/entities/LivingEntity.java b/Zoelda/src/main/entities/LivingEntity.java index 0819091..329b82d 100644 --- a/Zoelda/src/main/entities/LivingEntity.java +++ b/Zoelda/src/main/entities/LivingEntity.java @@ -1,6 +1,10 @@ package main.entities; +import java.awt.Color; +import java.awt.Graphics2D; + import ea.ActionFigur; +import ea.BoundingRechteck; import ea.Figur; import main.World; @@ -22,13 +26,13 @@ public class LivingEntity extends Entity { actionFigur = new ActionFigur(figur, name) { // DEBUG: render boxes -// @Override -// public void zeichnen(Graphics2D g, BoundingRechteck r) { -// g.setColor(Color.GREEN); -// g.drawRect((int) actionFigur.positionX(), (int) actionFigur.positionY(), (int) actionFigur.getBreite(), (int) actionFigur.getHoehe()); -// g.drawRect((int) ((posX - width / 2) * World.SCALE), (int) ((posY - height / 2) * World.SCALE), (int) (width * World.SCALE), (int) (height * World.SCALE)); -// super.zeichnen(g, r); -// } + @Override + public void zeichnen(Graphics2D g, BoundingRechteck r) { + g.setColor(Color.GREEN); + g.drawRect((int) actionFigur.positionX(), (int) actionFigur.positionY(), (int) actionFigur.getBreite(), (int) actionFigur.getHoehe()); + g.drawRect((int) ((posX - width / 2) * World.SCALE), (int) ((posY - height / 2) * World.SCALE), (int) (width * World.SCALE), (int) (height * World.SCALE)); + super.zeichnen(g, r); + } }; } @@ -48,22 +52,6 @@ public class LivingEntity extends Entity { actionFigur.positionSetzen((posX + offsetX) * World.SCALE - actionFigur.getBreite() / 2, (posY + offsetY) * World.SCALE - actionFigur.getHoehe() / 2); } - protected void moveLeft() { - velX -= accelleration; - } - - protected void moveRight() { - velX += accelleration; - } - - protected void moveUp() { - velY -= accelleration; - } - - protected void moveDown() { - velY += accelleration; - } - /** * Spiegelt die figur autmatisch, wenn nötig. */ diff --git a/Zoelda/src/main/entities/Player.java b/Zoelda/src/main/entities/Player.java index f1e1792..fe18eb1 100644 --- a/Zoelda/src/main/entities/Player.java +++ b/Zoelda/src/main/entities/Player.java @@ -1,17 +1,15 @@ package main.entities; import ea.Taste; -import main.Malin; +import main.Main; import main.SheetLoader; public class Player extends LivingEntity { - private Malin main; // Referenz auf die main Klasse. Wird später für den Keyboardinput verwendet private static SheetLoader loader = new SheetLoader("/res/images/player_sprite_sheet.png", 64, 32, new int[] {5, 8, 7, 6, 2, 5, 4, 7}); - public Player(Malin main) { - super(loader.getFigur(0), "idle_left"); - this.main = main; + public Player() { + super(loader.getFigur(0), "idle"); // Entity-Eigenschaften werden festgelegt width = 0.7f; @@ -45,17 +43,17 @@ public class Player extends LivingEntity { && actionFigur.aktuelleFigur().aktuellesBild() < actionFigur.aktuelleFigur().animation().length - 1)) { // wasd movement - if (main.tasteGedrueckt(Taste.A)) { - moveLeft(); + if (Main.instance.tasteGedrueckt(Taste.A)) { + velX -= accelleration; } - if (main.tasteGedrueckt(Taste.D)) { - moveRight(); + if (Main.instance.tasteGedrueckt(Taste.D)) { + velX += accelleration; } - if (main.tasteGedrueckt(Taste.W)) { - moveUp(); + if (Main.instance.tasteGedrueckt(Taste.W)) { + velY -= accelleration; } - if (main.tasteGedrueckt(Taste.S)) { - moveDown(); + if (Main.instance.tasteGedrueckt(Taste.S)) { + velY += accelleration; } // Auf idle stellen wenn man sich nicht bewegt @@ -66,19 +64,19 @@ public class Player extends LivingEntity { } // Attacken - if (main.tasteGedrueckt(Taste.LEERTASTE)) { + if (Main.instance.tasteGedrueckt(Taste.LEERTASTE)) { zustandSetzen("swipe"); } - if (main.tasteGedrueckt(Taste.Q)) { + if (Main.instance.tasteGedrueckt(Taste.Q)) { zustandSetzen("strike"); } - if (main.tasteGedrueckt(Taste.F)) { + if (Main.instance.tasteGedrueckt(Taste.F)) { zustandSetzen("die"); } } // auf Kollisionen prüfen - checkTileCollisions(main.getWorld().getCurrentMap()); + checkTileCollisions(Main.instance.getWorld().getCurrentMap()); // LivingEntity auch updaten lassen super.update(); } else { diff --git a/Zoelda/src/main/entities/Snake.java b/Zoelda/src/main/entities/Snake.java new file mode 100644 index 0000000..df93033 --- /dev/null +++ b/Zoelda/src/main/entities/Snake.java @@ -0,0 +1,41 @@ +package main.entities; + +import java.util.ArrayList; + +import ea.Vektor; +import main.Main; +import main.SheetLoader; + +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; + } + + @Override + protected void update() { + ArrayList 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) { + Vektor toPlayer = new Vektor(nearestPlayer.posX - posX, nearestPlayer.posY - posY); + toPlayer = toPlayer.normiert(); + velX += toPlayer.x * accelleration; + velY += toPlayer.y * accelleration; + } + this.checkTileCollisions(Main.instance.getWorld().getCurrentMap()); + super.update(); + } +} diff --git a/Zoelda/src/main/entities/Spider.java b/Zoelda/src/main/entities/Spider.java index 7fbca37..8c24f25 100644 --- a/Zoelda/src/main/entities/Spider.java +++ b/Zoelda/src/main/entities/Spider.java @@ -1,17 +1,15 @@ package main.entities; -import main.Malin; +import main.Main; import main.SheetLoader; public class Spider extends LivingEntity { - private Malin main; // Referenz auf die main Klasse. Wird später für den Keyboardinput verwendet private static SheetLoader loader = new SheetLoader("/res/images/spider_sprite_sheet.png", 32, 32, new int[] { 5, 6, 9, 1, 4, 3, 9, 6, 5, 6, 9, 1, 4, 3, 9, 6 }); - public Spider(Malin main) { + public Spider() { super(loader.getFigur(0), "walk"); - this.main = main; width = 0.7f; height = 0.8f; @@ -24,7 +22,7 @@ public class Spider extends LivingEntity { protected void update() { // auf Kollisionen prüfen - checkTileCollisions(main.getWorld().getCurrentMap()); + checkTileCollisions(Main.instance.getWorld().getCurrentMap()); // LivingEntity auch updaten lassen super.update(); velX = 0; diff --git a/Zoelda/src/main/maps/Map.java b/Zoelda/src/main/maps/Map.java index 41ee131..4605914 100644 --- a/Zoelda/src/main/maps/Map.java +++ b/Zoelda/src/main/maps/Map.java @@ -1,7 +1,10 @@ package main.maps; +import java.util.ArrayList; + import ea.Knoten; import main.Tile; +import main.entities.Entity; /** * Auf der Map sind alle Entities, sowie die Tiles gespiechert. @@ -9,9 +12,12 @@ import main.Tile; public abstract class Map extends Knoten { protected Tile[][] map; // Die Tiles der map in einem 2D Array. + private ArrayList entities; public Map(int width, int height) { map = new Tile[width][height]; + + entities = new ArrayList<>(100); } /** @@ -31,4 +37,8 @@ public abstract class Map extends Knoten { public int getHeight() { return map[0].length; } + + public ArrayList getEntities() { + return entities; + } } diff --git a/Zoelda/src/main/maps/TestMap.java b/Zoelda/src/main/maps/TestMap.java index 477634a..f9465d3 100644 --- a/Zoelda/src/main/maps/TestMap.java +++ b/Zoelda/src/main/maps/TestMap.java @@ -5,11 +5,11 @@ import main.Tile; public class TestMap extends Map { public TestMap() { - super(20, 10); + super(15, 11); for (int x = 0; x < map.length; x++) { for (int y = 0; y < map[0].length; y++) { - map[x][y] = new Tile(0, x, y); + map[x][y] = new Tile(Math.random() * 5 < 1 ? 1 : 0, x, y); add(map[x][y]); } } diff --git a/Zoelda/src/res/images/snake_spritesheet_calciumtrice.png b/Zoelda/src/res/images/snake_spritesheet_calciumtrice.png new file mode 100644 index 0000000000000000000000000000000000000000..0417b5e8ff883b8a2ff20002da2b0f1d57666bc6 GIT binary patch literal 3035 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