From 7cf6dbe9e44041608cacee988626eba5f42e3f6b Mon Sep 17 00:00:00 2001 From: Quillraven Date: Sun, 1 Jun 2025 21:46:14 +0200 Subject: [PATCH] add animated water ripple tile and a trap trigger --- README.md | 1 + assets/audio/trap.wav | Bin 0 -> 18826 bytes assets/graphics/objects.atlas | 14 ++ assets/graphics/objects.png | Bin 14467 -> 15110 bytes assets/maps/mainmap.tmx | 17 +- assets/maps/mystic.tiled-project | 5 + assets/maps/objects.tsx | 10 +- assets/maps/objects/trap.png | Bin 0 -> 281 bytes assets/maps/tileset.png | Bin 10915 -> 11939 bytes assets/maps/tileset.tsx | 68 ++++---- assets_raw/map/Water_Ripple_00.png | Bin 0 -> 4277 bytes assets_raw/map/Water_Ripple_01.png | Bin 0 -> 4276 bytes assets_raw/map/Water_Ripple_02.png | Bin 0 -> 4283 bytes assets_raw/map/Water_Ripple_03.png | Bin 0 -> 4279 bytes assets_raw/map/tileset.png | Bin 9260 -> 9937 bytes assets_raw/objects/trap/idle_down_00.png | Bin 0 -> 281 bytes assets_raw/objects/trap/idle_down_01.png | Bin 0 -> 472 bytes .../com/quillraven/asset/SoundAsset.java | 1 + .../com/quillraven/component/Animation2D.java | 4 - .../com/quillraven/component/Tiled.java | 25 +++ .../com/quillraven/component/Trigger.java | 29 ++++ .../quillraven/input/IdleControllerState.java | 4 - .../com/quillraven/screen/GameScreen.java | 18 ++- .../com/quillraven/system/PhysicSystem.java | 47 +++++- .../com/quillraven/system/TriggerSystem.java | 75 +++++++++ ...wner.java => TiledAshleyConfigurator.java} | 151 +++++------------- .../com/quillraven/tiled/TiledService.java | 141 +++++++++++++++- .../quillraven/ui/model/GameViewModel.java | 2 +- 28 files changed, 445 insertions(+), 167 deletions(-) create mode 100644 assets/audio/trap.wav create mode 100644 assets/maps/objects/trap.png create mode 100644 assets_raw/map/Water_Ripple_00.png create mode 100644 assets_raw/map/Water_Ripple_01.png create mode 100644 assets_raw/map/Water_Ripple_02.png create mode 100644 assets_raw/map/Water_Ripple_03.png create mode 100644 assets_raw/objects/trap/idle_down_00.png create mode 100644 assets_raw/objects/trap/idle_down_01.png create mode 100644 core/src/main/java/io/github/com/quillraven/component/Tiled.java create mode 100644 core/src/main/java/io/github/com/quillraven/component/Trigger.java create mode 100644 core/src/main/java/io/github/com/quillraven/system/TriggerSystem.java rename core/src/main/java/io/github/com/quillraven/tiled/{TiledAshleySpawner.java => TiledAshleyConfigurator.java} (63%) diff --git a/README.md b/README.md index 5ea3b69..aad5cf6 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,4 @@ https://kenmi-art.itch.io/cute-fantasy-rpg https://yubatake.bandcamp.com/album/jrpg-collection https://crusenho.itch.io/complete-ui-essential-pack https://xdeviruchi.itch.io/8-bit-fantasy-adventure-music-pack +https://sfxr.me/ diff --git a/assets/audio/trap.wav b/assets/audio/trap.wav new file mode 100644 index 0000000000000000000000000000000000000000..2e962d0ea67db638ed6829646e198b7c954d4517 GIT binary patch literal 18826 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 literal 0 HcmV?d00001 diff --git a/assets/graphics/objects.atlas b/assets/graphics/objects.atlas index c87c44d..cdd59d4 100644 --- a/assets/graphics/objects.atlas +++ b/assets/graphics/objects.atlas @@ -361,3 +361,17 @@ player/walk_up orig: 32, 32 offset: 0, 0 index: 5 +trap/idle_down + rotate: false + xy: 38, 13 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: 0 +trap/idle_down + rotate: false + xy: 410, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: 1 diff --git a/assets/graphics/objects.png b/assets/graphics/objects.png index d945c67cdb6cab8890b40e978bbef799c5b68163..a1d600d7549e652c6c9259c9d8fa2118cad3f5d3 100644 GIT binary patch literal 15110 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 literal 14467 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 diff --git a/assets/maps/mainmap.tmx b/assets/maps/mainmap.tmx index 7d25cdc..0d417d6 100644 --- a/assets/maps/mainmap.tmx +++ b/assets/maps/mainmap.tmx @@ -1,21 +1,27 @@ - + - + - eJylkjsPwjAMhLPykCoeEjDBxkgzARPqBEywla2w9lfkp3OVYumwTAgwfFIb+c7xOcE5twRzgxUIXzAyzkpQxO8t2Cn2hmYNesZ5ET1uoCXuoIo1G0PD/92sC3CI2gs4EWejb+c5i3l48gjkUxm6XHgm9vGZWslSPBpQOztbQe9BZ8rURr0g/bheMr0mPHl3rXvdAe/CU8ZWD00qK/F5kM8vezvG2fgO1rvJ9WJt+aFev+9/6YOBYvimNnW3MZgophn9n9wdbaQ= + eJylkjsOwjAQRF3z6SI+HVBDzwGIa6BGqYEa+tAHLpCz+G5MJK80Wm2MgeJJibUz6511cM6twdJgA8IXTIyzEhTxew8OiqOh2YKBcV5EjwdoiSeoYs3O0PB/N+sKnKL2Bi7E1ejbeS5iHp48AvlUhi4Xnol9fKZWshSPBtQ92Qp6DzpTpjbqBenH9ZLpPeHJu2vVDngXnjK2emhSWYnPi3x+2ds5zsZ3sN5Nrhdryw/1+n3/yxCMFOOe2tTdpmCmmGf0fwPl7aDo - eJxjYBgFo2AUjALKgTES24hIPQAWrABm + eJxjYBgFo2AUjALKgQcQC0DZ7kTqAQAhOACg - + + + + + + + @@ -29,5 +35,6 @@ + diff --git a/assets/maps/mystic.tiled-project b/assets/maps/mystic.tiled-project index bd56eb2..a107de7 100644 --- a/assets/maps/mystic.tiled-project +++ b/assets/maps/mystic.tiled-project @@ -30,6 +30,11 @@ "type": "string", "value": "" }, + { + "name": "animationSpeed", + "type": "float", + "value": 0 + }, { "name": "atlasAsset", "propertyType": "AtlasAsset", diff --git a/assets/maps/objects.tsx b/assets/maps/objects.tsx index cf0e1bd..ef674dd 100644 --- a/assets/maps/objects.tsx +++ b/assets/maps/objects.tsx @@ -1,9 +1,10 @@ - + + @@ -35,4 +36,11 @@ + + + + + + + diff --git a/assets/maps/objects/trap.png b/assets/maps/objects/trap.png new file mode 100644 index 0000000000000000000000000000000000000000..655ce7e9c71f0c7888153ccca20af2718eff155b GIT binary patch literal 281 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 TN{#sOxrph1&A4e_+wT59;)ZMq literal 10915 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 pfv(;F4OTUDBbK+|6o_*ar0{_;PgJ17 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 diff --git a/assets/maps/tileset.tsx b/assets/maps/tileset.tsx index c508304..04271e4 100644 --- a/assets/maps/tileset.tsx +++ b/assets/maps/tileset.tsx @@ -1,6 +1,6 @@ - - + + @@ -32,71 +32,79 @@ + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -105,21 +113,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/assets_raw/map/Water_Ripple_00.png b/assets_raw/map/Water_Ripple_00.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4cc121ac719c44c7c5cd12181976aa537e7ca1 GIT binary patch literal 4277 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 X%^W#*c!b>m7c_Wsr@D7enzi6>-K!A8 literal 0 HcmV?d00001 diff --git a/assets_raw/map/tileset.png b/assets_raw/map/tileset.png index f238bc2810b8265ceffce07b7ae16f1091bd5785..a73a03b9c7249d1c42c0553e704db1b2db028fc7 100644 GIT binary patch literal 9937 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 OXKY})HbH-9z<&T@%LiEi diff --git a/assets_raw/objects/trap/idle_down_00.png b/assets_raw/objects/trap/idle_down_00.png new file mode 100644 index 0000000000000000000000000000000000000000..655ce7e9c71f0c7888153ccca20af2718eff155b GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4?JBQLn;`T9^B~LY$(uhQGes} zk4);Z2L(hlZ9KTFE^lJJ^!3WiJjUQ^5p9)A^^-)GGW`3_cU}75iz2(i>$Q`1?wsTQ zC;Z>Ps>kbotB81(%x_WZd^b5jMbK!r*_?z$TOP6qFXdIAq4Ds9-^||7)YQ<($k2Hw zb$0nXO?3J0sWIt=9jB{M`Ak=7KZC$q1x=lo+Jt?k>{hl;6$_g>6{Nm$%1yYT7i)#O zRGiW-gVexGSCzS`xq0KNHEXoASD!MTIeYqdf4SIm>UEDlEL^lJr2Oh@1 zH|m%#E3(MRr!yjDR%ft#>idYJ%Ad5HZpd#aSmq*EIQePJA}(dEcTs76HZv+N7|olh zkrT6UG0&o1)dh_PYHsg;^VR*Ws7X8i(RNEniOhXxZ&xsLjks~o?cLQn+pcv>UVh4@ zE86!yuxrB0qSk3#$G>a1o+#PrsZr*S#o&@H{XVCka#in=nJ|9}5Bf~`H=%k*fCgLmsgH^#!S1yIW>zCSZ%{+4p_ z@ejGjCp-EcSNEtZTlKv+oY(V0`oiL+i`GfC+)c_@xneb2;&zEBtyilYZ|E-NFl>9C ze*E*~ZtX205_uv5>8wDz&AB=@GwF)9NwXe_JoxgW;_S1+K!Z0 MAPPER = ComponentMapper.getFor(Tiled.class); + + private final int id; + private final MapObject mapObjectRef; + + public Tiled(MapObject mapObjectRef) { + this.id = mapObjectRef.getProperties().get("id", -1, Integer.class); + this.mapObjectRef = mapObjectRef; + } + + public int getId() { + return id; + } + + public MapObject getMapObjectRef() { + return mapObjectRef; + } +} diff --git a/core/src/main/java/io/github/com/quillraven/component/Trigger.java b/core/src/main/java/io/github/com/quillraven/component/Trigger.java new file mode 100644 index 0000000..961e683 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/component/Trigger.java @@ -0,0 +1,29 @@ +package io.github.com.quillraven.component; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; + +public class Trigger implements Component { + public static final ComponentMapper MAPPER = ComponentMapper.getFor(Trigger.class); + + private final String name; + private Entity triggeringEntity; + + public Trigger(String name) { + this.name = name; + this.triggeringEntity = null; + } + + public String getName() { + return name; + } + + public void setTriggeringEntity(Entity triggeringEntity) { + this.triggeringEntity = triggeringEntity; + } + + public Entity getTriggeringEntity() { + return triggeringEntity; + } +} diff --git a/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java b/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java index 428f4d9..c05362a 100644 --- a/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java +++ b/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java @@ -4,8 +4,4 @@ public class IdleControllerState implements ControllerState { @Override public void keyDown(Command command) { } - - @Override - public void keyUp(Command command) { - } } 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 index bef3ea7..904118f 100644 --- a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java +++ b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java @@ -28,7 +28,8 @@ import io.github.com.quillraven.system.PhysicDebugRenderSystem; import io.github.com.quillraven.system.PhysicMoveSystem; import io.github.com.quillraven.system.PhysicSystem; import io.github.com.quillraven.system.RenderSystem; -import io.github.com.quillraven.tiled.TiledAshleySpawner; +import io.github.com.quillraven.system.TriggerSystem; +import io.github.com.quillraven.tiled.TiledAshleyConfigurator; import io.github.com.quillraven.tiled.TiledService; import io.github.com.quillraven.ui.model.GameViewModel; import io.github.com.quillraven.ui.view.GameView; @@ -43,7 +44,7 @@ public class GameScreen extends ScreenAdapter { private final Viewport uiViewport; private final TiledService tiledService; private final Engine engine; - private final TiledAshleySpawner tiledAshleySpawner; + private final TiledAshleyConfigurator tiledAshleyConfigurator; private final World physicWorld; private final KeyboardController keyboardController; private final AudioService audioService; @@ -55,11 +56,11 @@ public class GameScreen extends ScreenAdapter { this.skin = game.getAssetService().get(SkinAsset.DEFAULT); this.viewModel = new GameViewModel(game); this.audioService = game.getAudioService(); - this.tiledService = new TiledService(game.getAssetService()); this.physicWorld = new World(Vector2.Zero, true); this.physicWorld.setAutoClearForces(false); + this.tiledService = new TiledService(game.getAssetService(), this.physicWorld); this.engine = new Engine(); - this.tiledAshleySpawner = new TiledAshleySpawner(this.engine, this.physicWorld, this.game.getAssetService()); + this.tiledAshleyConfigurator = new TiledAshleyConfigurator(this.engine, this.physicWorld, this.game.getAssetService()); this.keyboardController = new KeyboardController(GameControllerState.class, engine, null); // add ECS systems @@ -67,6 +68,7 @@ public class GameScreen extends ScreenAdapter { this.engine.addSystem(new PhysicSystem(physicWorld, 1 / 60f)); this.engine.addSystem(new FacingSystem()); this.engine.addSystem(new FsmSystem()); + this.engine.addSystem(new TriggerSystem(audioService)); this.engine.addSystem(new LifeSystem(this.viewModel)); this.engine.addSystem(new AnimationSystem(game.getAssetService())); this.engine.addSystem(new CameraSystem(game.getCamera())); @@ -83,12 +85,12 @@ public class GameScreen extends ScreenAdapter { this.stage.addActor(new GameView(stage, skin, this.viewModel)); Consumer renderConsumer = this.engine.getSystem(RenderSystem.class)::setMap; - Consumer ashleySpawnerConsumer = this.tiledAshleySpawner::loadMapObjects; Consumer cameraConsumer = this.engine.getSystem(CameraSystem.class)::setMap; Consumer audioConsumer = this.audioService::setMap; - this.tiledService.setMapChangeConsumer( - renderConsumer.andThen(ashleySpawnerConsumer).andThen(cameraConsumer).andThen(audioConsumer) - ); + this.tiledService.setMapChangeConsumer(renderConsumer.andThen(cameraConsumer).andThen(audioConsumer)); + this.tiledService.setLoadTriggerConsumer(tiledAshleyConfigurator::onLoadTrigger); + this.tiledService.setLoadObjectConsumer(tiledAshleyConfigurator::onLoadObject); + this.tiledService.setLoadTileConsumer(tiledAshleyConfigurator::onLoadTile); TiledMap startMap = this.tiledService.loadMap(MapAsset.MAIN); this.tiledService.setMap(startMap); diff --git a/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java b/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java index a749aa9..6408911 100644 --- a/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java +++ b/core/src/main/java/io/github/com/quillraven/system/PhysicSystem.java @@ -7,11 +7,17 @@ import com.badlogic.ashley.core.Family; import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.Contact; +import com.badlogic.gdx.physics.box2d.ContactImpulse; +import com.badlogic.gdx.physics.box2d.ContactListener; +import com.badlogic.gdx.physics.box2d.Manifold; import com.badlogic.gdx.physics.box2d.World; import io.github.com.quillraven.component.Physic; +import io.github.com.quillraven.component.Player; import io.github.com.quillraven.component.Transform; +import io.github.com.quillraven.component.Trigger; -public class PhysicSystem extends IteratingSystem implements EntityListener { +public class PhysicSystem extends IteratingSystem implements EntityListener, ContactListener { private final World world; private final float interval; @@ -22,6 +28,7 @@ public class PhysicSystem extends IteratingSystem implements EntityListener { this.world = world; this.interval = interval; this.accumulator = 0f; + world.setContactListener(this); } @Override @@ -86,4 +93,42 @@ public class PhysicSystem extends IteratingSystem implements EntityListener { } } + @Override + public void beginContact(Contact contact) { + Object userDataA = contact.getFixtureA().getBody().getUserData(); + Object userDataB = contact.getFixtureB().getBody().getUserData(); + + if (!(userDataA instanceof Entity entityA) || !(userDataB instanceof Entity entityB)) { + return; + } + + playerTriggerContact(entityA, entityB); + } + + private static void playerTriggerContact(Entity entityA, Entity entityB) { + Trigger trigger = Trigger.MAPPER.get(entityA); + boolean isPlayer = Player.MAPPER.get(entityB) != null; + if (trigger != null && isPlayer) { + trigger.setTriggeringEntity(entityB); + return; + } + + trigger = Trigger.MAPPER.get(entityB); + isPlayer = Player.MAPPER.get(entityA) != null; + if (trigger != null && isPlayer) { + trigger.setTriggeringEntity(entityA); + } + } + + @Override + public void endContact(Contact contact) { + } + + @Override + public void preSolve(Contact contact, Manifold oldManifold) { + } + + @Override + public void postSolve(Contact contact, ContactImpulse impulse) { + } } diff --git a/core/src/main/java/io/github/com/quillraven/system/TriggerSystem.java b/core/src/main/java/io/github/com/quillraven/system/TriggerSystem.java new file mode 100644 index 0000000..e79f89d --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/system/TriggerSystem.java @@ -0,0 +1,75 @@ +package io.github.com.quillraven.system; + +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.badlogic.ashley.utils.ImmutableArray; +import com.badlogic.gdx.graphics.g2d.Animation; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.Timer; +import io.github.com.quillraven.asset.SoundAsset; +import io.github.com.quillraven.audio.AudioService; +import io.github.com.quillraven.component.Animation2D; +import io.github.com.quillraven.component.Life; +import io.github.com.quillraven.component.Tiled; +import io.github.com.quillraven.component.Trigger; + +public class TriggerSystem extends IteratingSystem { + private final AudioService audioService; + + public TriggerSystem(AudioService audioService) { + super(Family.all(Trigger.class).get()); + this.audioService = audioService; + } + + @Override + protected void processEntity(Entity entity, float deltaTime) { + Trigger trigger = Trigger.MAPPER.get(entity); + if (trigger.getTriggeringEntity() == null) return; + + fireTrigger(trigger.getName(), trigger.getTriggeringEntity()); + trigger.setTriggeringEntity(null); + } + + private Entity getByTiledId(int tiledId) { + ImmutableArray entities = getEngine().getEntitiesFor(Family.all(Tiled.class).get()); + for (Entity entity : entities) { + if (Tiled.MAPPER.get(entity).getId() == tiledId) { + return entity; + } + } + return null; + } + + private void fireTrigger(String triggerName, Entity triggeringEntity) { + switch (triggerName) { + case "trap_trigger" -> trapTrigger(triggeringEntity); + default -> throw new GdxRuntimeException("Unsupported trigger: " + triggerName); + } + } + + private void trapTrigger(Entity triggeringEntity) { + Entity trapEntity = getByTiledId(15); + if (trapEntity != null) { + // play trap animation + Animation2D animation2D = Animation2D.MAPPER.get(trapEntity); + animation2D.setSpeed(1f); + animation2D.setPlayMode(Animation.PlayMode.NORMAL); + audioService.playSound(SoundAsset.TRAP); + // reset animation + Timer.schedule(new Timer.Task() { + @Override + public void run() { + animation2D.setSpeed(0f); + animation2D.setType(Animation2D.AnimationType.IDLE); + } + }, 2.5f); + + // damage player + Life life = Life.MAPPER.get(triggeringEntity); + if (life.getLife() > 2) { + life.addLife(-2f); + } + } + } +} diff --git a/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleySpawner.java b/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java similarity index 63% rename from core/src/main/java/io/github/com/quillraven/tiled/TiledAshleySpawner.java rename to core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java index 1b6f7fe..4dc15b1 100644 --- a/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleySpawner.java +++ b/core/src/main/java/io/github/com/quillraven/tiled/TiledAshleyConfigurator.java @@ -7,13 +7,10 @@ import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.FileTextureData; -import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.MapObject; import com.badlogic.gdx.maps.MapObjects; import com.badlogic.gdx.maps.objects.RectangleMapObject; -import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TiledMapTile; -import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; import com.badlogic.gdx.maps.tiled.objects.TiledMapTileMapObject; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; @@ -21,7 +18,6 @@ import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; import com.badlogic.gdx.physics.box2d.FixtureDef; -import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.GdxRuntimeException; import io.github.com.quillraven.GdxGame; @@ -39,10 +35,12 @@ import io.github.com.quillraven.component.Life; import io.github.com.quillraven.component.Move; import io.github.com.quillraven.component.Physic; import io.github.com.quillraven.component.Player; +import io.github.com.quillraven.component.Tiled; import io.github.com.quillraven.component.Transform; +import io.github.com.quillraven.component.Trigger; -public class TiledAshleySpawner { - private static final Vector2 DEFAULT_SCALING = new Vector2(1f, 1f); +public class TiledAshleyConfigurator { + private static final Vector2 DEFAULT_PHYSIC_SCALING = new Vector2(1f, 1f); private final Engine engine; private final World physicWorld; @@ -50,7 +48,7 @@ public class TiledAshleySpawner { private final Vector2 tmpVec2; private final AssetService assetService; - public TiledAshleySpawner(Engine engine, World physicWorld, AssetService assetService) { + public TiledAshleyConfigurator(Engine engine, World physicWorld, AssetService assetService) { this.engine = engine; this.physicWorld = physicWorld; this.tmpMapObjects = new MapObjects(); @@ -58,120 +56,49 @@ public class TiledAshleySpawner { this.assetService = assetService; } - public void loadMapObjects(TiledMap tiledMap) { - for (MapLayer layer : tiledMap.getLayers()) { - if (layer instanceof TiledMapTileLayer tileLayer) { - loadTileLayer(tileLayer); - } else if ("objects".equals(layer.getName())) { - loadObjectLayer(layer); - } else if ("trigger".equals(layer.getName())) { - loadTriggerLayer(layer); - } - } - - spawnMapBoundary(tiledMap); + public void onLoadTile(TiledMapTile tile, float x, float y) { + createBody(tile.getObjects(), + new Vector2(x, y), + DEFAULT_PHYSIC_SCALING, + BodyDef.BodyType.StaticBody, + Vector2.Zero, + "environment"); } - private void spawnMapBoundary(TiledMap tiledMap) { - // create four boxes for the map boundary (left, right, bottom and top edge) - int width = tiledMap.getProperties().get("width", 0, Integer.class); - int tileW = tiledMap.getProperties().get("tilewidth", 0, Integer.class); - int height = tiledMap.getProperties().get("height", 0, Integer.class); - int tileH = tiledMap.getProperties().get("tileheight", 0, Integer.class); - float mapW = width * tileW * GdxGame.UNIT_SCALE; - float mapH = height * tileH * GdxGame.UNIT_SCALE; - float halfW = mapW * 0.5f; - float halfH = mapH * 0.5f; - float boxThickness = 0.5f; - - BodyDef bodyDef = new BodyDef(); - bodyDef.type = BodyType.StaticBody; - bodyDef.position.setZero(); - bodyDef.fixedRotation = true; - Body body = physicWorld.createBody(bodyDef); - - // left edge - PolygonShape shape = new PolygonShape(); - shape.setAsBox(boxThickness, halfH, new Vector2(-boxThickness, halfH), 0f); - body.createFixture(shape, 0f).setFriction(0f); - shape.dispose(); - // right edge - shape = new PolygonShape(); - shape.setAsBox(boxThickness, halfH, new Vector2(mapW + boxThickness, halfH), 0f); - body.createFixture(shape, 0f).setFriction(0f); - shape.dispose(); - // bottom edge - shape = new PolygonShape(); - shape.setAsBox(halfW, boxThickness, new Vector2(halfW, -boxThickness), 0f); - body.createFixture(shape, 0f).setFriction(0f); - shape.dispose(); - // top edge - shape = new PolygonShape(); - shape.setAsBox(halfW, boxThickness, new Vector2(halfW, mapH + boxThickness), 0f); - body.createFixture(shape, 0f).setFriction(0f); - shape.dispose(); - } - - private void loadTileLayer(TiledMapTileLayer tileLayer) { - for (int y = 0; y < tileLayer.getHeight(); y++) { - for (int x = 0; x < tileLayer.getWidth(); x++) { - TiledMapTileLayer.Cell cell = tileLayer.getCell(x, y); - if (cell == null) continue; - - TiledMapTile tile = cell.getTile(); - createBody(tile.getObjects(), - new Vector2(x, y), - DEFAULT_SCALING, - BodyType.StaticBody, - Vector2.Zero, - "environment"); - } + public void onLoadTrigger(String triggerName, MapObject mapObject) { + if (mapObject instanceof RectangleMapObject rectMapObj) { + Entity entity = this.engine.createEntity(); + Rectangle rect = rectMapObj.getRectangle(); + addEntityTransform( + rect.getX(), rect.getY(), 0, + rect.getWidth(), rect.getHeight(), + 1f, 1f, + 0, + entity); + addEntityPhysic( + rectMapObj, + BodyDef.BodyType.StaticBody, + tmpVec2.set(rect.getX(), rect.getY()).scl(GdxGame.UNIT_SCALE), + entity); + entity.add(new Trigger(triggerName)); + entity.add(new Tiled(rectMapObj)); + this.engine.addEntity(entity); + } else { + throw new GdxRuntimeException("Unsupported map object type for trigger: " + mapObject.getClass().getSimpleName()); } } - private void loadTriggerLayer(MapLayer triggerLayer) { - for (MapObject mapObject : triggerLayer.getObjects()) { - if (mapObject instanceof RectangleMapObject rectMapObj) { - Entity entity = this.engine.createEntity(); - Rectangle rect = rectMapObj.getRectangle(); - addEntityTransform( - rect.getX(), rect.getY(), - rect.getWidth(), rect.getHeight(), - 1f, 1f, - 0, - entity); - addEntityPhysic( - rectMapObj, - BodyType.StaticBody, - tmpVec2.set(rect.getX(), rect.getY()).scl(GdxGame.UNIT_SCALE), - entity); - this.engine.addEntity(entity); - } else { - throw new GdxRuntimeException("Unsupported trigger: " + mapObject.getClass().getSimpleName()); - } - } - } - - private void loadObjectLayer(MapLayer objectLayer) { - for (MapObject mapObject : objectLayer.getObjects()) { - if (mapObject instanceof TiledMapTileMapObject tileMapObject) { - spawnEntityOf(tileMapObject); - } else { - throw new GdxRuntimeException("Unsupported object: " + mapObject.getClass().getSimpleName()); - } - } - } - - private void spawnEntityOf(TiledMapTileMapObject tileMapObject) { + public void onLoadObject(TiledMapTileMapObject tileMapObject) { Entity entity = this.engine.createEntity(); TiledMapTile tile = tileMapObject.getTile(); TextureRegion textureRegion = getTextureRegion(tile); String classType = tile.getProperties().get("type", "", String.class); float sortOffsetY = tile.getProperties().get("sortOffsetY", 0, Integer.class); sortOffsetY *= GdxGame.UNIT_SCALE; + int z = tile.getProperties().get("z", 1, Integer.class); addEntityTransform( - tileMapObject.getX(), tileMapObject.getY(), + tileMapObject.getX(), tileMapObject.getY(), z, textureRegion.getRegionWidth(), textureRegion.getRegionHeight(), tileMapObject.getScaleX(), tileMapObject.getScaleY(), sortOffsetY, @@ -190,6 +117,7 @@ public class TiledAshleySpawner { entity.add(new Facing(FacingDirection.DOWN)); entity.add(new Fsm(entity)); entity.add(new Graphic(textureRegion, Color.WHITE.cpy())); + entity.add(new Tiled(tileMapObject)); this.engine.addEntity(entity); } @@ -258,8 +186,9 @@ public class TiledAshleySpawner { AtlasAsset atlasAsset = AtlasAsset.valueOf(atlasAssetStr); FileTextureData textureData = (FileTextureData) tile.getTextureRegion().getTexture().getTextureData(); String atlasKey = textureData.getFileHandle().nameWithoutExtension(); + float speed = tile.getProperties().get("animationSpeed", 0f, Float.class); - entity.add(new Animation2D(atlasAsset, atlasKey, animationType, Animation.PlayMode.LOOP, 1f)); + entity.add(new Animation2D(atlasAsset, atlasKey, animationType, Animation.PlayMode.LOOP, speed)); } private void addEntityPhysic(MapObject mapObject, @SuppressWarnings("SameParameterValue") BodyType bodyType, Vector2 relativeTo, Entity entity) { @@ -305,7 +234,7 @@ public class TiledAshleySpawner { } private static void addEntityTransform( - float x, float y, + float x, float y, int z, float w, float h, float scaleX, float scaleY, float sortOffsetY, @@ -318,7 +247,7 @@ public class TiledAshleySpawner { position.scl(GdxGame.UNIT_SCALE); size.scl(GdxGame.UNIT_SCALE); - entity.add(new Transform(position, 0, size, scaling, 0f, sortOffsetY)); + entity.add(new Transform(position, z, size, scaling, 0f, sortOffsetY)); } } 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 index f8b077a..6cf4d83 100644 --- a/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java +++ b/core/src/main/java/io/github/com/quillraven/tiled/TiledService.java @@ -1,19 +1,43 @@ package io.github.com.quillraven.tiled; +import com.badlogic.gdx.maps.MapLayer; +import com.badlogic.gdx.maps.MapObject; +import com.badlogic.gdx.maps.objects.RectangleMapObject; import com.badlogic.gdx.maps.tiled.TiledMap; +import com.badlogic.gdx.maps.tiled.TiledMapTile; +import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; +import com.badlogic.gdx.maps.tiled.objects.TiledMapTileMapObject; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.physics.box2d.Body; +import com.badlogic.gdx.physics.box2d.BodyDef; +import com.badlogic.gdx.physics.box2d.PolygonShape; +import com.badlogic.gdx.physics.box2d.World; +import com.badlogic.gdx.utils.GdxRuntimeException; +import io.github.com.quillraven.GdxGame; import io.github.com.quillraven.asset.AssetService; import io.github.com.quillraven.asset.MapAsset; +import java.util.function.BiConsumer; import java.util.function.Consumer; public class TiledService { private final AssetService assetService; - private Consumer mapChangeConsumer; + private final World physicWorld; + private TiledMap currentMap; - public TiledService(AssetService assetService) { + private Consumer mapChangeConsumer; + private BiConsumer loadTriggerConsumer; + private Consumer loadObjectConsumer; + private LoadTileConsumer loadTileConsumer; + + public TiledService(AssetService assetService, World physicWorld) { this.assetService = assetService; + this.physicWorld = physicWorld; this.mapChangeConsumer = null; + this.loadTriggerConsumer = null; + this.loadObjectConsumer = null; + this.loadTileConsumer = null; this.currentMap = null; } @@ -29,6 +53,7 @@ public class TiledService { } this.currentMap = tiledMap; + loadMapObjects(tiledMap); if (this.mapChangeConsumer != null) { this.mapChangeConsumer.accept(tiledMap); } @@ -37,4 +62,116 @@ public class TiledService { public void setMapChangeConsumer(Consumer mapChangeConsumer) { this.mapChangeConsumer = mapChangeConsumer; } + + public void setLoadObjectConsumer(Consumer loadObjectConsumer) { + this.loadObjectConsumer = loadObjectConsumer; + } + + public void setLoadTriggerConsumer(BiConsumer loadTriggerConsumer) { + this.loadTriggerConsumer = loadTriggerConsumer; + } + + public void setLoadTileConsumer(LoadTileConsumer loadTileConsumer) { + this.loadTileConsumer = loadTileConsumer; + } + + public void loadMapObjects(TiledMap tiledMap) { + for (MapLayer layer : tiledMap.getLayers()) { + if (layer instanceof TiledMapTileLayer tileLayer) { + loadTileLayer(tileLayer); + } else if ("objects".equals(layer.getName())) { + loadObjectLayer(layer); + } else if ("trigger".equals(layer.getName())) { + loadTriggerLayer(layer); + } + } + + spawnMapBoundary(tiledMap); + } + + private void spawnMapBoundary(TiledMap tiledMap) { + // create four boxes for the map boundary (left, right, bottom and top edge) + int width = tiledMap.getProperties().get("width", 0, Integer.class); + int tileW = tiledMap.getProperties().get("tilewidth", 0, Integer.class); + int height = tiledMap.getProperties().get("height", 0, Integer.class); + int tileH = tiledMap.getProperties().get("tileheight", 0, Integer.class); + float mapW = width * tileW * GdxGame.UNIT_SCALE; + float mapH = height * tileH * GdxGame.UNIT_SCALE; + float halfW = mapW * 0.5f; + float halfH = mapH * 0.5f; + float boxThickness = 0.5f; + + BodyDef bodyDef = new BodyDef(); + bodyDef.type = BodyDef.BodyType.StaticBody; + bodyDef.position.setZero(); + bodyDef.fixedRotation = true; + Body body = physicWorld.createBody(bodyDef); + + // left edge + PolygonShape shape = new PolygonShape(); + shape.setAsBox(boxThickness, halfH, new Vector2(-boxThickness, halfH), 0f); + body.createFixture(shape, 0f).setFriction(0f); + shape.dispose(); + // right edge + shape = new PolygonShape(); + shape.setAsBox(boxThickness, halfH, new Vector2(mapW + boxThickness, halfH), 0f); + body.createFixture(shape, 0f).setFriction(0f); + shape.dispose(); + // bottom edge + shape = new PolygonShape(); + shape.setAsBox(halfW, boxThickness, new Vector2(halfW, -boxThickness), 0f); + body.createFixture(shape, 0f).setFriction(0f); + shape.dispose(); + // top edge + shape = new PolygonShape(); + shape.setAsBox(halfW, boxThickness, new Vector2(halfW, mapH + boxThickness), 0f); + body.createFixture(shape, 0f).setFriction(0f); + shape.dispose(); + } + + private void loadTileLayer(TiledMapTileLayer tileLayer) { + if (loadTileConsumer == null) return; + + for (int y = 0; y < tileLayer.getHeight(); y++) { + for (int x = 0; x < tileLayer.getWidth(); x++) { + TiledMapTileLayer.Cell cell = tileLayer.getCell(x, y); + if (cell == null) continue; + + loadTileConsumer.accept(cell.getTile(), x, y); + } + } + } + + private void loadTriggerLayer(MapLayer triggerLayer) { + if (loadTriggerConsumer == null) return; + + for (MapObject mapObject : triggerLayer.getObjects()) { + if (mapObject.getName() == null || mapObject.getName().isBlank()) { + throw new GdxRuntimeException("Trigger must have a name: " + mapObject); + } + + if (mapObject instanceof RectangleMapObject rectMapObj) { + loadTriggerConsumer.accept(mapObject.getName(), rectMapObj); + } else { + throw new GdxRuntimeException("Unsupported trigger: " + mapObject.getClass().getSimpleName()); + } + } + } + + private void loadObjectLayer(MapLayer objectLayer) { + if (loadObjectConsumer == null) return; + + for (MapObject mapObject : objectLayer.getObjects()) { + if (mapObject instanceof TiledMapTileMapObject tileMapObject) { + loadObjectConsumer.accept(tileMapObject); + } else { + throw new GdxRuntimeException("Unsupported object: " + mapObject.getClass().getSimpleName()); + } + } + } + + @FunctionalInterface + public interface LoadTileConsumer { + void accept(TiledMapTile tile, float x, float y); + } } diff --git a/core/src/main/java/io/github/com/quillraven/ui/model/GameViewModel.java b/core/src/main/java/io/github/com/quillraven/ui/model/GameViewModel.java index 2ae22c1..841d200 100644 --- a/core/src/main/java/io/github/com/quillraven/ui/model/GameViewModel.java +++ b/core/src/main/java/io/github/com/quillraven/ui/model/GameViewModel.java @@ -33,7 +33,7 @@ public class GameViewModel extends ViewModel { public void setLifePoints(int lifePoints) { if (this.lifePoints != lifePoints) { this.propertyChangeSupport.firePropertyChange(LIFE_POINTS, this.lifePoints, lifePoints); - if (this.lifePoints < lifePoints) { + if (this.lifePoints != 0 && this.lifePoints < lifePoints) { audioService.playSound(SoundAsset.LIFE_REG); } }