HumanController.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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.util.Face;
  7. import me.hammerle.supersnuvi.util.SoundUtils;
  8. import me.hammerle.supersnuvi.util.SoundUtils.Sound;
  9. import me.hammerle.supersnuvi.util.Utils;
  10. public class HumanController extends Controller
  11. {
  12. private final static int SIZE = 1024;
  13. private final static Texture HERO = new Texture("resources/hero.png");
  14. private float ox = 0.0f;
  15. private float oy = 0.0f;
  16. private float w = 0.0f;
  17. private float h = 0.0f;
  18. private float tx = 0.0f;
  19. private float ty = 0.0f;
  20. private int walkFrame = 0;
  21. private int idleCounter = 0;
  22. private int idleFrame = 0;
  23. private int deathFrame = 0;
  24. public HumanController(Entity ent)
  25. {
  26. super(ent);
  27. }
  28. private void nextWalkFrame()
  29. {
  30. deathFrame = 0;
  31. idleFrame = 0;
  32. walkFrame = (walkFrame + 1) % 9;
  33. }
  34. private 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. private void nextDeathFrame()
  46. {
  47. walkFrame = 0;
  48. idleFrame = 0;
  49. deathFrame++;
  50. }
  51. private 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()
  64. {
  65. if(ent.getHealth().isDead())
  66. {
  67. ox = ent.getFace() == Face.RIGHT ? 0.0f: -37.0f;
  68. oy = 0.0f;
  69. h = 64.0f;
  70. w = 64.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.setMotionX(-speed);
  92. SoundUtils.playSound(ent.getMovement().isInWater() ? SoundUtils.Sound.WALK_WATER : SoundUtils.Sound.WALK);
  93. }
  94. if(Keys.RIGHT.isDown())
  95. {
  96. ent.setMotionX(speed);
  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.getMovement().jump())
  102. {
  103. SoundUtils.playSound(Sound.JUMP);
  104. ent.getEnergy().addEnergyPercent(-0.1f);
  105. }
  106. }
  107. ox = ent.getFace() == Face.RIGHT ? 0.0f: -5.0f;
  108. oy = 0.0f;
  109. h = 64.0f;
  110. w = 32.0f;
  111. if(ent.isOnGround())
  112. {
  113. if(ent.getMotionX() == 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. }
  133. @Override
  134. public void renderTick(float lag)
  135. {
  136. if(ent.getHealth().wasHurt())
  137. {
  138. Shader.setColorEnabled(true);
  139. Shader.setMixColorEnabled(true);
  140. Shader.setMixColor(1.0f, 0.0f, 0.0f, 1.0f);
  141. }
  142. if(ent.getHealth().wasHealed())
  143. {
  144. Shader.setColorEnabled(true);
  145. Shader.setMixColorEnabled(true);
  146. Shader.setMixColor(0.0f, 1.0f, 0.0f, 1.0f);
  147. }
  148. HERO.bind();
  149. float x = Utils.interpolate(ent.getLastX(), ent.getX(), lag);
  150. float y = Utils.interpolate(ent.getLastY(), ent.getY(), lag);
  151. float m1;
  152. float m2;
  153. if(ent.getFace() == Face.LEFT)
  154. {
  155. m1 = w;
  156. m2 = 0.0f;
  157. }
  158. else
  159. {
  160. m1 = 0.0f;
  161. m2 = w;
  162. }
  163. Shader.getTextureRenderer().drawRectangle(
  164. x + ox + m1, y + oy,
  165. x + ox + m2, y + oy + h,
  166. tx, ty,
  167. tx + (w / SIZE), ty + (h / SIZE));
  168. if(ent.getHealth().wasHurt() || ent.getHealth().wasHealed())
  169. {
  170. Shader.setColorEnabled(false);
  171. Shader.setMixColorEnabled(false);
  172. }
  173. }
  174. }