|
@@ -0,0 +1,119 @@
|
|
|
+package pathgame.rendering;
|
|
|
+
|
|
|
+import me.hammerle.snuviengine.api.Renderer;
|
|
|
+import me.hammerle.snuviengine.api.Texture;
|
|
|
+import me.hammerle.snuviengine.api.TextureRenderer;
|
|
|
+import pathgame.tilemap.TileMap;
|
|
|
+
|
|
|
+/** A renderer for tile maps.
|
|
|
+ *
|
|
|
+ * @author kajetan
|
|
|
+ */
|
|
|
+public class TileMapRenderer
|
|
|
+{
|
|
|
+ private final Texture tileTexture = new Texture("resources/tiles.png");
|
|
|
+ private final TextureRenderer textureRenderer = new TextureRenderer(20 * 20 * 2); // default to 20x20 map
|
|
|
+ private float scale = 1.0f;
|
|
|
+
|
|
|
+ /** Creates a new tile map renderer.
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public TileMapRenderer()
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Sets the scale of the map.
|
|
|
+ *
|
|
|
+ * @param scale the scale of the map
|
|
|
+ */
|
|
|
+ public void setScale(float scale)
|
|
|
+ {
|
|
|
+ this.scale = scale;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Returns the scale of the map.
|
|
|
+ *
|
|
|
+ * @return the scale of the map
|
|
|
+ */
|
|
|
+ public float getScale()
|
|
|
+ {
|
|
|
+ return scale;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Returns the scaled render width of a map.
|
|
|
+ *
|
|
|
+ * @param map a map
|
|
|
+ * @return the scaled render width of a map
|
|
|
+ */
|
|
|
+ public float getWidth(TileMap map)
|
|
|
+ {
|
|
|
+ return map.getWidth() * TileRenderer.TILE_SIZE * scale;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Returns the scaled render height of a map.
|
|
|
+ *
|
|
|
+ * @param map a map
|
|
|
+ * @return the scaled render height of a map
|
|
|
+ */
|
|
|
+ public float getHeight(TileMap map)
|
|
|
+ {
|
|
|
+ return map.getHeight() * TileRenderer.TILE_SIZE * scale;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateData(TileMap map)
|
|
|
+ {
|
|
|
+ textureRenderer.clear();
|
|
|
+ for(int x = 0; x < map.getWidth(); x++)
|
|
|
+ {
|
|
|
+ for(int y = 0; y < map.getHeight(); y++)
|
|
|
+ {
|
|
|
+ TileTexture tt = TileRenderer.getTileTexture(map, map.getTile(x, y), x, y);
|
|
|
+ if(tt == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ textureRenderer.addRectangle(
|
|
|
+ x * TileRenderer.TILE_SIZE, y * TileRenderer.TILE_SIZE,
|
|
|
+ (x + 1) * TileRenderer.TILE_SIZE, (y + 1) * TileRenderer.TILE_SIZE,
|
|
|
+ tt.getMinX(), tt.getMinY(), tt.getMaxX(), tt.getMaxY());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ textureRenderer.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Ticks the renderer. Used for animated tiles.
|
|
|
+ *
|
|
|
+ */
|
|
|
+ public void tick()
|
|
|
+ {
|
|
|
+ // tick tile animations here
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Draws the given map at the given offset.
|
|
|
+ *
|
|
|
+ * @param map a map
|
|
|
+ * @param r the renderer given by the engine
|
|
|
+ * @param forceUpdate whether an update of the render data should be forced
|
|
|
+ * @param offX the x coordinate of the offset
|
|
|
+ * @param offY the y coordinate of the offset
|
|
|
+ */
|
|
|
+ public void renderTick(TileMap map, Renderer r, boolean forceUpdate, float offX, float offY)
|
|
|
+ {
|
|
|
+ r.setTextureEnabled(true);
|
|
|
+ r.setColorEnabled(false);
|
|
|
+ r.setMixColorEnabled(false);
|
|
|
+
|
|
|
+ tileTexture.bind();
|
|
|
+
|
|
|
+ if(forceUpdate || map.isDirty())
|
|
|
+ {
|
|
|
+ updateData(map);
|
|
|
+ map.clean();
|
|
|
+ }
|
|
|
+
|
|
|
+ r.translateTo(offX, offY);
|
|
|
+ r.scale(scale, scale);
|
|
|
+ r.updateMatrix();
|
|
|
+ textureRenderer.draw();
|
|
|
+ }
|
|
|
+}
|