diff --git a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java index d4d4e2f..e8b622f 100644 --- a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java +++ b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java @@ -2,6 +2,7 @@ package io.github.com.quillraven.screen; import com.badlogic.ashley.core.Engine; import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.maps.tiled.TiledMap; import io.github.com.quillraven.GdxGame; import io.github.com.quillraven.asset.MapAsset; import io.github.com.quillraven.system.RenderSystem; @@ -21,8 +22,8 @@ public class GameScreen extends ScreenAdapter { @Override public void show() { - this.tiledService.setMapChangeConsumer(this.engine.getSystem(RenderSystem.class)::onMapChange); - var startMap = this.tiledService.loadMap(MapAsset.MAIN); + this.tiledService.setMapChangeConsumer(this.engine.getSystem(RenderSystem.class)::setMap); + TiledMap startMap = this.tiledService.loadMap(MapAsset.MAIN); this.tiledService.setMap(startMap); } diff --git a/core/src/main/java/io/github/com/quillraven/system/RenderSystem.java b/core/src/main/java/io/github/com/quillraven/system/RenderSystem.java index 093d57c..288a597 100644 --- a/core/src/main/java/io/github/com/quillraven/system/RenderSystem.java +++ b/core/src/main/java/io/github/com/quillraven/system/RenderSystem.java @@ -3,45 +3,61 @@ package io.github.com.quillraven.system; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Family; import com.badlogic.ashley.systems.SortedIteratingSystem; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.tiled.TiledMap; -import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; +import com.badlogic.gdx.maps.tiled.tiles.AnimatedTiledMapTile; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.viewport.Viewport; -import io.github.com.quillraven.GdxGame; import io.github.com.quillraven.component.Graphic; import io.github.com.quillraven.component.Transform; +import io.github.com.quillraven.tiled.TiledRenderer; -public class RenderSystem extends SortedIteratingSystem { +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class RenderSystem extends SortedIteratingSystem implements Disposable { private final Batch batch; private final OrthographicCamera camera; private final Viewport viewport; - private final OrthogonalTiledMapRenderer mapRenderer; + + private final TiledRenderer tiledRenderer; + private final List fgdLayers; + private final List bgdLayers; public RenderSystem(Batch batch, Viewport viewport, OrthographicCamera camera) { super( Family.all(Transform.class, Graphic.class).get(), - (entity1, entity2) -> { - Transform transform1 = Transform.MAPPER.get(entity1); - Transform transform2 = Transform.MAPPER.get(entity2); - return transform1.compareTo(transform2); - } + Comparator.comparing(Transform.MAPPER::get) ); this.batch = batch; this.viewport = viewport; this.camera = camera; - this.mapRenderer = new OrthogonalTiledMapRenderer(null, GdxGame.UNIT_SCALE, batch); + this.tiledRenderer = new TiledRenderer(batch); + this.fgdLayers = new ArrayList<>(); + this.bgdLayers = new ArrayList<>(); } @Override public void update(float deltaTime) { + AnimatedTiledMapTile.updateAnimationBaseTime(); viewport.apply(); - mapRenderer.setView(camera); - mapRenderer.render(); batch.begin(); + batch.setColor(Color.WHITE); + this.tiledRenderer.setView(camera); + this.tiledRenderer.renderLayers(bgdLayers); + + forceSort(); super.update(deltaTime); + + batch.setColor(Color.WHITE); + this.tiledRenderer.renderLayers(fgdLayers); batch.end(); } @@ -53,18 +69,39 @@ public class RenderSystem extends SortedIteratingSystem { return; } + Vector2 position = transform.position(); + Vector2 size = transform.size(); batch.setColor(graphic.color()); batch.draw( graphic.region(), - transform.position().x, transform.position().y, - transform.size().x / 2, transform.size().y / 2, - transform.size().x, transform.size().y, + position.x, position.y, + size.x * 0.5f, size.y * 0.5f, + size.x, size.y, 1, 1, 0 ); } - public void onMapChange(TiledMap tiledMap) { - this.mapRenderer.setMap(tiledMap); + public void setMap(TiledMap tiledMap) { + this.tiledRenderer.setMap(tiledMap); + + this.fgdLayers.clear(); + this.bgdLayers.clear(); + List currentLayers = bgdLayers; + for (MapLayer layer : tiledMap.getLayers()) { + if ("objects".equals(layer.getName())) { + currentLayers = fgdLayers; + continue; + } + if (layer.getClass().equals(MapLayer.class)) { + continue; + } + currentLayers.add(layer); + } + } + + @Override + public void dispose() { + this.tiledRenderer.dispose(); } } diff --git a/core/src/main/java/io/github/com/quillraven/tiled/TiledRenderer.java b/core/src/main/java/io/github/com/quillraven/tiled/TiledRenderer.java new file mode 100644 index 0000000..3d0d73f --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/tiled/TiledRenderer.java @@ -0,0 +1,20 @@ +package io.github.com.quillraven.tiled; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; +import io.github.com.quillraven.GdxGame; + +import java.util.List; + +public class TiledRenderer extends OrthogonalTiledMapRenderer { + public TiledRenderer(Batch batch) { + super(null, GdxGame.UNIT_SCALE, batch); + } + + public void renderLayers(List layers) { + for (MapLayer layer : layers) { + this.renderMapLayer(layer); + } + } +} diff --git a/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java b/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java index 54b00a6..f8b077a 100644 --- a/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java +++ b/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java @@ -18,7 +18,7 @@ public class TiledService { } public TiledMap loadMap(MapAsset mapAsset) { - var tiledMap = this.assetService.load(mapAsset); + TiledMap tiledMap = this.assetService.load(mapAsset); tiledMap.getProperties().put("mapAsset", mapAsset); return tiledMap; }