package me.hammerle.supersnuvi.entity.components.ai; import me.hammerle.snuviengine.api.Shader; import me.hammerle.snuviengine.api.Texture; import me.hammerle.supersnuvi.Keys; import me.hammerle.supersnuvi.entity.Entity; import me.hammerle.supersnuvi.gamelogic.Level; import me.hammerle.supersnuvi.tiles.Tile; import me.hammerle.supersnuvi.util.Face; import me.hammerle.supersnuvi.util.SoundUtils; import me.hammerle.supersnuvi.util.SoundUtils.Sound; import me.hammerle.supersnuvi.util.Utils; public class HumanController extends Controller { protected final static int SIZE = 1024; private final static Texture HERO = new Texture("resources/hero.png"); private final static float OFFSET_Y = -Tile.SIZE * 0.15625f; protected float ox = 0.0f; protected float oy = 0.0f; protected float w = 0.0f; protected float h = 0.0f; protected float tx = 0.0f; protected float ty = 0.0f; protected int walkFrame = 0; private int idleCounter = 0; protected int idleFrame = 0; protected int deathFrame = 0; protected Face face = Face.RIGHT; protected void nextWalkFrame() { deathFrame = 0; idleFrame = 0; walkFrame = (walkFrame + 1) % 9; } protected void nextIdleFrame() { deathFrame = 0; walkFrame = 0; idleCounter++; if(idleCounter >= 3) { idleCounter = 0; idleFrame = (idleFrame + 1) % 14; } } protected void nextDeathFrame() { walkFrame = 0; idleFrame = 0; deathFrame++; } protected void resetFrames() { deathFrame = 0; walkFrame = 0; idleFrame = 0; } @Override public boolean isAnimated() { return deathFrame < 17; } @Override public void tick(Entity ent, Level level) { if(ent.getHealth().isDead()) { ox = face == Face.RIGHT ? 0.0f: -1.15625f * Tile.SIZE; oy = 0.0f; h = 2.0f; w = 2.0f; tx = (deathFrame * 64.0f) / SIZE; if(deathFrame < 16) { ty = 192.0f / SIZE; } else { ty = 256.0f / SIZE; } nextDeathFrame(); return; } float speed = ent.getMovement().getVelocityX(); if(Keys.RUN.isDown() && ent.getEnergy().getEnergyPercent() >= 0.01f) { speed *= 1.5f; ent.getEnergy().addEnergyPercent(-0.01f); } if(Keys.LEFT.isDown()) { ent.applyOwnForce(-speed, 0.0f); SoundUtils.playSound(ent.getMovement().isInWater() ? SoundUtils.Sound.WALK_WATER : SoundUtils.Sound.WALK); } if(Keys.RIGHT.isDown()) { ent.applyOwnForce(speed, 0.0f); SoundUtils.playSound(ent.getMovement().isInWater() ? SoundUtils.Sound.WALK_WATER : SoundUtils.Sound.WALK); } if(Keys.JUMP.isDown()) { if(ent.getEnergy().getEnergyPercent() >= 0.1f && ent.jump()) { SoundUtils.playSound(Sound.JUMP); ent.getEnergy().addEnergyPercent(-0.1f); } } ox = face == Face.RIGHT ? 0.0f : -0.15625f * Tile.SIZE; oy = 0.0f; h = 2.0f; w = 1.0f; if(ent.isOnGround()) { if(ent.getOwnForceX() == 0.0f) { tx = (idleFrame * 32.0f) / SIZE; ty = 128.0f / SIZE; nextIdleFrame(); } else { tx = (96.0f + walkFrame * 32.0f) / SIZE; ty = 0.0f; nextWalkFrame(); } } else { resetFrames(); tx = 0.0f; ty = 0.0f; } if(ent.getOwnForceX() > 0) { face = Face.RIGHT; } else if(ent.getOwnForceX() < 0) { face = Face.LEFT; } } @Override public void renderTick(Entity ent, float lag) { if(ent.getHealth().wasHurt()) { Shader.setColorEnabled(true); Shader.setMixColorEnabled(true); Shader.setMixColor(1.0f, 0.0f, 0.0f, 1.0f); } if(ent.getHealth().wasHealed()) { Shader.setColorEnabled(true); Shader.setMixColorEnabled(true); Shader.setMixColor(0.0f, 1.0f, 0.0f, 1.0f); } HERO.bind(); float x = Utils.interpolate(ent.getLastX(), ent.getX(), lag); float y = Utils.interpolate(ent.getLastY(), ent.getY(), lag); float m1; float m2; if(face == Face.LEFT) { m1 = w * Tile.SIZE; m2 = 0.0f; } else { m1 = 0.0f; m2 = w * Tile.SIZE; } Shader.getTextureRenderer().drawRectangle( x + ox + m1, y + oy + OFFSET_Y, x + ox + m2, y + oy + h * Tile.SIZE + OFFSET_Y, tx, ty, tx + (w * 32.0f / SIZE), ty + (h * 32.0f / SIZE)); if(ent.getHealth().wasHurt() || ent.getHealth().wasHealed()) { Shader.setColorEnabled(false); Shader.setMixColorEnabled(false); } } }