【JavaFX】ゲームループの実装

本稿ではJavaFXでゲームループを実装する方法を紹介します。

JavaFXにはすでにゲームループ実装に使えそうなAnimationTimerクラスが用意されています。

このAnimationTimerクラスはhandleメソッドがアニメーションに最適なフレームレートに合わせて呼び出されるため、非常に簡単にゲームループを作成できます。私の環境では60fpsで呼び出されました。

AnimationTimerのhandleメソッドをオーバーライドし、実装したい処理を記述していきます。

startメソッドを呼び出すと定期的にhandleメソッドが呼び出されます。

stopメソッドを呼び出すとタイマーを停止できます。

試しに、Canvasクラスと連携して回転+色変更エフェクトを使ったアニメーションを作成してみましょう。

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.effect.Bloom;
import javafx.scene.effect.ColorAdjust;
import javafx.scene.paint.Color;
import javafx.scene.transform.Affine;
import javafx.stage.Stage;

public class Test extends Application{

	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage primaryStage) {
		View v = new View();
		Scene scene = new Scene(v, 400, 300);
		primaryStage.setScene(scene);
		primaryStage.show();
	}

}

class View extends Group{
	public View() {
		Canvas cvs = new Canvas(400,300);
		getChildren().add(cvs);
		GraphicsContext g = cvs.getGraphicsContext2D();

		//ゲームループ用のアニメーションタイマー
		AnimationTimer timer = new AnimationTimer() {

			double angle = 0;
			double hue = -1;

			@Override
			public void handle(long now) {
				//画面を全消去
				g.clearRect(0, 0, 400, 300);

				//回転変換
				Affine af = new Affine();
				af.appendRotation(angle, 200, 150);
				g.setTransform(af);

				//青を基点に色変更系エフェクトをかける
				g.setFill(Color.BLUE);
				g.fillRect(100,100,200,100);

				//色相変換
				ColorAdjust ca = new ColorAdjust();
				ca.setHue(hue);

				//光ってるアピールエフェクト
				Bloom b = new Bloom(0);

				//色相変換と光りエフェクトをまとめる
				b.setInput(ca);

				//キャンバス全体にエフェクトの適用
				g.applyEffect(b);

				//回転値を加算
				angle++;

				//色相の変更値
				hue+=0.01;
				if ( hue > 1.0 ) hue = -1.0;

			}
		};

		//起動
		timer.start();
	}
}
実行結果

JavaJavaFX

Posted by nompor