【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(); } }
実行結果
ディスカッション
コメント一覧
まだ、コメントがありません