diff --git a/.gitignore b/.gitignore index e9ee0c6..fcf9215 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ /Zoelda/bin/ /Zoelda/.settings/ .classpath -.project \ No newline at end of file +.project +*.log diff --git a/Zoelda/src/main/Entity.java b/Zoelda/src/main/Entity.java new file mode 100644 index 0000000..42af625 --- /dev/null +++ b/Zoelda/src/main/Entity.java @@ -0,0 +1,30 @@ +package main; + +import ea.Ticker; + +public abstract class Entity implements Ticker { + + protected float posX, posY; + protected float velX, velY; + protected float accelleration = 0.012f; + protected float friction = 0.2f; + protected float width, height; + + @Override + public void tick() { + posX += velX; + posY += velY; + velX *= (1f - friction); + velY *= (1f - friction); + if (velX < 0.001f && velX > -0.001f) { + velX = 0f; + } + if (velY < 0.001f && velY > -0.001f) { + velY = 0f; + } + update(); + } + + protected abstract void update(); + +} diff --git a/Zoelda/src/main/LivingEntity.java b/Zoelda/src/main/LivingEntity.java new file mode 100644 index 0000000..9b6a55e --- /dev/null +++ b/Zoelda/src/main/LivingEntity.java @@ -0,0 +1,61 @@ +package main; + +import java.awt.Color; +import java.awt.Graphics2D; + +import ea.ActionFigur; +import ea.BoundingRechteck; +import ea.Figur; + +public class LivingEntity extends Entity { + + protected boolean side; + protected ActionFigur actionFigur; + protected float spriteOffsetX, spriteOffsetY; + + public LivingEntity(Figur figur, String name) { + actionFigur = new ActionFigur(figur, name) { + @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 * Tile.getSize()), (int) (posY * Tile.getSize()), (int) (width * Tile.getSize()), (int) (height * Tile.getSize())); + super.zeichnen(g, r); + } + }; + } + + @Override + protected void update() { + if (velX < 0) { + side = true; + } else if (velX > 0) { + side = false; + } + int offsetX = (int) ((width * Tile.getSize()) / 2 - (actionFigur.getBreite()) / 2); + int offsetY = (int) ((height * Tile.getSize()) / 2 - (actionFigur.getHoehe()) / 2); + actionFigur.positionSetzen(posX * Tile.getSize() + offsetX + spriteOffsetX * Tile.getSize(), + posY * Tile.getSize() + offsetY + spriteOffsetY * Tile.getSize()); + } + + protected void moveLeft() { + velX -= accelleration; + } + + protected void moveRight() { + velX += accelleration; + } + + protected void moveUp() { + velY -= accelleration; + } + + protected void moveDown() { + velY += accelleration; + } + + protected void zustandSetzen(String name) { + actionFigur.spiegelXSetzen(side); + actionFigur.zustandSetzen(name); + } +} diff --git a/Zoelda/src/main/Malin.java b/Zoelda/src/main/Malin.java index 64f4a5f..f8f1b8d 100644 --- a/Zoelda/src/main/Malin.java +++ b/Zoelda/src/main/Malin.java @@ -7,27 +7,26 @@ public class Malin extends Game { private World world; private Player player; - + public static final int WIDTH = 1440; public static final int HEIGHT = 1056; - + public Malin() { super(WIDTH, HEIGHT); - + player = new Player(this); - + world = new World(player); wurzel.add(world); - + Manager manager = new Manager(); manager.anmelden(player, 20); } @Override public void tasteReagieren(int code) { - } - + public World getWorld() { return world; } diff --git a/Zoelda/src/main/Map.java b/Zoelda/src/main/Map.java index 412e603..6caa07d 100644 --- a/Zoelda/src/main/Map.java +++ b/Zoelda/src/main/Map.java @@ -32,7 +32,11 @@ public class Map extends Knoten { return null; } -// public int[][] getCollisionMap(){ -// -// } + public int getWidth() { + return map.length; + } + + public int getHeight() { + return map[0].length; + } } diff --git a/Zoelda/src/main/Player.java b/Zoelda/src/main/Player.java index bfa212c..d33c361 100644 --- a/Zoelda/src/main/Player.java +++ b/Zoelda/src/main/Player.java @@ -1,202 +1,65 @@ package main; -import ea.ActionFigur; -import ea.Rechteck; import ea.Taste; -import ea.Ticker; -public class Player extends ActionFigur implements Ticker { +public class Player extends LivingEntity { private Malin main; private static PlayerSheetLoader loader = new PlayerSheetLoader(); - private boolean side; - - private float velX, velY; - private int oldPosX, oldPosY; - private float accelleration = 0.15f; - private float friction = 0.2f; - private Rechteck hitBox = new Rechteck(0, 0, 0, 0); public Player(Malin main) { super(loader.getPlayer(0), "idle_left"); this.main = main; - neuerZustand(loader.getPlayer(1), "idle_right"); - neuerZustand(loader.getPlayer(2), "walk_left"); - neuerZustand(loader.getPlayer(3), "walk_right"); - neuerZustand(loader.getPlayer(4), "strike_left"); - neuerZustand(loader.getPlayer(5), "strike_right"); - neuerZustand(loader.getPlayer(6), "swipe_left"); - neuerZustand(loader.getPlayer(7), "swipe_right"); - neuerZustand(loader.getPlayer(8), "die"); + width = 0.7f; + height = 0.8f; + spriteOffsetY = -0.14f; loader.getPlayer(0).animationsGeschwindigkeitSetzen(200); - loader.getPlayer(1).animationsGeschwindigkeitSetzen(200); - loader.getPlayer(2).animationsGeschwindigkeitSetzen(50); - loader.getPlayer(3).animationsGeschwindigkeitSetzen(50); + loader.getPlayer(1).animationsGeschwindigkeitSetzen(50); - positionSetzen(Tile.getSize() * 2, Tile.getSize() * 2); + actionFigur.neuerZustand(loader.getPlayer(0), "idle"); + actionFigur.neuerZustand(loader.getPlayer(1), "walk"); + actionFigur.neuerZustand(loader.getPlayer(2), "strike"); + actionFigur.neuerZustand(loader.getPlayer(3), "swipe"); + actionFigur.neuerZustand(loader.getPlayer(4), "die"); } @Override - public void tick() { - - if (!((aktuellesVerhalten() == "strike_left" || aktuellesVerhalten() == "strike_right") - && aktuelleFigur().aktuellesBild() < aktuelleFigur().animation().length - 1)) { - - if (main.tasteGedrueckt(Taste.W)) { - velY -= World.SCALE * accelleration; - } - if (main.tasteGedrueckt(Taste.S)) { - velY += World.SCALE * accelleration; - } - if (main.tasteGedrueckt(Taste.A)) { - velX -= World.SCALE * accelleration; - side = false; - } - if (main.tasteGedrueckt(Taste.D)) { - velX += World.SCALE * accelleration; - side = true; - } - - setX(getX() + velX); - setY(getY() + velY); - velX *= (1f - friction); - velY *= (1f - friction); - if (velX < 0.2f && velX > -0.2f) { - velX = 0f; - } - if (velY < 0.2f && velY > -0.2f) { - velY = 0f; - } - - hitBox.positionSetzen(positionX() + 103, positionY() + 35); - hitBox.breiteSetzen(50); - hitBox.hoeheSetzen(80); - - final int xOffset = hitBox.positionX() - positionX(); - final int yOffset = hitBox.positionY() - positionY(); - int tileX, tileY; - Tile t; - // collision left - if (hitBox.positionX() - oldPosX < 0) { - tileX = hitBox.positionX() / Tile.getSize(); - tileY = hitBox.positionY() / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velX = 0; - int x = t.getRight() - xOffset; - oldPosX = x; - positionSetzen(x, positionY()); + protected void update() { + if (!((actionFigur.aktuellesVerhalten().equals("strike")) + && actionFigur.aktuelleFigur().aktuellesBild() < actionFigur.aktuelleFigur().animation().length - 1)) { + if (!((actionFigur.aktuellesVerhalten().equals("swipe")) + && actionFigur.aktuelleFigur().aktuellesBild() < actionFigur.aktuelleFigur().animation().length - 1)) { + if (main.tasteGedrueckt(Taste.A)) { + moveLeft(); } - tileX = hitBox.positionX() / Tile.getSize(); - tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velX = 0; - int x = t.getRight() - xOffset; - oldPosX = x; - positionSetzen(x, positionY()); + if (main.tasteGedrueckt(Taste.D)) { + moveRight(); } - } - // collision right - if (hitBox.positionX() - oldPosX > 0) { - tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize(); - tileY = hitBox.positionY() / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velX = 0; - int x = t.getLeft() - xOffset - (int) hitBox.getBreite(); - oldPosX = x; - positionSetzen(x, positionY()); + if (main.tasteGedrueckt(Taste.W)) { + moveUp(); } - tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize(); - tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velX = 0; - int x = t.getLeft() - xOffset - (int) hitBox.getBreite(); - oldPosX = x; - positionSetzen(x, positionY()); + if (main.tasteGedrueckt(Taste.S)) { + moveDown(); } - } - // collision top - if (hitBox.positionY() - oldPosY < 0) { - tileX = hitBox.positionX() / Tile.getSize(); - tileY = hitBox.positionY() / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velY = 0; - int y = t.getBottom() - yOffset; - oldPosY = y; - positionSetzen(positionX(), y); - } - tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize(); - tileY = hitBox.positionY() / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velY = 0; - int y = t.getBottom() - yOffset; - oldPosY = y; - positionSetzen(positionX(), y); - } - } - // collision bottom - if (hitBox.positionY() - oldPosY > 0) { - tileX = hitBox.positionX() / Tile.getSize(); - tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velY = 0; - int y = t.getTop() - (int) hitBox.getHoehe() - yOffset; - oldPosY = y; - positionSetzen(positionX(), y); - } - tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize(); - tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize(); - t = main.getWorld().getCurrentMap().getTile(tileX, tileY); - if (t != null && t.isCollidable()) { - velY = 0; - int y = t.getTop() - (int) hitBox.getHoehe() - yOffset; - oldPosY = y; - positionSetzen(positionX(), y); - } - } - - oldPosX = hitBox.positionX(); - oldPosY = hitBox.positionY(); - - if (!((aktuellesVerhalten() == "swipe_left" || aktuellesVerhalten() == "swipe_right") - && aktuelleFigur().aktuellesBild() < aktuelleFigur().animation().length - 1)) { if (velX == 0 && velY == 0) { - if (side) { - zustandSetzen("idle_right"); - } else { - zustandSetzen("idle_left"); - } + zustandSetzen("idle"); } else { - if (side) { - zustandSetzen("walk_right"); - } else { - zustandSetzen("walk_left"); - } + zustandSetzen("walk"); } if (main.tasteGedrueckt(Taste.LEERTASTE)) { - if (side) { - zustandSetzen("swipe_right"); - } else { - zustandSetzen("swipe_left"); - } + zustandSetzen("swipe"); } if (main.tasteGedrueckt(Taste.Q)) { - if (side) { - zustandSetzen("strike_right"); - } else { - zustandSetzen("strike_left"); - } + zustandSetzen("strike"); } } + super.update(); + } else { + velX = 0; + velY = 0; } } } diff --git a/Zoelda/src/main/PlayerSheetLoader.java b/Zoelda/src/main/PlayerSheetLoader.java index f386c34..e756abb 100644 --- a/Zoelda/src/main/PlayerSheetLoader.java +++ b/Zoelda/src/main/PlayerSheetLoader.java @@ -19,29 +19,21 @@ public class PlayerSheetLoader { try { BufferedImage sheet = ImageIO.read(Tile.class.getResourceAsStream("/res/images/player_sprite_sheet.png")); - PixelFeld[][] sprites = new PixelFeld[9][]; + PixelFeld[][] sprites = new PixelFeld[5][]; sprites[0] = new PixelFeld[5]; - sprites[1] = new PixelFeld[5]; - sprites[2] = new PixelFeld[8]; - sprites[3] = new PixelFeld[8]; + sprites[1] = new PixelFeld[8]; + sprites[2] = new PixelFeld[7]; + sprites[3] = new PixelFeld[6]; sprites[4] = new PixelFeld[7]; - sprites[5] = new PixelFeld[7]; - sprites[6] = new PixelFeld[6]; - sprites[7] = new PixelFeld[6]; - sprites[8] = new PixelFeld[7]; - loadSprites(sprites[0], 0, 64, 32, sheet, true); - loadSprites(sprites[1], 0, 64, 32, sheet, false); - loadSprites(sprites[2], 1, 64, 32, sheet, true); - loadSprites(sprites[3], 1, 64, 32, sheet, false); - loadSprites(sprites[4], 2, 64, 32, sheet, true); - loadSprites(sprites[5], 2, 64, 32, sheet, false); - loadSprites(sprites[6], 3, 64, 32, sheet, true); - loadSprites(sprites[7], 3, 64, 32, sheet, false); - loadSprites(sprites[8], 7, 64, 32, sheet, false); + loadSprites(sprites[0], 0, 64, 32, sheet); + loadSprites(sprites[1], 1, 64, 32, sheet); + loadSprites(sprites[2], 2, 64, 32, sheet); + loadSprites(sprites[3], 3, 64, 32, sheet); + loadSprites(sprites[4], 4, 64, 32, sheet); Figur fig; - player = new Figur[9]; + player = new Figur[5]; for (int i = 0; i < player.length; i++) { fig = new Figur(); fig.animationSetzen(sprites[i]); @@ -57,7 +49,7 @@ public class PlayerSheetLoader { return player[y]; } - private void loadSprites(PixelFeld[] sprites, int row, int w, int h, BufferedImage sheet, boolean reverse) { + private void loadSprites(PixelFeld[] sprites, int row, int w, int h, BufferedImage sheet) { for (int s = 0; s < sprites.length; s++) { sprites[s] = new PixelFeld(w * (int) (World.SCALE / SCALE_DIV), h * (int) (World.SCALE / SCALE_DIV), 1); for (int x = 0; x < w; x++) { @@ -72,15 +64,6 @@ public class PlayerSheetLoader { } } } - if (reverse) { - PixelFeld copy = new PixelFeld(sprites[s].breite(), sprites[s].hoehe(), 1); - for (int x = 0; x < sprites[s].breite(); x++) { - for (int y = 0; y < sprites[s].hoehe(); y++) { - copy.farbeSetzen(sprites[s].breite() - x - 1, y, sprites[s].getPic()[x][y]); - } - } - sprites[s] = copy; - } } } } diff --git a/Zoelda/src/main/World.java b/Zoelda/src/main/World.java index 15ad62c..deea772 100644 --- a/Zoelda/src/main/World.java +++ b/Zoelda/src/main/World.java @@ -4,7 +4,7 @@ import ea.Knoten; public class World extends Knoten { - public static final int SCALE = 3; + public static final int SCALE = 6; private Map currentMap; @@ -12,7 +12,7 @@ public class World extends Knoten { currentMap = new Map(); add(currentMap); - add(player); + add(player.actionFigur); } public Map getCurrentMap() {