add TiledRenderer for optimized rendering
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user