GameRenderer.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package me.hammerle.supersnuvi.rendering;
  2. import me.hammerle.supersnuvi.gamelogic.StateRenderer;
  3. import javafx.animation.AnimationTimer;
  4. import javafx.scene.Scene;
  5. import javafx.scene.canvas.Canvas;
  6. import javafx.scene.canvas.GraphicsContext;
  7. import javafx.scene.image.Image;
  8. import javafx.scene.input.KeyEvent;
  9. import javafx.scene.paint.Color;
  10. import javafx.scene.paint.Paint;
  11. import me.hammerle.supersnuvi.input.KeyHandler;
  12. import me.hammerle.text.SnuviTextPainter;
  13. public class GameRenderer extends AnimationTimer implements IGameRenderer
  14. {
  15. // constants
  16. public final static int TILE_SIZE = 32;
  17. // basic graphic stuff
  18. private final Scene scene;
  19. private final Canvas canvas;
  20. // input handler
  21. private final KeyHandler keys;
  22. // timing
  23. private long lastHandle;
  24. private long timingSum;
  25. // rendering
  26. private double cameraX;
  27. private double cameraY;
  28. private double offsetX;
  29. private double offsetY;
  30. private GraphicsContext context;
  31. // text rendering
  32. private final SnuviTextPainter textPainter;
  33. // world rendering
  34. private final StateRenderer state;
  35. public GameRenderer(Scene scene, Canvas canvas)
  36. {
  37. // basic graphic stuff
  38. this.scene = scene;
  39. this.canvas = canvas;
  40. // input handler
  41. this.keys = new KeyHandler();
  42. //timing
  43. this.lastHandle = 0;
  44. this.timingSum = 0;
  45. // rendering
  46. this.cameraX = 0;
  47. this.cameraY = 0;
  48. this.offsetX = 0;
  49. this.offsetY = 0;
  50. this.context = null;
  51. this.textPainter = new SnuviTextPainter(canvas);
  52. // events
  53. registerEvents();
  54. this.state = new StateRenderer(this);
  55. }
  56. private void registerEvents()
  57. {
  58. // basic input handling
  59. scene.setOnKeyPressed((KeyEvent e) ->
  60. {
  61. keys.pressKey(e.getCode());
  62. });
  63. scene.setOnKeyReleased((KeyEvent e) ->
  64. {
  65. keys.releaseKey(e.getCode());
  66. });
  67. // scene rescaling event
  68. scene.widthProperty().addListener((observable, oldValue, newValue) ->
  69. {
  70. if(oldValue.intValue() != 0)
  71. {
  72. canvas.setWidth(scene.getWidth());
  73. }
  74. });
  75. scene.heightProperty().addListener((observable, oldValue, newValue) ->
  76. {
  77. if(oldValue.intValue() != 0)
  78. {
  79. canvas.setHeight(scene.getHeight());
  80. }
  81. });
  82. }
  83. @Override
  84. public void handle(long now)
  85. {
  86. timingSum += now - lastHandle;
  87. lastHandle = now;
  88. if(timingSum >= 15900000)
  89. {
  90. timingSum = 0;
  91. keys.tick();
  92. prepareRendering();
  93. state.tick(keys);
  94. }
  95. }
  96. private void prepareRendering()
  97. {
  98. offsetX = -cameraX;
  99. offsetY = canvas.getHeight() + cameraY;
  100. context = canvas.getGraphicsContext2D();
  101. context.setFill(Color.BLACK);
  102. context.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
  103. }
  104. @Override
  105. public void prepareStringDrawing(Color c)
  106. {
  107. textPainter.prepareStringDrawing(c,
  108. Math.min
  109. (
  110. canvas.getHeight() / (textPainter.getBaseHeight() * LINES),
  111. canvas.getWidth() / (textPainter.getBaseWidth() * CHARS_PER_LINE))
  112. );
  113. }
  114. @Override
  115. public void stopStringDrawing()
  116. {
  117. textPainter.stopStringDrawing();
  118. }
  119. @Override
  120. public double getStringOffsetX(int x)
  121. {
  122. double width = canvas.getWidth();
  123. width -= textPainter.getWidth(CHARS_PER_LINE);
  124. width /= 2;
  125. return width + textPainter.getWidth(x);
  126. }
  127. @Override
  128. public double getStringOffsetY(int y)
  129. {
  130. double height = canvas.getHeight();
  131. height -= textPainter.getHeight() * LINES;
  132. height /= 2;
  133. return height + textPainter.getHeight() * y;
  134. }
  135. @Override
  136. public double getLineHeight()
  137. {
  138. return textPainter.getHeight();
  139. }
  140. @Override
  141. public double getStringWidth(int length)
  142. {
  143. return textPainter.getWidth(length);
  144. }
  145. @Override
  146. public double getStringWidth(String s)
  147. {
  148. return textPainter.getWidth(s);
  149. }
  150. @Override
  151. public double getCharsWidth(char[] chars)
  152. {
  153. return textPainter.getWidth(chars);
  154. }
  155. @Override
  156. public void drawString(String s, double x, double y)
  157. {
  158. textPainter.paintString(s, x, y);
  159. }
  160. @Override
  161. public void drawChars(char[] chars, double x, double y)
  162. {
  163. textPainter.paintString(chars, x, y);
  164. }
  165. @Override
  166. public void drawImage(Image image, double x, double y)
  167. {
  168. context.drawImage(image, offsetX + x, offsetY - y);
  169. }
  170. @Override
  171. public void drawBlockImage(Image image, int x, int y)
  172. {
  173. context.drawImage(image, offsetX + x * TILE_SIZE, offsetY - (y + 1) * TILE_SIZE);
  174. }
  175. @Override
  176. public void setStrokeColor(Color c)
  177. {
  178. context.setStroke(c);
  179. }
  180. @Override
  181. public void setFillColor(Color c)
  182. {
  183. context.setFill(c);
  184. }
  185. @Override
  186. public void fillRec(double x, double y, double width, double height, Color c)
  187. {
  188. Paint paint = context.getFill();
  189. context.setFill(c);
  190. context.fillRect(x, y, width, height);
  191. context.setFill(paint);
  192. }
  193. @Override
  194. public int getFirstVisibleBlockX()
  195. {
  196. return Math.max(0, (int) (cameraX / TILE_SIZE));
  197. }
  198. @Override
  199. public int getFirstVisibleBlockY()
  200. {
  201. return Math.max(0, (int) (cameraY / TILE_SIZE));
  202. }
  203. @Override
  204. public int getLastVisibleBlockX()
  205. {
  206. return getFirstVisibleBlockX() + (int) (canvas.getWidth() / TILE_SIZE);
  207. }
  208. @Override
  209. public int getLastVisibleBlockY()
  210. {
  211. return getFirstVisibleBlockY() + (int) (canvas.getHeight()/ TILE_SIZE);
  212. }
  213. @Override
  214. public int toBlock(double c)
  215. {
  216. return (int) (c / TILE_SIZE);
  217. }
  218. @Override
  219. public double toCoord(int b)
  220. {
  221. return b * TILE_SIZE;
  222. }
  223. }