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.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);
}

View File

@@ -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<MapLayer> fgdLayers;
private final List<MapLayer> 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<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) {
var tiledMap = this.assetService.load(mapAsset);
TiledMap tiledMap = this.assetService.load(mapAsset);
tiledMap.getProperties().put("mapAsset", mapAsset);
return tiledMap;
}