JavaFX でゲーム作り
これは JavaFX Advent Calendar 2013 - Adventar の25日目のエントリです.
前日は,@skrb さんの「JavaFX 8 で 3D その 1 - JavaFX in the Box」でした.今日がクリスマスでJavaFX Advent Calender 最後の日ですね.ちなみに私はこれが初ブログなんですよw.
というわけでJavaFXを使ってゲームを作ってみます.作るゲームはブロック崩しです.JavaFXのサンプルにもあるのは知っているのですが(後から知ったけど).敢えて作るんです.ブロック崩し,だれでも遊び方を知っているし,ゲームにおける基本的な要素がすべて備わっていると思うのです.だれでも知っているし単純なので作るのが簡単です.これが作れれば,他のいろいろなゲームも作れますよね.まずは Netbeans でJavaFX FXMLアプリケーションとして作成していきます.お気軽な感じで良いですよね.Scene Builder でちゃちゃとGUI部品を適当に並べちゃいます.
FXMLのコード(Kuzushi.fxml)はこちらになりますです.特に説明が必要なところは無いですね.
つぎはコントーラ(KuzushiController.java)ですが,ゲームロジックは Game クラスにまとめることにします.「New Game」ボタンが押されたら新しい Game クラスのインスタンスを作っています.
つぎにゲームロジック(Game.java)を紹介します.Gameクラスはjavafx.concurrent.Task を継承しててメンバー変数とコンストラクタはつぎのようになります.
コンストラクタの引数で board をもらっています.ゲーム中のいろいろはこの board に関して行います.得点表示のための score,残りボール数表示のための ballCount は Text 型で textProperty をそれぞれ scoreProperty,ballCoundProperty に設定して表示できるようにしています.ゲーム終了表示のための gameOver も Text 型で最初は非表示にしています.initalize メソッドのコードはつぎの通りです.ブロック(Block)とボール(Ball)とパドル(Paddle)の生成をしています.
ブロック(Block)のコードは次の通りです.Rectangle を継承しています.コンストラクタで適当に設定を行い,自分自身を block リストに登録します.内部に得点(score)を持っていて,ボールと衝突したら得点を加えて自分自身を見えなくします.
ボール(Ball)とパドル(Paddle)ならパドルの方が簡単なのでパドルの方から説明します.コードはつぎのとおりです.やはり Rectangle を継承していて,xProperty を変更できるようにしています.コントローラの mouseMoveAction で move メソッドを呼んでパドルを動かします.
ボール(Ball)クラスはこんな感じになります.run メソッドは別途説明します.
checkCollision メソッドではすべてのブロックについてぶつかっていないか,checkPaddle メソッドではパドルとぶつかっていないか調べています.
問題の run メソッドはつぎのようになります.右下が 1,左下が 2,左上が 3,右上が4 として方向を設定して,自分自身を動かしています.ボールとパドルの衝突を調べて,衝突していたら方向を変えたりする等の適切な処理をしています.パドルの端にぶつかったら,進行方向を逆にしたり,ブロックが減って来たら速度を早くしたりするゲームを面白くする工夫もしています.stopFlag が偽の間 while ループを繰り返しています.
残りのメソッドは以下の通りです.得点の更新(updateScore)では,スコアが上限に達すると Ball の停止フラグ(stopFlag)を true にし,GAME OVER の表示を行います.reduceBallCount はボール数の表示を1だけ減らします.exec メソッドは New Game ボタンが押されたときに呼ばれるメソッドで, ball スレッドを開始しています.
最後に完成した画面のスナップショットの紹介です.
最後まで読み進めていただきありがとうございました!
今年もお世話になりました.良いお年をお迎えください.
また来年も宜しくお願いします!