【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();
}
}
実行結果










ディスカッション
コメント一覧
まだ、コメントがありません