add TiledRenderer for optimized rendering

This commit is contained in:
Quillraven
2025-05-25 14:24:17 +02:00
parent 4fbfb014a9
commit eab7f35a00
4 changed files with 78 additions and 20 deletions

View File

@@ -2,6 +2,7 @@ package io.github.com.quillraven.screen;
import com.badlogic.ashley.core.Engine; import com.badlogic.ashley.core.Engine;
import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.maps.tiled.TiledMap;
import io.github.com.quillraven.GdxGame; import io.github.com.quillraven.GdxGame;
import io.github.com.quillraven.asset.MapAsset; import io.github.com.quillraven.asset.MapAsset;
import io.github.com.quillraven.system.RenderSystem; import io.github.com.quillraven.system.RenderSystem;
@@ -21,8 +22,8 @@ public class GameScreen extends ScreenAdapter {
@Override @Override
public void show() { public void show() {
this.tiledService.setMapChangeConsumer(this.engine.getSystem(RenderSystem.class)::onMapChange); this.tiledService.setMapChangeConsumer(this.engine.getSystem(RenderSystem.class)::setMap);
var startMap = this.tiledService.loadMap(MapAsset.MAIN); TiledMap startMap = this.tiledService.loadMap(MapAsset.MAIN);
this.tiledService.setMap(startMap); this.tiledService.setMap(startMap);
} }

View File

@@ -3,45 +3,61 @@ package io.github.com.quillraven.system;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.SortedIteratingSystem; import com.badlogic.ashley.systems.SortedIteratingSystem;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Batch; 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.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 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.Graphic;
import io.github.com.quillraven.component.Transform; 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 Batch batch;
private final OrthographicCamera camera; private final OrthographicCamera camera;
private final Viewport viewport; private final Viewport viewport;
private final OrthogonalTiledMapRenderer mapRenderer;
private final TiledRenderer tiledRenderer;
private final List<MapLayer> fgdLayers;
private final List<MapLayer> bgdLayers;
public RenderSystem(Batch batch, Viewport viewport, OrthographicCamera camera) { public RenderSystem(Batch batch, Viewport viewport, OrthographicCamera camera) {
super( super(
Family.all(Transform.class, Graphic.class).get(), Family.all(Transform.class, Graphic.class).get(),
(entity1, entity2) -> { Comparator.comparing(Transform.MAPPER::get)
Transform transform1 = Transform.MAPPER.get(entity1);
Transform transform2 = Transform.MAPPER.get(entity2);
return transform1.compareTo(transform2);
}
); );
this.batch = batch; this.batch = batch;
this.viewport = viewport; this.viewport = viewport;
this.camera = camera; 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 @Override
public void update(float deltaTime) { public void update(float deltaTime) {
AnimatedTiledMapTile.updateAnimationBaseTime();
viewport.apply(); viewport.apply();
mapRenderer.setView(camera);
mapRenderer.render();
batch.begin(); batch.begin();
batch.setColor(Color.WHITE);
this.tiledRenderer.setView(camera);
this.tiledRenderer.renderLayers(bgdLayers);
forceSort();
super.update(deltaTime); super.update(deltaTime);
batch.setColor(Color.WHITE);
this.tiledRenderer.renderLayers(fgdLayers);
batch.end(); batch.end();
} }
@@ -53,18 +69,39 @@ public class RenderSystem extends SortedIteratingSystem {
return; return;
} }
Vector2 position = transform.position();
Vector2 size = transform.size();
batch.setColor(graphic.color()); batch.setColor(graphic.color());
batch.draw( batch.draw(
graphic.region(), graphic.region(),
transform.position().x, transform.position().y, position.x, position.y,
transform.size().x / 2, transform.size().y / 2, size.x * 0.5f, size.y * 0.5f,
transform.size().x, transform.size().y, size.x, size.y,
1, 1, 1, 1,
0 0
); );
} }
public void onMapChange(TiledMap tiledMap) { public void setMap(TiledMap tiledMap) {
this.mapRenderer.setMap(tiledMap); this.tiledRenderer.setMap(tiledMap);
this.fgdLayers.clear();
this.bgdLayers.clear();
List<MapLayer> 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();
} }
} }

View File

@@ -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<MapLayer> layers) {
for (MapLayer layer : layers) {
this.renderMapLayer(layer);
}
}
}

View File

@@ -18,7 +18,7 @@ public class TiledService {
} }
public TiledMap loadMap(MapAsset mapAsset) { public TiledMap loadMap(MapAsset mapAsset) {
var tiledMap = this.assetService.load(mapAsset); TiledMap tiledMap = this.assetService.load(mapAsset);
tiledMap.getProperties().put("mapAsset", mapAsset); tiledMap.getProperties().put("mapAsset", mapAsset);
return tiledMap; return tiledMap;
} }