PlatformController.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package me.hammerle.supersnuvi.entity.components.ai;
  2. import java.util.ArrayList;
  3. import me.hammerle.snuviengine.api.Shader;
  4. import me.hammerle.snuviengine.api.Texture;
  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.Utils;
  10. public class PlatformController extends Controller
  11. {
  12. private final static Texture TEXTURE = new Texture("resources/platform.png");
  13. private static class MoveData
  14. {
  15. private final float x;
  16. private final float y;
  17. private final float speedX;
  18. private final float speedY;
  19. private final int waitTicks;
  20. public MoveData(float x, float y, float speedX, float speedY, int waitTicks)
  21. {
  22. this.x = x;
  23. this.y = y;
  24. this.speedX = Math.abs(speedX);
  25. this.speedY = Math.abs(speedY);
  26. this.waitTicks = waitTicks;
  27. }
  28. }
  29. private final ArrayList<MoveData> dataList = new ArrayList<>();
  30. private int moveIndex = 0;
  31. private int waitTicks = 0;
  32. public PlatformController(Entity ent)
  33. {
  34. super(ent);
  35. }
  36. @Override
  37. public boolean isAnimated()
  38. {
  39. return true;
  40. }
  41. public void addMoveData(float x, float y, float speedX, float speedY, int waitTicks)
  42. {
  43. dataList.add(new MoveData(x, y, speedX, speedY, waitTicks));
  44. }
  45. public void clearMoveData()
  46. {
  47. dataList.clear();
  48. }
  49. private float clamp(float f, float min, float max)
  50. {
  51. if(f < min)
  52. {
  53. return min;
  54. }
  55. else if(f > max)
  56. {
  57. return max;
  58. }
  59. return f;
  60. }
  61. @Override
  62. public void tick(Level level)
  63. {
  64. if(dataList.isEmpty())
  65. {
  66. return;
  67. }
  68. MoveData data = dataList.get(moveIndex);
  69. if(ent.isAt(data.x, data.y))
  70. {
  71. ent.setMotionX(0.0f);
  72. ent.setMotionY(0.0f);
  73. waitTicks++;
  74. if(waitTicks >= data.waitTicks)
  75. {
  76. waitTicks = 0;
  77. moveIndex = (moveIndex + 1) % dataList.size();
  78. }
  79. }
  80. else
  81. {
  82. float motionX = clamp(data.x - ent.getX(), -data.speedX, data.speedX);
  83. float motionY = clamp(data.y - ent.getY(), -data.speedY, data.speedY);
  84. ent.setMotionX(motionX);
  85. ent.setMotionY(motionY);
  86. }
  87. }
  88. @Override
  89. public void renderTick(float lag)
  90. {
  91. TEXTURE.bind();
  92. float x = Utils.interpolate(ent.getLastX(), ent.getX(), lag);
  93. float y = Utils.interpolate(ent.getLastY(), ent.getY(), lag);
  94. int mid = (int) Math.ceil((ent.getWidth() / Tile.SIZE) - 2);
  95. float endY = y + ent.getHeight();
  96. Shader.getTextureRenderer().drawRectangle(x, y, x + Tile.SIZE, endY, 0.0f, 0.25f, 0.25f, 0.4453125f);
  97. x += Tile.SIZE;
  98. for(int i = 0; i < mid; i++)
  99. {
  100. Shader.getTextureRenderer().drawRectangle(x, y, x + Tile.SIZE, endY, 0.25f, 0.25f, 0.5f, 0.4453125f);
  101. x += Tile.SIZE;
  102. }
  103. Shader.getTextureRenderer().drawRectangle(x, y, x + Tile.SIZE, endY, 0.5f, 0.25f, 0.75f, 0.4453125f);
  104. }
  105. }