Entity superklasse and normalised coordiantes

This commit is contained in:
Asecave
2021-06-22 17:39:57 +02:00
parent d587225ddb
commit 71f6f86769
8 changed files with 150 additions and 209 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@
/Zoelda/.settings/ /Zoelda/.settings/
.classpath .classpath
.project .project
*.log

View File

@@ -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();
}

View File

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

View File

@@ -25,7 +25,6 @@ public class Malin extends Game {
@Override @Override
public void tasteReagieren(int code) { public void tasteReagieren(int code) {
} }
public World getWorld() { public World getWorld() {

View File

@@ -32,7 +32,11 @@ public class Map extends Knoten {
return null; return null;
} }
// public int[][] getCollisionMap(){ public int getWidth() {
// return map.length;
// } }
public int getHeight() {
return map[0].length;
}
} }

View File

@@ -1,202 +1,65 @@
package main; package main;
import ea.ActionFigur;
import ea.Rechteck;
import ea.Taste; import ea.Taste;
import ea.Ticker;
public class Player extends ActionFigur implements Ticker { public class Player extends LivingEntity {
private Malin main; private Malin main;
private static PlayerSheetLoader loader = new PlayerSheetLoader(); 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) { public Player(Malin main) {
super(loader.getPlayer(0), "idle_left"); super(loader.getPlayer(0), "idle_left");
this.main = main; this.main = main;
neuerZustand(loader.getPlayer(1), "idle_right"); width = 0.7f;
neuerZustand(loader.getPlayer(2), "walk_left"); height = 0.8f;
neuerZustand(loader.getPlayer(3), "walk_right"); spriteOffsetY = -0.14f;
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");
loader.getPlayer(0).animationsGeschwindigkeitSetzen(200); loader.getPlayer(0).animationsGeschwindigkeitSetzen(200);
loader.getPlayer(1).animationsGeschwindigkeitSetzen(200); loader.getPlayer(1).animationsGeschwindigkeitSetzen(50);
loader.getPlayer(2).animationsGeschwindigkeitSetzen(50);
loader.getPlayer(3).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 @Override
public void tick() { protected void update() {
if (!((actionFigur.aktuellesVerhalten().equals("strike"))
if (!((aktuellesVerhalten() == "strike_left" || aktuellesVerhalten() == "strike_right") && actionFigur.aktuelleFigur().aktuellesBild() < actionFigur.aktuelleFigur().animation().length - 1)) {
&& aktuelleFigur().aktuellesBild() < aktuelleFigur().animation().length - 1)) { if (!((actionFigur.aktuellesVerhalten().equals("swipe"))
&& actionFigur.aktuelleFigur().aktuellesBild() < actionFigur.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)) { if (main.tasteGedrueckt(Taste.A)) {
velX -= World.SCALE * accelleration; moveLeft();
side = false;
} }
if (main.tasteGedrueckt(Taste.D)) { if (main.tasteGedrueckt(Taste.D)) {
velX += World.SCALE * accelleration; moveRight();
side = true;
} }
if (main.tasteGedrueckt(Taste.W)) {
setX(getX() + velX); moveUp();
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) { if (main.tasteGedrueckt(Taste.S)) {
velY = 0f; moveDown();
} }
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());
}
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());
}
}
// 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());
}
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());
}
}
// 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 (velX == 0 && velY == 0) {
if (side) { zustandSetzen("idle");
zustandSetzen("idle_right");
} else { } else {
zustandSetzen("idle_left"); zustandSetzen("walk");
}
} else {
if (side) {
zustandSetzen("walk_right");
} else {
zustandSetzen("walk_left");
}
} }
if (main.tasteGedrueckt(Taste.LEERTASTE)) { if (main.tasteGedrueckt(Taste.LEERTASTE)) {
if (side) { zustandSetzen("swipe");
zustandSetzen("swipe_right");
} else {
zustandSetzen("swipe_left");
}
} }
if (main.tasteGedrueckt(Taste.Q)) { if (main.tasteGedrueckt(Taste.Q)) {
if (side) { zustandSetzen("strike");
zustandSetzen("strike_right"); }
}
super.update();
} else { } else {
zustandSetzen("strike_left"); velX = 0;
} velY = 0;
}
}
} }
} }
} }

View File

@@ -19,29 +19,21 @@ public class PlayerSheetLoader {
try { try {
BufferedImage sheet = ImageIO.read(Tile.class.getResourceAsStream("/res/images/player_sprite_sheet.png")); 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[0] = new PixelFeld[5];
sprites[1] = new PixelFeld[5]; sprites[1] = new PixelFeld[8];
sprites[2] = new PixelFeld[8]; sprites[2] = new PixelFeld[7];
sprites[3] = new PixelFeld[8]; sprites[3] = new PixelFeld[6];
sprites[4] = new PixelFeld[7]; 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[0], 0, 64, 32, sheet);
loadSprites(sprites[1], 0, 64, 32, sheet, false); loadSprites(sprites[1], 1, 64, 32, sheet);
loadSprites(sprites[2], 1, 64, 32, sheet, true); loadSprites(sprites[2], 2, 64, 32, sheet);
loadSprites(sprites[3], 1, 64, 32, sheet, false); loadSprites(sprites[3], 3, 64, 32, sheet);
loadSprites(sprites[4], 2, 64, 32, sheet, true); loadSprites(sprites[4], 4, 64, 32, sheet);
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);
Figur fig; Figur fig;
player = new Figur[9]; player = new Figur[5];
for (int i = 0; i < player.length; i++) { for (int i = 0; i < player.length; i++) {
fig = new Figur(); fig = new Figur();
fig.animationSetzen(sprites[i]); fig.animationSetzen(sprites[i]);
@@ -57,7 +49,7 @@ public class PlayerSheetLoader {
return player[y]; 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++) { 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); sprites[s] = new PixelFeld(w * (int) (World.SCALE / SCALE_DIV), h * (int) (World.SCALE / SCALE_DIV), 1);
for (int x = 0; x < w; x++) { 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;
}
} }
} }
} }

View File

@@ -4,7 +4,7 @@ import ea.Knoten;
public class World extends Knoten { public class World extends Knoten {
public static final int SCALE = 3; public static final int SCALE = 6;
private Map currentMap; private Map currentMap;
@@ -12,7 +12,7 @@ public class World extends Knoten {
currentMap = new Map(); currentMap = new Map();
add(currentMap); add(currentMap);
add(player); add(player.actionFigur);
} }
public Map getCurrentMap() { public Map getCurrentMap() {