HumanController.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package me.hammerle.supersnuvi.entity.components.ai;
  2. import me.hammerle.snuviengine.api.Shader;
  3. import me.hammerle.snuviengine.api.Texture;
  4. import me.hammerle.supersnuvi.Keys;
  5. import me.hammerle.supersnuvi.entity.Entity;
  6. import me.hammerle.supersnuvi.gamelogic.Level;
  7. import me.hammerle.supersnuvi.tiles.Tile;
  8. import me.hammerle.supersnuvi.util.Face;
  9. import me.hammerle.supersnuvi.util.SoundUtils;
  10. import me.hammerle.supersnuvi.util.SoundUtils.Sound;
  11. import me.hammerle.supersnuvi.util.Utils;
  12. public class HumanController extends Controller
  13. {
  14. protected final static int SIZE = 1024;
  15. private final static Texture HERO = new Texture("resources/hero.png");
  16. private final static float OFFSET_Y = -Tile.SIZE * 0.15625f;
  17. protected float ox = 0.0f;
  18. protected float oy = 0.0f;
  19. protected float w = 0.0f;
  20. protected float h = 0.0f;
  21. protected float tx = 0.0f;
  22. protected float ty = 0.0f;
  23. protected int walkFrame = 0;
  24. private int idleCounter = 0;
  25. protected int idleFrame = 0;
  26. protected int deathFrame = 0;
  27. protected Face face = Face.RIGHT;
  28. protected void nextWalkFrame()
  29. {
  30. deathFrame = 0;
  31. idleFrame = 0;
  32. walkFrame = (walkFrame + 1) % 9;
  33. }
  34. protected void nextIdleFrame()
  35. {
  36. deathFrame = 0;
  37. walkFrame = 0;
  38. idleCounter++;
  39. if(idleCounter >= 3)
  40. {
  41. idleCounter = 0;
  42. idleFrame = (idleFrame + 1) % 14;
  43. }
  44. }
  45. protected void nextDeathFrame()
  46. {
  47. walkFrame = 0;
  48. idleFrame = 0;
  49. deathFrame++;
  50. }
  51. protected void resetFrames()
  52. {
  53. deathFrame = 0;
  54. walkFrame = 0;
  55. idleFrame = 0;
  56. }
  57. @Override
  58. public boolean isAnimated()
  59. {
  60. return deathFrame < 17;
  61. }
  62. @Override
  63. public void tick(Entity ent, Level level)
  64. {
  65. if(ent.getHealth().isDead())
  66. {
  67. ox = face == Face.RIGHT ? 0.0f: -1.15625f * Tile.SIZE;
  68. oy = 0.0f;
  69. h = 2.0f;
  70. w = 2.0f;
  71. tx = (deathFrame * 64.0f) / SIZE;
  72. if(deathFrame < 16)
  73. {
  74. ty = 192.0f / SIZE;
  75. }
  76. else
  77. {
  78. ty = 256.0f / SIZE;
  79. }
  80. nextDeathFrame();
  81. return;
  82. }
  83. float speed = ent.getMovement().getVelocityX();
  84. if(Keys.RUN.isDown() && ent.getEnergy().getEnergyPercent() >= 0.01f)
  85. {
  86. speed *= 1.5f;
  87. ent.getEnergy().addEnergyPercent(-0.01f);
  88. }
  89. if(Keys.LEFT.isDown())
  90. {
  91. ent.applyOwnForce(-speed, 0.0f);
  92. SoundUtils.playSound(ent.getMovement().isInWater() ? SoundUtils.Sound.WALK_WATER : SoundUtils.Sound.WALK);
  93. }
  94. if(Keys.RIGHT.isDown())
  95. {
  96. ent.applyOwnForce(speed, 0.0f);
  97. SoundUtils.playSound(ent.getMovement().isInWater() ? SoundUtils.Sound.WALK_WATER : SoundUtils.Sound.WALK);
  98. }
  99. if(Keys.JUMP.isDown())
  100. {
  101. if(ent.getEnergy().getEnergyPercent() >= 0.1f && ent.jump())
  102. {
  103. SoundUtils.playSound(Sound.JUMP);
  104. ent.getEnergy().addEnergyPercent(-0.1f);
  105. }
  106. }
  107. ox = face == Face.RIGHT ? 0.0f : -0.15625f * Tile.SIZE;
  108. oy = 0.0f;
  109. h = 2.0f;
  110. w = 1.0f;
  111. if(ent.isOnGround())
  112. {
  113. if(ent.getOwnForceX() == 0.0f)
  114. {
  115. tx = (idleFrame * 32.0f) / SIZE;
  116. ty = 128.0f / SIZE;
  117. nextIdleFrame();
  118. }
  119. else
  120. {
  121. tx = (96.0f + walkFrame * 32.0f) / SIZE;
  122. ty = 0.0f;
  123. nextWalkFrame();
  124. }
  125. }
  126. else
  127. {
  128. resetFrames();
  129. tx = 0.0f;
  130. ty = 0.0f;
  131. }
  132. if(ent.getOwnForceX() > 0)
  133. {
  134. face = Face.RIGHT;
  135. }
  136. else if(ent.getOwnForceX() < 0)
  137. {
  138. face = Face.LEFT;
  139. }
  140. }
  141. @Override
  142. public void renderTick(Entity ent, float lag)
  143. {
  144. if(ent.getHealth().wasHurt())
  145. {
  146. Shader.setColorEnabled(true);
  147. Shader.setMixColorEnabled(true);
  148. Shader.setMixColor(1.0f, 0.0f, 0.0f, 1.0f);
  149. }
  150. if(ent.getHealth().wasHealed())
  151. {
  152. Shader.setColorEnabled(true);
  153. Shader.setMixColorEnabled(true);
  154. Shader.setMixColor(0.0f, 1.0f, 0.0f, 1.0f);
  155. }
  156. HERO.bind();
  157. float x = Utils.interpolate(ent.getLastX(), ent.getX(), lag);
  158. float y = Utils.interpolate(ent.getLastY(), ent.getY(), lag);
  159. float m1;
  160. float m2;
  161. if(face == Face.LEFT)
  162. {
  163. m1 = w * Tile.SIZE;
  164. m2 = 0.0f;
  165. }
  166. else
  167. {
  168. m1 = 0.0f;
  169. m2 = w * Tile.SIZE;
  170. }
  171. Shader.getTextureRenderer().drawRectangle(
  172. x + ox + m1, y + oy + OFFSET_Y,
  173. x + ox + m2, y + oy + h * Tile.SIZE + OFFSET_Y,
  174. tx, ty,
  175. tx + (w * 32.0f / SIZE), ty + (h * 32.0f / SIZE));
  176. if(ent.getHealth().wasHurt() || ent.getHealth().wasHealed())
  177. {
  178. Shader.setColorEnabled(false);
  179. Shader.setMixColorEnabled(false);
  180. }
  181. }
  182. }