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.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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user