package net.alcuria.umbracraft.engine.entities; import net.alcuria.umbracraft.Config; import net.alcuria.umbracraft.Game; import net.alcuria.umbracraft.engine.components.Component; import net.alcuria.umbracraft.engine.components.MapCollisionComponent; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; /** A component to display a shadow underneath an entity. * @author Andrew Keturi */ public class ShadowComponent implements Component { private static final int WIDTH = 16, HEIGHT = 16; private boolean added; private MapCollisionComponent collision; private final boolean ignoreMap; private TextureRegion shadow; private boolean squareShadow = false; private final int xOffset, yOffset; public ShadowComponent(boolean squareShadow) { this(squareShadow, 0, 0, false); } public ShadowComponent(boolean squareShadow, int x, int y, boolean ignoreMap) { xOffset = x; yOffset = y; this.ignoreMap = ignoreMap; this.squareShadow = squareShadow; } @Override public void create(Entity entity) { if (squareShadow) { shadow = new TextureRegion(Game.assets().get("sprites/shadow.png", Texture.class), 8, 4, 1, 1); } else { shadow = new TextureRegion(Game.assets().get("sprites/shadow.png", Texture.class), 16, 6); } } @Override public void dispose(Entity entity) { } private int getHeight() { return squareShadow ? 16 : 6; } private int getWidth() { return 16; } @Override public void render(Entity entity) { final int altitude = Game.map() == null || ignoreMap ? 0 : Game.map().getAltitudeAt((int) entity.position.x / Config.tileWidth, (int) entity.position.y / Config.tileWidth); if (collision != null && collision.isOnGround()) { Game.batch().draw(shadow, entity.position.x - WIDTH / 2 + xOffset, entity.position.y - HEIGHT / 2 + yOffset + 2 + entity.position.z, getWidth(), getHeight()); } else { Game.batch().draw(shadow, entity.position.x - WIDTH / 2 + xOffset, entity.position.y - HEIGHT / 2 + yOffset + 2 + Config.tileWidth * altitude, getWidth(), getHeight()); } } @Override public void update(Entity entity) { if (collision == null && !added) { collision = entity.getComponent(MapCollisionComponent.class); } added = true; } }