LevelRenderer.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package pathgame.rendering;
  2. import me.hammerle.snuviengine.api.Renderer;
  3. import pathgame.gameplay.Camera;
  4. import pathgame.gameplay.Gamestate;
  5. import pathgame.gameplay.Gamestates;
  6. import pathgame.gameplay.Level;
  7. import pathgame.gameplay.Player;
  8. import pathgame.tilemap.TileMap;
  9. public class LevelRenderer
  10. {
  11. private final PlayerRenderer playerRenderer = new PlayerRenderer();
  12. private final TileMapRenderer mapRenderer = new TileMapRenderer();
  13. private final HUDRenderer hudRenderer = new HUDRenderer();
  14. private final Camera cam = new Camera();
  15. private final ScoreMenuRenderer scoreRenderer = new ScoreMenuRenderer();
  16. public void tick(Level level, Gamestate gamestate)
  17. {
  18. cam.tick(level, gamestate);
  19. mapRenderer.tick();
  20. if(level.getPlayer().isMoving())
  21. {
  22. cam.reset();
  23. }
  24. }
  25. public void renderTick(Renderer r, float lag, Level level, Gamestate gamestate)
  26. {
  27. if(level.isShowingAfterScore() || level.isShowingScoreMenu())
  28. {
  29. lag = 0.0f;
  30. }
  31. TileMap map = level.getMap();
  32. Player player = level.getPlayer();
  33. float zoomRestrictionX = r.getViewWidth() / (map.getWidth() * TileRenderer.TILE_SIZE);
  34. float zoomRestrictionY = (r.getViewHeight() - HUDRenderer.OFFSET_Y) / (map.getHeight() * TileRenderer.TILE_SIZE);
  35. cam.limitScale(Math.max(zoomRestrictionX, zoomRestrictionY));
  36. float interScale = cam.getInterpolatedScale(lag);
  37. mapRenderer.setScale(interScale);
  38. float offX = getMapOffsetX(map, player, r, lag, interScale);
  39. float offY = getMapOffsetY(map, player, r, lag, interScale) + HUDRenderer.OFFSET_Y;
  40. mapRenderer.renderTick(map, r, player, false, offX, offY);
  41. if(gamestate.is(Gamestates.GAMEPLAY))
  42. {
  43. playerRenderer.renderTick(map, mapRenderer, r, player, lag, offX, offY);
  44. if(!level.isShowingScoreMenu())
  45. {
  46. hudRenderer.renderTick(r, player, lag);
  47. }
  48. else if(level.isShowingScoreMenu())
  49. {
  50. scoreRenderer.renderTick(r, lag, level);
  51. }
  52. }
  53. }
  54. private float getMapOffsetX(TileMap map, Player player, Renderer r, float lag, float interScale)
  55. {
  56. float ix = (player.getLastX() + (player.getX() - player.getLastX()) * lag) * interScale * TileRenderer.TILE_SIZE;
  57. float offX = (-ix + r.getViewWidth() * 0.5f) - TileRenderer.TILE_SIZE * 0.5f * interScale;
  58. float minOffX = -mapRenderer.getWidth(map) + r.getViewWidth();
  59. if(offX < minOffX)
  60. {
  61. return cam.getCamOffsetX(minOffX, minOffX, lag, interScale);
  62. }
  63. else if(offX > 0.0f)
  64. {
  65. return cam.getCamOffsetX(0.0f, minOffX, lag, interScale);
  66. }
  67. return cam.getCamOffsetX(offX, minOffX, lag, interScale);
  68. }
  69. private float getMapOffsetY(TileMap map, Player player, Renderer r, float lag, float interScale)
  70. {
  71. float viewHeight = r.getViewHeight() - HUDRenderer.OFFSET_Y;
  72. float iy = (player.getLastY() + (player.getY() - player.getLastY()) * lag) * interScale * TileRenderer.TILE_SIZE;
  73. float offY = (-iy + viewHeight * 0.5f) - TileRenderer.TILE_SIZE * 0.5f * interScale;
  74. float minOffY = -mapRenderer.getHeight(map) + viewHeight;
  75. if(offY < minOffY)
  76. {
  77. return cam.getCamOffsetY(minOffY, minOffY, lag, interScale);
  78. }
  79. else if(offY > 0.0f)
  80. {
  81. return cam.getCamOffsetY(0.0f, minOffY, lag, interScale);
  82. }
  83. return cam.getCamOffsetY(offY, minOffY, lag, interScale);
  84. }
  85. }