【JavaFX:横スクロールアクションゲーム】全ゲーム内オブジェクトのベースを作成する

2018年8月16日

前の記事 横スクロールアクションゲームTop 次の記事

ゲームプレイ中に出現する敵やブロック、プレイヤーなどのベースクラスを作成していきます。

オブジェクト系クラスは少し多くなります。ソースは一部のみ紹介と説明をします。全ソースはコメント付きで、gitにアップしていますのでそちらを参照ください。バージョンは1.00です。

クラス図

ゲーム内オブジェクトはすべてGameObjectクラスを継承して作成しますので、必要な機能は、このクラスに実装しておけば、他のオブジェクトを作成するときに面倒なことにはなりませんね。

表示と当たり判定のフィールドについて

まず当たり判定や表示処理ですが、これらは別のNodeオブジェクトとして持たせてそれぞれ管理することにしました。hitNodeとviewNodeのフィールドになります。

なぜ二つに分けたかですが、表示と当たり判定のNodeを同じオブジェクトにしてしまうと、当たり判定の細かい調整が容易ではなくなってしまうからです。

ゲームでは実際の表示領域より当たり判定を少し小さめにするほうが、プレイヤーのストレスを溜めにくいです。(ですよね?)

このような調整をするために二つのオブジェクトに分けることにしています。

クラス図に当たり判定を表すhitNodeはありますが、viewNodeが存在しません。GameObjectはライブラリのCameraTargetNode2Dクラスを継承させる予定なのですが、このクラスはカメラの対象にするためのNodeを保持します。なのでこのNodeをviewNodeとして扱います。



実装メソッド

一部実装メソッドを紹介します。

オブジェクトの動き

updateメソッドは個々のオブジェクトの動きを記述するための空メソッドです。

サブクラスでオーバーライドするためにあります。

このメソッドはゲーム管理クラスから毎フレーム呼び出されるようにするため、オブジェクトの個々の動きを定義するのに使います。

例えば敵クラスを継承して作成した場合で、左に移動させるだけの場合は、updateメソッドをオーバーライドし、x座標を減算させるだけの処理を記述します。

	//毎フレーム呼び出されるので、サブクラスで個々の動きを記述する
	public void update() {}

当たり判定

当たり判定はisHitメソッドで実行できるようにします。

判定処理は下記の記事で説明したintersectsメソッドで実装します。

ソースはこんな感じ。


	//引数のオブジェクトと衝突しているかどうか
	public boolean isHit(GameObject object) {
		Node node = object.getHitNode();
		return node != null && hitNode != null && object.getHitNode().getBoundsInParent().intersects(hitNode.getBoundsInParent());
	}

	//引数のオブジェクトと衝突しているかどうか
	public boolean isHit(Node node) {
		return node != null && hitNode != null && node.getBoundsInParent().intersects(hitNode.getBoundsInParent());
	}

一応引数にはGameObject 、Node を指定できるようにしています。

表示用Node

getViewNodeメソッドはオブジェクトの表示Nodeを返します。

ImageViewやライブラリのImageAnimationViewオブジェクトが設定されることがほとんどになりそうですね。

	//画面表示用Node
	public Node getViewNode() {
		//スーパークラスのgetNode呼び出し
		return super.getNode();
	}

生存状況

isAliveメソッドが生存状況を表すフラグです。

これらオブジェクトを管理するクラスからisAliveを監視し、falseとなった時に削除されるように、実装します。

このクラスでは普通にフラグを返すだけ。

	//このオブジェクトの生存状態
	public boolean isAlive() {
		return isAlive;
	}

クリックされた時のアクション

mouseActionメソッドはオブジェクトがクリックされた時の処理を記述します。

このクラスでは空メソッドとして定義しておき、必要ならサブクラスでオーバーライドします。

例えば、敵がクリックされたら削除されるようにしたい場合は、mouseActionメソッドをオーバーライドし、isAlive = false;を実装するだけです。

	//マウスアクション
	public final void onMouseAction(){
		if ( isMouseAction ) {
			mouseAction();
		}
	}

	//マウスクリックしたときの特定のアクション
	public void mouseAction() {}

管理クラスからはonMouseActionメソッドを呼び出すようにしておき、マウスアクションが有効な場合にオーバーライド用メソッドを呼び出すようにしておきます。

そうすると、サブクラスでマウスアクションが有効かどうかを判定する処理を実装しなくて済みますね。

移動メソッド

moveX、moveYメソッドはオブジェクトの移動処理を行うためのメソッドです。

当たり判定と、表示のオブジェクトを分けているため、移動処理時は、二つのNodeを移動させなければなりません。そのため、サブクラスでいちいち二つのNodeを動かす処理を書いていくのは面倒だと思い、このメソッドを実装しました。

	//横移動用メソッド
	public void moveX(double x) {
		getNode().setTranslateX(getNode().getTranslateX()+x);
		hitNode.setTranslateX(hitNode.getTranslateX()+x);
	}

	//縦移動用メソッド
	public void moveY(double y) {
		getNode().setTranslateY(getNode().getTranslateY()+y);
		hitNode.setTranslateY(hitNode.getTranslateY()+y);
	}

JavaJavaFX

Posted by nompor