From 4cff5d2992165a22618efedc3b1d2de837761d94 Mon Sep 17 00:00:00 2001 From: Quillraven Date: Sun, 25 May 2025 13:35:55 +0200 Subject: [PATCH] refactor rendersystem and introduce new TiledService and AssetService --- assets/maps/mystic.tiled-session | 23 ++++++++-- assets/maps/secondmap.tmx | 28 +++++++++++ .../io/github/com/quillraven/GameScreen.java | 40 ---------------- .../io/github/com/quillraven/GdxGame.java | 24 ++++++---- .../com/quillraven/asset/AssetService.java | 37 +++++++++++++++ .../github/com/quillraven/asset/MapAsset.java | 16 +++++++ .../com/quillraven/screen/GameScreen.java | 34 ++++++++++++++ .../com/quillraven/system/RenderSystem.java | 46 ++++--------------- .../system/TiledServiceTestSystem.java | 29 ++++++++++++ .../com/quillraven/tiled/TiledService.java | 40 ++++++++++++++++ 10 files changed, 227 insertions(+), 90 deletions(-) create mode 100644 assets/maps/secondmap.tmx delete mode 100644 core/src/main/java/io/github/com/quillraven/GameScreen.java create mode 100644 core/src/main/java/io/github/com/quillraven/asset/AssetService.java create mode 100644 core/src/main/java/io/github/com/quillraven/asset/MapAsset.java create mode 100644 core/src/main/java/io/github/com/quillraven/screen/GameScreen.java create mode 100644 core/src/main/java/io/github/com/quillraven/system/TiledServiceTestSystem.java create mode 100644 core/src/main/java/io/github/com/quillraven/tiled/TiledService.java diff --git a/assets/maps/mystic.tiled-session b/assets/maps/mystic.tiled-session index b5c895f..755bf9b 100644 --- a/assets/maps/mystic.tiled-session +++ b/assets/maps/mystic.tiled-session @@ -10,16 +10,27 @@ "fileStates": { "mainmap.tmx": { "scale": 1.74265625, - "selectedLayer": 3, + "selectedLayer": 4, "viewCenter": { - "x": 191.94835470277056, - "y": 356.35255088317047 + "x": 152.9274634627455, + "y": 285.1968080337129 } }, "objects.tsx": { - "dynamicWrapping": true + "dynamicWrapping": true, + "scaleInDock": 1, + "scaleInEditor": 1 + }, + "secondmap.tmx": { + "scale": 1.6328125, + "selectedLayer": 4, + "viewCenter": { + "x": 288.1531100478469, + "y": 256 + } }, "tileset.tsx": { + "dynamicWrapping": false, "scaleInDock": 1, "scaleInEditor": 1 } @@ -32,11 +43,13 @@ "map.width": 20, "openFiles": [ "mainmap.tmx", - "tileset.tsx" + "tileset.tsx", + "objects.tsx" ], "project": "mystic.tiled-project", "property.type": "float", "recentFiles": [ + "objects.tsx", "tileset.tsx", "mainmap.tmx" ], diff --git a/assets/maps/secondmap.tmx b/assets/maps/secondmap.tmx new file mode 100644 index 0000000..fa070c2 --- /dev/null +++ b/assets/maps/secondmap.tmx @@ -0,0 +1,28 @@ + + + + + + + eJx9k1EOgDAMQnuC0fufVj9c0jyhH426RmiBdVXpq/NWf89b7DXe3XfjHwHvGL5e+hfD9RR4Jyfx545acLjf1INcqr8W3CdhzRkFbrc3+elb0oN7J4+pjfNl027z12XM4au8rvOcZw6bnnBWzpw0Tr47zxKu67m7xDwkz1MuqWnCp5bprqQMu5mYGZfl2X8AE4YQ2w== + + + + + eJxjYBgFo2AUjIKBAQAEgAAB + + + + + eJxjYBgFo2AUjIKBAQAEgAAB + + + + + eJxjYBgFo2AUjIKBAQAEgAAB + + + + + + diff --git a/core/src/main/java/io/github/com/quillraven/GameScreen.java b/core/src/main/java/io/github/com/quillraven/GameScreen.java deleted file mode 100644 index cf7c840..0000000 --- a/core/src/main/java/io/github/com/quillraven/GameScreen.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.github.com.quillraven; - -import com.badlogic.ashley.core.Engine; -import com.badlogic.gdx.ScreenAdapter; -import com.badlogic.gdx.assets.AssetManager; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.utils.viewport.Viewport; -import io.github.com.quillraven.system.RenderSystem; - -public class GameScreen extends ScreenAdapter { - private final GdxGame game; - - private final SpriteBatch batch; - private final AssetManager assetManager; - private final Viewport viewport; - private final OrthographicCamera camera; - - private Engine engine; - - public GameScreen(GdxGame game) { - this.game = game; - this.batch = game.getBatch(); - this.assetManager = game.getAssetManager(); - this.viewport = game.getViewport(); - this.camera = game.getCamera(); - } - - @Override - public void show() { - engine = new Engine(); - engine.addSystem(new RenderSystem(batch, viewport, camera, assetManager)); - } - - @Override - public void render(float delta) { - delta = Math.min(1 / 30f, delta); - engine.update(delta); - } -} diff --git a/core/src/main/java/io/github/com/quillraven/GdxGame.java b/core/src/main/java/io/github/com/quillraven/GdxGame.java index 6cfaced..b2da70e 100644 --- a/core/src/main/java/io/github/com/quillraven/GdxGame.java +++ b/core/src/main/java/io/github/com/quillraven/GdxGame.java @@ -1,24 +1,29 @@ package io.github.com.quillraven; +import com.badlogic.gdx.Application; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; -import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.viewport.FitViewport; import com.badlogic.gdx.utils.viewport.Viewport; +import io.github.com.quillraven.asset.AssetService; +import io.github.com.quillraven.screen.GameScreen; import java.util.HashMap; public class GdxGame extends Game { public static final float WORLD_HEIGHT = 11f; public static final float WORLD_WIDTH = 6f; + public static final float UNIT_SCALE = 1f / 32f; - private SpriteBatch batch; - private AssetManager assetManager; + private Batch batch; + private AssetService assetService; private OrthographicCamera camera; private Viewport viewport; @@ -26,8 +31,10 @@ public class GdxGame extends Game { @Override public void create() { + Gdx.app.setLogLevel(Application.LOG_DEBUG); + batch = new SpriteBatch(); - assetManager = new AssetManager(); + assetService = new AssetService(new InternalFileHandleResolver()); camera = new OrthographicCamera(); viewport = new FitViewport(WORLD_WIDTH, WORLD_HEIGHT, camera); @@ -73,15 +80,16 @@ public class GdxGame extends Game { screenCache.clear(); batch.dispose(); - assetManager.dispose(); + assetService.debugDiagnostics(); + assetService.dispose(); } - public SpriteBatch getBatch() { + public Batch getBatch() { return batch; } - public AssetManager getAssetManager() { - return assetManager; + public AssetService getAssetService() { + return assetService; } public OrthographicCamera getCamera() { diff --git a/core/src/main/java/io/github/com/quillraven/asset/AssetService.java b/core/src/main/java/io/github/com/quillraven/asset/AssetService.java new file mode 100644 index 0000000..14632d4 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/asset/AssetService.java @@ -0,0 +1,37 @@ +package io.github.com.quillraven.asset; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.FileHandleResolver; +import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TmxMapLoader; +import com.badlogic.gdx.utils.Disposable; + +public class AssetService implements Disposable { + private final AssetManager assetManager; + + public AssetService(FileHandleResolver fileHandleResolver) { + this.assetManager = new AssetManager(fileHandleResolver); + this.assetManager.setLoader(TiledMap.class, new TmxMapLoader()); + } + + public TiledMap load(MapAsset mapAsset) { + this.assetManager.load(mapAsset.getPath(), TiledMap.class); + this.assetManager.finishLoading(); + return this.assetManager.get(mapAsset.getPath(), TiledMap.class); + } + + public void unload(MapAsset mapAsset) { + this.assetManager.unload(mapAsset.getPath()); + this.assetManager.finishLoading(); + } + + public void debugDiagnostics() { + Gdx.app.debug("AssetService", this.assetManager.getDiagnostics()); + } + + @Override + public void dispose() { + this.assetManager.dispose(); + } +} diff --git a/core/src/main/java/io/github/com/quillraven/asset/MapAsset.java b/core/src/main/java/io/github/com/quillraven/asset/MapAsset.java new file mode 100644 index 0000000..0829bfa --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/asset/MapAsset.java @@ -0,0 +1,16 @@ +package io.github.com.quillraven.asset; + +public enum MapAsset { + MAIN("mainmap.tmx"), + SECOND("secondmap.tmx"); + + private final String path; + + MapAsset(String mapName) { + this.path = "maps/" + mapName; + } + + public String getPath() { + return path; + } +} 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 new file mode 100644 index 0000000..d4d4e2f --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java @@ -0,0 +1,34 @@ +package io.github.com.quillraven.screen; + +import com.badlogic.ashley.core.Engine; +import com.badlogic.gdx.ScreenAdapter; +import io.github.com.quillraven.GdxGame; +import io.github.com.quillraven.asset.MapAsset; +import io.github.com.quillraven.system.RenderSystem; +import io.github.com.quillraven.system.TiledServiceTestSystem; +import io.github.com.quillraven.tiled.TiledService; + +public class GameScreen extends ScreenAdapter { + private final TiledService tiledService; + private final Engine engine; + + public GameScreen(GdxGame game) { + this.tiledService = new TiledService(game.getAssetService()); + this.engine = new Engine(); + this.engine.addSystem(new RenderSystem(game.getBatch(), game.getViewport(), game.getCamera())); + this.engine.addSystem(new TiledServiceTestSystem(this.tiledService)); + } + + @Override + public void show() { + this.tiledService.setMapChangeConsumer(this.engine.getSystem(RenderSystem.class)::onMapChange); + var startMap = this.tiledService.loadMap(MapAsset.MAIN); + this.tiledService.setMap(startMap); + } + + @Override + public void render(float delta) { + delta = Math.min(1 / 30f, delta); + engine.update(delta); + } +} 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 d4cb042..093d57c 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,34 +3,22 @@ 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.assets.AssetManager; import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.maps.tiled.TiledMap; -import com.badlogic.gdx.maps.tiled.TiledMapRenderer; -import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; -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; -/** - * System responsible for rendering entities with Transform and Graphic components. - * Also handles rendering the tiled map. - */ -public class RenderSystem extends SortedIteratingSystem implements Disposable { - private static final String MAP_PATH = "maps/mainmap.tmx"; - - private final SpriteBatch batch; +public class RenderSystem extends SortedIteratingSystem { + private final Batch batch; private final OrthographicCamera camera; private final Viewport viewport; - private final AssetManager assetManager; + private final OrthogonalTiledMapRenderer mapRenderer; - private TiledMapRenderer mapRenderer; - private TiledMap map; - - public RenderSystem(SpriteBatch batch, Viewport viewport, OrthographicCamera camera, AssetManager assetManager) { + public RenderSystem(Batch batch, Viewport viewport, OrthographicCamera camera) { super( Family.all(Transform.class, Graphic.class).get(), (entity1, entity2) -> { @@ -43,20 +31,7 @@ public class RenderSystem extends SortedIteratingSystem implements Disposable { this.batch = batch; this.viewport = viewport; this.camera = camera; - this.assetManager = assetManager; - - loadMap(); - } - - private void loadMap() { - if (!assetManager.isLoaded(MAP_PATH)) { - assetManager.setLoader(TiledMap.class, new TmxMapLoader()); - assetManager.load(MAP_PATH, TiledMap.class); - assetManager.finishLoading(); // Block until loaded - } - - map = assetManager.get(MAP_PATH, TiledMap.class); - mapRenderer = new OrthogonalTiledMapRenderer(map, 1f / 32f, batch); + this.mapRenderer = new OrthogonalTiledMapRenderer(null, GdxGame.UNIT_SCALE, batch); } @Override @@ -89,10 +64,7 @@ public class RenderSystem extends SortedIteratingSystem implements Disposable { ); } - @Override - public void dispose() { - if (map != null) { - map.dispose(); - } + public void onMapChange(TiledMap tiledMap) { + this.mapRenderer.setMap(tiledMap); } } diff --git a/core/src/main/java/io/github/com/quillraven/system/TiledServiceTestSystem.java b/core/src/main/java/io/github/com/quillraven/system/TiledServiceTestSystem.java new file mode 100644 index 0000000..79bc54d --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/system/TiledServiceTestSystem.java @@ -0,0 +1,29 @@ +package io.github.com.quillraven.system; + +import com.badlogic.ashley.core.EntitySystem; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import io.github.com.quillraven.asset.MapAsset; +import io.github.com.quillraven.tiled.TiledService; + +public class TiledServiceTestSystem extends EntitySystem { + private final TiledService tiledService; + + public TiledServiceTestSystem(TiledService tiledService) { + super(); + this.tiledService = tiledService; + } + + @Override + public void update(float deltaTime) { + if (Gdx.input.isKeyJustPressed(Input.Keys.X)) { + Gdx.app.debug("TiledServiceTestSystem", "Setting map to MAIN"); + var tiledMap = tiledService.loadMap(MapAsset.MAIN); + tiledService.setMap(tiledMap); + } else if (Gdx.input.isKeyJustPressed(Input.Keys.C)) { + Gdx.app.debug("TiledServiceTestSystem", "Setting map to SECOND"); + var tiledMap = tiledService.loadMap(MapAsset.SECOND); + tiledService.setMap(tiledMap); + } + } +} 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 new file mode 100644 index 0000000..54b00a6 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java @@ -0,0 +1,40 @@ +package io.github.com.quillraven.tiled; + +import com.badlogic.gdx.maps.tiled.TiledMap; +import io.github.com.quillraven.asset.AssetService; +import io.github.com.quillraven.asset.MapAsset; + +import java.util.function.Consumer; + +public class TiledService { + private final AssetService assetService; + private Consumer mapChangeConsumer; + private TiledMap currentMap; + + public TiledService(AssetService assetService) { + this.assetService = assetService; + this.mapChangeConsumer = null; + this.currentMap = null; + } + + public TiledMap loadMap(MapAsset mapAsset) { + var tiledMap = this.assetService.load(mapAsset); + tiledMap.getProperties().put("mapAsset", mapAsset); + return tiledMap; + } + + public void setMap(TiledMap tiledMap) { + if (this.currentMap != null) { + this.assetService.unload(this.currentMap.getProperties().get("mapAsset", MapAsset.class)); + } + + this.currentMap = tiledMap; + if (this.mapChangeConsumer != null) { + this.mapChangeConsumer.accept(tiledMap); + } + } + + public void setMapChangeConsumer(Consumer mapChangeConsumer) { + this.mapChangeConsumer = mapChangeConsumer; + } +}