diff --git a/README.md b/README.md index b47f53e..737cf1a 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ https://kenmi-art.itch.io/cute-fantasy-rpg +https://yubatake.bandcamp.com/album/jrpg-collection diff --git a/assets/audio/town.ogg b/assets/audio/town.ogg new file mode 100644 index 0000000..fac2fa8 Binary files /dev/null and b/assets/audio/town.ogg differ diff --git a/assets/maps/mainmap.tmx b/assets/maps/mainmap.tmx index 1f14860..50ec2aa 100644 --- a/assets/maps/mainmap.tmx +++ b/assets/maps/mainmap.tmx @@ -1,5 +1,8 @@ + + + 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 d432b1f..02ff448 100644 --- a/core/src/main/java/io/github/com/quillraven/GdxGame.java +++ b/core/src/main/java/io/github/com/quillraven/GdxGame.java @@ -15,6 +15,7 @@ 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.audio.AudioService; import io.github.com.quillraven.screen.LoadingScreen; import java.util.HashMap; @@ -27,6 +28,7 @@ public class GdxGame extends Game { private Batch batch; private AssetService assetService; + private AudioService audioService; private OrthographicCamera camera; private Viewport viewport; private GLProfiler glProfiler; @@ -42,6 +44,7 @@ public class GdxGame extends Game { batch = new SpriteBatch(); assetService = new AssetService(new InternalFileHandleResolver()); + audioService = new AudioService(assetService); camera = new OrthographicCamera(); viewport = new FitViewport(WORLD_WIDTH, WORLD_HEIGHT, camera); @@ -117,4 +120,8 @@ public class GdxGame extends Game { public InputMultiplexer getInputMultiplexer() { return inputMultiplexer; } + + public AudioService getAudioService() { + return audioService; + } } 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 index 87c4ead..1dc5c91 100644 --- a/core/src/main/java/io/github/com/quillraven/asset/AssetService.java +++ b/core/src/main/java/io/github/com/quillraven/asset/AssetService.java @@ -3,6 +3,7 @@ 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.audio.Music; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TmxMapLoader; @@ -36,6 +37,18 @@ public class AssetService implements Disposable { return this.assetManager.get(atlasAsset.getPath(), TextureAtlas.class); } + public Music load(MusicAsset musicAsset) { + String path = musicAsset.getPath(); + this.assetManager.load(path, Music.class); + this.assetManager.finishLoading(); + return this.assetManager.get(path, Music.class); + } + + public void unload(MusicAsset musicAsset) { + this.assetManager.unload(musicAsset.getPath()); + this.assetManager.finishLoading(); + } + public boolean update() { return this.assetManager.update(); } diff --git a/core/src/main/java/io/github/com/quillraven/asset/MusicAsset.java b/core/src/main/java/io/github/com/quillraven/asset/MusicAsset.java new file mode 100644 index 0000000..94558bb --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/asset/MusicAsset.java @@ -0,0 +1,15 @@ +package io.github.com.quillraven.asset; + +public enum MusicAsset { + TOWN("town.ogg"); + + private final String path; + + MusicAsset(String musicFile) { + this.path = "audio/" + musicFile; + } + + public String getPath() { + return path; + } +} diff --git a/core/src/main/java/io/github/com/quillraven/audio/AudioService.java b/core/src/main/java/io/github/com/quillraven/audio/AudioService.java new file mode 100644 index 0000000..6dda9e9 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/audio/AudioService.java @@ -0,0 +1,45 @@ +package io.github.com.quillraven.audio; + +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.maps.tiled.TiledMap; +import io.github.com.quillraven.asset.AssetService; +import io.github.com.quillraven.asset.MusicAsset; + +public class AudioService { + + private final AssetService assetService; + private Music currentMusic; + private MusicAsset currentMusicAsset; + + public AudioService(AssetService assetService) { + this.assetService = assetService; + this.currentMusic = null; + this.currentMusicAsset = null; + } + + public void playMusic(MusicAsset musicAsset) { + if (this.currentMusicAsset == musicAsset) { + return; + } + + if (this.currentMusic != null) { + this.currentMusic.stop(); + this.assetService.unload(this.currentMusicAsset); + } + + this.currentMusic = this.assetService.load(musicAsset); + this.currentMusic.setLooping(true); + this.currentMusic.play(); + this.currentMusicAsset = musicAsset; + } + + public void setMap(TiledMap tiledMap) { + String musicAssetStr = tiledMap.getProperties().get("music", "", String.class); + if (musicAssetStr.isBlank()) { + return; + } + + MusicAsset musicAsset = MusicAsset.valueOf(musicAssetStr); + playMusic(musicAsset); + } +} 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 c867296..a1e8e7c 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 @@ -12,6 +12,7 @@ import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.Disposable; import io.github.com.quillraven.GdxGame; import io.github.com.quillraven.asset.MapAsset; +import io.github.com.quillraven.audio.AudioService; import io.github.com.quillraven.component.Controller; import io.github.com.quillraven.input.GameControllerState; import io.github.com.quillraven.input.KeyboardController; @@ -35,9 +36,11 @@ public class GameScreen extends ScreenAdapter { private final TiledAshleySpawner tiledAshleySpawner; private final World physicWorld; private final KeyboardController keyboardController; + private final AudioService audioService; public GameScreen(GdxGame game) { this.game = game; + this.audioService = game.getAudioService(); this.tiledService = new TiledService(game.getAssetService()); this.physicWorld = new World(Vector2.Zero, true); this.physicWorld.setAutoClearForces(false); @@ -66,7 +69,10 @@ public class GameScreen extends ScreenAdapter { Consumer renderConsumer = this.engine.getSystem(RenderSystem.class)::setMap; Consumer ashleySpawnerConsumer = this.tiledAshleySpawner::loadMapObjects; Consumer cameraConsumer = this.engine.getSystem(CameraSystem.class)::setMap; - this.tiledService.setMapChangeConsumer(renderConsumer.andThen(ashleySpawnerConsumer).andThen(cameraConsumer)); + Consumer audioConsumer = this.audioService::setMap; + this.tiledService.setMapChangeConsumer( + renderConsumer.andThen(ashleySpawnerConsumer).andThen(cameraConsumer).andThen(audioConsumer) + ); TiledMap startMap = this.tiledService.loadMap(MapAsset.MAIN); this.tiledService.setMap(startMap);