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