LevelRenderer.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package pathgame.rendering;
  2. import me.hammerle.snuviengine.api.Renderer;
  3. import pathgame.gameplay.Gamestate;
  4. import pathgame.gameplay.Gamestates;
  5. import pathgame.gameplay.Level;
  6. import pathgame.gameplay.Player;
  7. import pathgame.tilemap.TileMap;
  8. /**
  9. * A container for holding everything about the renderer for the player
  10. *
  11. * @author julia
  12. */
  13. public class LevelRenderer
  14. {
  15. private final PlayerRenderer playerRenderer = new PlayerRenderer();
  16. private final TileMapRenderer mapRenderer = new TileMapRenderer();
  17. private final HUDRenderer hudRenderer = new HUDRenderer();
  18. private final Camera cam = new Camera();
  19. private final ScoreMenuRenderer scoreRenderer = new ScoreMenuRenderer();
  20. /**
  21. * Calls the camera tick and the mapRenderer tick and resets the camera if
  22. * the player is moving
  23. *
  24. * @param level a level containing the current map and the current player
  25. * @param gamestate the gamestate
  26. */
  27. public void tick(Level level, Gamestate gamestate)
  28. {
  29. cam.tick(level, gamestate);
  30. mapRenderer.tick();
  31. if(level.getPlayer().isMoving())
  32. {
  33. cam.reset();
  34. }
  35. }
  36. /**
  37. * Recalculates the rendering position and settings of everything in the
  38. * level every rendertick based on the gamelogic in the gametick
  39. *
  40. * @param r the renderer
  41. * @param lag the current lag
  42. * @param level the current level containing the map and the player
  43. * @param gamestate the gamestate
  44. */
  45. public void renderTick(Renderer r, float lag, Level level, Gamestate gamestate)
  46. {
  47. if(level.isShowingAfterScore() || level.isShowingScoreMenu())
  48. {
  49. lag = 0.0f;
  50. }
  51. TileMap map = level.getMap();
  52. Player player = level.getPlayer();
  53. float zoomRestrictionX = r.getViewWidth() / (map.getWidth() * TileRenderer.TILE_SIZE);
  54. float zoomRestrictionY = (r.getViewHeight() - HUDRenderer.OFFSET_Y) / (map.getHeight() * TileRenderer.TILE_SIZE);
  55. cam.limitScale(Math.max(zoomRestrictionX, zoomRestrictionY));
  56. float interScale = cam.getInterpolatedScale(lag);
  57. mapRenderer.setScale(interScale);
  58. float offX = getMapOffsetX(map, player, r, lag, interScale);
  59. float offY = getMapOffsetY(map, player, r, lag, interScale) + HUDRenderer.OFFSET_Y;
  60. mapRenderer.renderTick(map, r, player, false, offX, offY);
  61. if(gamestate.is(Gamestates.GAMEPLAY))
  62. {
  63. playerRenderer.renderTick(map, mapRenderer, r, player, lag, offX, offY);
  64. if(!level.isShowingScoreMenu())
  65. {
  66. hudRenderer.renderTick(r, player, lag);
  67. }
  68. else if(level.isShowingScoreMenu())
  69. {
  70. scoreRenderer.renderTick(r, lag, level);
  71. }
  72. }
  73. }
  74. private float getMapOffsetX(TileMap map, Player player, Renderer r, float lag, float interScale)
  75. {
  76. float ix = (player.getLastX() + (player.getX() - player.getLastX()) * lag) * interScale * TileRenderer.TILE_SIZE;
  77. float offX = (-ix + r.getViewWidth() * 0.5f) - TileRenderer.TILE_SIZE * 0.5f * interScale;
  78. float minOffX = -mapRenderer.getWidth(map) + r.getViewWidth();
  79. if(offX < minOffX)
  80. {
  81. return cam.getCamOffsetX(minOffX, minOffX, lag, interScale);
  82. }
  83. else if(offX > 0.0f)
  84. {
  85. return cam.getCamOffsetX(0.0f, minOffX, lag, interScale);
  86. }
  87. return cam.getCamOffsetX(offX, minOffX, lag, interScale);
  88. }
  89. private float getMapOffsetY(TileMap map, Player player, Renderer r, float lag, float interScale)
  90. {
  91. float viewHeight = r.getViewHeight() - HUDRenderer.OFFSET_Y;
  92. float iy = (player.getLastY() + (player.getY() - player.getLastY()) * lag) * interScale * TileRenderer.TILE_SIZE;
  93. float offY = (-iy + viewHeight * 0.5f) - TileRenderer.TILE_SIZE * 0.5f * interScale;
  94. float minOffY = -mapRenderer.getHeight(map) + viewHeight;
  95. if(offY < minOffY)
  96. {
  97. return cam.getCamOffsetY(minOffY, minOffY, lag, interScale);
  98. }
  99. else if(offY > 0.0f)
  100. {
  101. return cam.getCamOffsetY(0.0f, minOffY, lag, interScale);
  102. }
  103. return cam.getCamOffsetY(offY, minOffY, lag, interScale);
  104. }
  105. }