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 @@
+
+
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;
+ }
+}