【JavaFX:2D横スクロールアクションゲーム】画像、音声の読み込み、ゲーム起動の実装

2018年8月16日

しばらく放置していましたがゲームプログラムのほうもぼちぼち進めていこうと思います。

前の記事 横スクロールアクションゲーム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 (DirectoryStream ds = 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 (DirectoryStream ds = 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);
	}
}

次の記事ではタイトル画面を作成するつもりでしたが、急遽予定を変更して、いきなりゲーム画面を作成するところから始めることにします。というのも、タイトル画面やチュートリアルでは最終的にはゲーム画面で使用するロジックを流用するつもりだからです。

JavaJavaFX

Posted by nompor