【JavaFX:2D横スクロールアクションゲーム】画像、音声の読み込み、ゲーム起動の実装
しばらく放置していましたがゲームプログラムのほうもぼちぼち進めていこうと思います。
前の記事 | 横スクロールアクションゲームTop | 次の記事 |
まずは基本の画像、音声読み込みや起動部分をさらっと作ってしまいます。
クラス構成は前回の的当てゲームでも利用したような形をそのまま流用します。
AppManagerに初期化メソッドstartを作成し、ここに初期化処理を実装します。
ライブラリの
GTKManagerFX.start(Stage, タイトル,アイコンパス,ウィンドウ横幅, ウィンドウ縦幅, 初期表示する画面)
を利用しウィンドウ表示処理を行います。GTKManagerFXには画像の取得や音声の再生を実行できるメソッドがあります。
一度取得した、効果音や画像データは自動的にキャッシュされますので、何度も同じデータをロードせずに済みます。
画像は的当てゲームの時よりも量がかなり増えましたので、ロード処理はDirectoryStreamを利用し、フォルダ内のファイルを全ロードするプログラムにしました。(※別にロードはしなくても問題ない)
効果音も同じ要領で実装しておきます。
//ゲームプログラムを開始する public static void start(Stage stage, ViewType type) { //ウィンドウの表示 GTKManagerFX.start(stage, "障害物回避ゲーム","img/icon.png",800, 600, get(type)); //画像フォルダの中身を全ロード try (DirectoryStreamds = Files.newDirectoryStream(Paths.get("img"))){ ds.forEach(p -> GTKManagerFX.loadImage(p.toString())); } catch (IOException e) { e.printStackTrace(); } //効果音フォルダの中身を全ロード try (DirectoryStream ds = Files.newDirectoryStream(Paths.get("se"))){ ds.forEach(p -> GTKManagerFX.loadSE(p.toString())); } catch (IOException e) { e.printStackTrace(); } }
次にBGMの再生メソッド、停止メソッド、画像の取得メソッドを作成します。画像や効果音はメソッドをたくさん作るのもどうかと思ったので、引数にファイル名を渡すと取得できるようにしました。
あとは画面遷移のメソッドや、アプリケーション終了メソッドなども用意しておきましょうか。
AppManager.java
package com.nompor.app.manager; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import com.nompor.app.view.DescriptionMode; import com.nompor.app.view.GameMode; import com.nompor.app.view.TitleMode; import com.nompor.app.view.ViewType; import com.nompor.gtk.fx.GTKManagerFX; import com.nompor.gtk.fx.GameViewFX; import javafx.scene.image.Image; import javafx.stage.Stage; //ゲームの画像や音声再生、画面遷移を制御するメソッド群 public class AppManager { //ゲームBGM開始 public static void gameBGMStart() { GTKManagerFX.loopBGM("bgm/aozoranoshitade.mp3"); } //ゲームタイトル開始 public static void titleBGMStart() { GTKManagerFX.loopBGM("bgm/title.mp3"); } //ゲームBGMの停止 public static void gameBGMStop() { GTKManagerFX.stopBGM(); } //ゲームプログラムを開始する public static void start(Stage stage, ViewType type) { //ウィンドウの表示 GTKManagerFX.start(stage, "障害物回避ゲーム","img/icon.png",800, 600, get(type)); //画像フォルダの中身を全ロード try (DirectoryStreamds = Files.newDirectoryStream(Paths.get("img"))){ ds.forEach(p -> GTKManagerFX.loadImage(p.toString())); } catch (IOException e) { e.printStackTrace(); } //効果音フォルダの中身を全ロード try (DirectoryStream ds = Files.newDirectoryStream(Paths.get("se"))){ ds.forEach(p -> GTKManagerFX.loadSE(p.toString())); } catch (IOException e) { e.printStackTrace(); } } //画像を読み込む public static Image getImage(String fileName) { return GTKManagerFX.getImage("img/"+fileName+".png"); } //効果音を再生する public static void playSE(String fileName) { GTKManagerFX.playSE("se/"+fileName+".mp3"); } //ゲーム画面を遷移する public static void change(ViewType type) { GTKManagerFX.changeViewDefaultAnimation(get(type)); } //ウィンドウ横幅取得 public static double getW() { return GTKManagerFX.getWidth(); } //ウィンドウ縦幅取得 public static double getH() { return GTKManagerFX.getHeight(); } //ゲーム画面を取得する private static GameViewFX get(ViewType type) { switch(type) { case TITLE: return new TitleMode(); case GAME: return new GameMode(); case DESCRIPTION: return new DescriptionMode(); default: break; } return null; } //アプリケーションを終了する public static void end() { GTKManagerFX.end(); } }
ObstacleAvoidStarter.javaにメインメソッドを実装します。JavaFXを利用しますので、Applicationクラスを継承し、startメソッドにStageを渡すようにしておきます。
import javafx.application.Application; import javafx.stage.Stage; //アプリケーションエントリポイント public class ObstacleAvoidStarter extends Application{ public static void main(String[] args) { launch(args); } public void start(Stage stage) throws Exception { //初期化時はタイトルを表示する AppManager.start(stage, ViewType.TITLE); } }
次の記事ではタイトル画面を作成するつもりでしたが、急遽予定を変更して、いきなりゲーム画面を作成するところから始めることにします。というのも、タイトル画面やチュートリアルでは最終的にはゲーム画面で使用するロジックを流用するつもりだからです。
ディスカッション
コメント一覧
まだ、コメントがありません