Segmentation Fault

いちおう技術系ブログ.信用しないでね.

JavaFX でゲーム作り

これは JavaFX Advent Calendar 2013 - Adventar の25日目のエントリです.

前日は,@skrb さんの「JavaFX 8 で 3D その 1 - JavaFX in the Boxでした.今日がクリスマスでJavaFX Advent Calender 最後の日ですね.ちなみに私はこれが初ブログなんですよw.

 

というわけでJavaFXを使ってゲームを作ってみます.作るゲームはブロック崩しです.JavaFXのサンプルにもあるのは知っているのですが(後から知ったけど).敢えて作るんです.ブロック崩し,だれでも遊び方を知っているし,ゲームにおける基本的な要素がすべて備わっていると思うのです.だれでも知っているし単純なので作るのが簡単です.これが作れれば,他のいろいろなゲームも作れますよね.まずは NetbeansJavaFX FXMLアプリケーションとして作成していきます.お気軽な感じで良いですよね.Scene Builder でちゃちゃとGUI部品を適当に並べちゃいます.

 

f:id:hkoide:20131221181434p:plain

 

FXMLのコード(Kuzushi.fxml)はこちらになりますです.特に説明が必要なところは無いですね.

 

f:id:hkoide:20131221181959p:plain

 

 つぎはコントーラ(KuzushiController.java)ですが,ゲームロジックは Game クラスにまとめることにします.「New Game」ボタンが押されたら新しい Game クラスのインスタンスを作っています.

 

f:id:hkoide:20131221183746p:plain

 

つぎにゲームロジック(Game.java)を紹介します.Gameクラスはjavafx.concurrent.Task を継承しててメンバー変数とコンストラクタはつぎのようになります.

 

f:id:hkoide:20131221184922p:plain

 

コンストラクタの引数で board をもらっています.ゲーム中のいろいろはこの board に関して行います.得点表示のための score,残りボール数表示のための ballCount は Text 型で textProperty をそれぞれ scoreProperty,ballCoundProperty に設定して表示できるようにしています.ゲーム終了表示のための gameOver も Text 型で最初は非表示にしています.initalize メソッドのコードはつぎの通りです.ブロック(Block)とボール(Ball)とパドル(Paddle)の生成をしています.

 

f:id:hkoide:20131221192827p:plain

 

ブロック(Block)のコードは次の通りです.Rectangle を継承しています.コンストラクタで適当に設定を行い,自分自身を block リストに登録します.内部に得点(score)を持っていて,ボールと衝突したら得点を加えて自分自身を見えなくします.

 

f:id:hkoide:20131221193546p:plain

 

ボール(Ball)とパドル(Paddle)ならパドルの方が簡単なのでパドルの方から説明します.コードはつぎのとおりです.やはり Rectangle を継承していて,xProperty を変更できるようにしています.コントローラの mouseMoveAction で move メソッドを呼んでパドルを動かします.

 

f:id:hkoide:20131221194430p:plain

 

ボール(Ball)クラスはこんな感じになります.run メソッドは別途説明します.

 

f:id:hkoide:20131221194854p:plain

 

checkCollision メソッドではすべてのブロックについてぶつかっていないか,checkPaddle メソッドではパドルとぶつかっていないか調べています.

問題の run メソッドはつぎのようになります.右下が 1,左下が 2,左上が 3,右上が4 として方向を設定して,自分自身を動かしています.ボールとパドルの衝突を調べて,衝突していたら方向を変えたりする等の適切な処理をしています.パドルの端にぶつかったら,進行方向を逆にしたり,ブロックが減って来たら速度を早くしたりするゲームを面白くする工夫もしています.stopFlag が偽の間 while ループを繰り返しています.

 

f:id:hkoide:20131221200036p:plain

 

残りのメソッドは以下の通りです.得点の更新(updateScore)では,スコアが上限に達すると Ball の停止フラグ(stopFlag)を true にし,GAME OVER の表示を行います.reduceBallCount はボール数の表示を1だけ減らします.exec メソッドは New Game ボタンが押されたときに呼ばれるメソッドで, ball スレッドを開始しています.

 

f:id:hkoide:20131221214836p:plain

 

最後に完成した画面のスナップショットの紹介です.

 

f:id:hkoide:20131221215249p:plain

 

最後まで読み進めていただきありがとうございました!

今年もお世話になりました.良いお年をお迎えください.

また来年も宜しくお願いします!