Camera.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package pathgame.rendering;
  2. import pathgame.gameplay.Gamestate;
  3. import pathgame.gameplay.Gamestates;
  4. import pathgame.gameplay.Keys;
  5. import pathgame.gameplay.Level;
  6. /**
  7. * A container for all camera specific functions
  8. *
  9. * @author julia
  10. */
  11. public class Camera
  12. {
  13. private final static int CAM_SPEED = 64;
  14. private float lastScale = 1.0f;
  15. private float scale = 1.0f;
  16. private float lastCamOffsetX = 0.0f;
  17. private float lastCamOffsetY = 0.0f;
  18. private float camOffsetX = 0.0f;
  19. private float camOffsetY = 0.0f;
  20. /**
  21. * Recalculates the camera position every gametick based on user input
  22. *
  23. * @param level a level containing the current map and the current player
  24. * @param gamestate the gamestate
  25. */
  26. public void tick(Level level, Gamestate gamestate)
  27. {
  28. lastCamOffsetX = camOffsetX;
  29. lastCamOffsetY = camOffsetY;
  30. lastScale = scale;
  31. if(!level.getPlayer().isMoving() && gamestate.is(Gamestates.GAMEPLAY))
  32. {
  33. if(Keys.ZOOM_IN_KEY.isDown())
  34. {
  35. scale *= 1.1f;
  36. }
  37. else if(Keys.ZOOM_OUT_KEY.isDown())
  38. {
  39. scale /= 1.1f;
  40. }
  41. if(Keys.CAM_UP_KEY.isDown())
  42. {
  43. camOffsetY += CAM_SPEED;
  44. }
  45. if(Keys.CAM_DOWN_KEY.isDown())
  46. {
  47. camOffsetY -= CAM_SPEED;
  48. }
  49. if(Keys.CAM_LEFT_KEY.isDown())
  50. {
  51. camOffsetX += CAM_SPEED;
  52. }
  53. if(Keys.CAM_RIGHT_KEY.isDown())
  54. {
  55. camOffsetX -= CAM_SPEED;
  56. }
  57. }
  58. }
  59. /**
  60. * Limits scale of camera
  61. *
  62. * @param zoomRestriction the lower zoom factor restriction (zooming out
  63. * restriction)
  64. */
  65. public void limitScale(float zoomRestriction)
  66. {
  67. if(scale <= zoomRestriction)
  68. {
  69. scale = zoomRestriction;
  70. }
  71. if(lastScale <= zoomRestriction)
  72. {
  73. lastScale = zoomRestriction;
  74. }
  75. }
  76. /**
  77. * Resetting the camera to focus the player
  78. *
  79. */
  80. public void reset()
  81. {
  82. camOffsetX = 0.0f;
  83. camOffsetY = 0.0f;
  84. lastCamOffsetX = 0.0f;
  85. lastCamOffsetY = 0.0f;
  86. }
  87. /**
  88. * Returns the interpolated scale
  89. *
  90. * @param lag the render lag
  91. * @return the interpolated scale
  92. */
  93. public float getInterpolatedScale(float lag)
  94. {
  95. return lastScale + (scale - lastScale) * lag;
  96. }
  97. /**
  98. * Returns the x-offset of the camera to the player
  99. *
  100. * @param offX the x-offset of the map
  101. * @param minOffX the minimum x-offset restriction of the camera to prevent
  102. * going outside the screen
  103. * @param lag the render lag
  104. * @param interScale the interpolated scale
  105. * @return the x-offset of the camera to the player
  106. */
  107. public float getCamOffsetX(float offX, float minOffX, float lag, float interScale)
  108. {
  109. float interCamX = lastCamOffsetX + (camOffsetX - lastCamOffsetX) * lag;
  110. if(offX + interCamX > 0.0f)
  111. {
  112. camOffsetX = -offX;
  113. if(lastCamOffsetX > camOffsetX)
  114. {
  115. lastCamOffsetX = camOffsetX;
  116. }
  117. interCamX = lastCamOffsetX + (camOffsetX - lastCamOffsetX) * lag;
  118. }
  119. if(offX + interCamX < minOffX)
  120. {
  121. camOffsetX = minOffX - offX;
  122. if(lastCamOffsetX < camOffsetX)
  123. {
  124. lastCamOffsetX = camOffsetX;
  125. }
  126. interCamX = lastCamOffsetX + (camOffsetX - lastCamOffsetX) * lag;
  127. }
  128. return offX + interCamX;
  129. }
  130. /**
  131. * Returns the y-offset of the camera to the player
  132. *
  133. * @param offY the y-offset of the map
  134. * @param minOffY the minimum y-offset restriction of the camera to prevent
  135. * going outside the screen
  136. * @param lag the render lag
  137. * @param interScale the interpolated scale
  138. * @return the y-offset of the camera to the player
  139. */
  140. public float getCamOffsetY(float offY, float minOffY, float lag, float interScale)
  141. {
  142. float interCamY = lastCamOffsetY + (camOffsetY - lastCamOffsetY) * lag;
  143. if(offY + interCamY > 0.0f)
  144. {
  145. camOffsetY = -offY;
  146. if(lastCamOffsetY > camOffsetY)
  147. {
  148. lastCamOffsetY = camOffsetY;
  149. }
  150. interCamY = lastCamOffsetY + (camOffsetY - lastCamOffsetY) * lag;
  151. }
  152. if(offY + interCamY < minOffY)
  153. {
  154. camOffsetY = minOffY - offY;
  155. if(lastCamOffsetY < camOffsetY)
  156. {
  157. lastCamOffsetY = camOffsetY;
  158. }
  159. interCamY = lastCamOffsetY + (camOffsetY - lastCamOffsetY) * lag;
  160. }
  161. return offY + interCamY;
  162. }
  163. }