Java

JavaFXでかんたん風船アクションを作るPart2

前回

JavaFXでかんたん風船アクションを作るPart1※Java11の方は、JFXが使える環境が前提となります。 今回は、シリーズ「JavaFXでかんたん風船アクションゲームを...

このパートでは、登場人物(人ではありませんが)のプログラムを作っていきます。

このゲームでの登場人物は、「風船」と「障害物」の2つだけです。

風船を作る

Playerクラスを作成する

まずは、プレイヤーに関する処理を「Player」クラスに記述したいので、「Player.java」を作成してください。

風船を描画する

風船は「円」で表現するので、前回描画した円が「風船」とします。

ただ、このままではずっと「X:50」「Y:50」に描画され続けてしまいますので、プレイヤーの座標を保存するための変数を用意し、この変数の値が円の描画座標に反映されるようにします。

(Player.java)

(Main.java)

これでX・Y座標が反映されたので、次は「キー操作」によってこの値を変動させます。

キー入力処理を追加する

キー入力を行うには、「Scene」クラスの「setOnKey***」関数を用います。

「***」の中身は例えば、キーを押した時の処理は「setOnKeyPressed」となり、キーを離した時の処理は「setOnKeyReleased」という名前になります。

しかし、その処理を「Main.java」に書き込むとエラーになってしまいます。

(このプログラムを写す必要はありません)

(Main.java)

エラー内容

エラーの問題となっているのは、「Main」クラス内に「Scene」のインスタンスがないことです。

「Scene」のインスタンスは「MainApplication」クラス内にあるので、この処理は「MainApplication」クラス内に記述する必要があります。

(MainApplication.java)

「ofKeyPressed」関数と「ofKeyReleased」関数は「Main」クラス内でオーバーライドします。

(Main.java)

これで、キーを押した時に「キーが押されました/離されました」が出力されていれば成功です。

では次に、キー処理の中身に座標の変動を加えていきます。

キー操作で風船をジャンプさせる

このゲームでは、「スペースキー」を押すことによって、風船をジャンプさせることができます。

なので、キー処理に、「もしスペースキーが押されたら」という処理とともに、プレイヤーのY座標を変動させていきます。

まず、ジャンプには重力が必要なので、重力加速度を設定する必要があります。

それから、プレイヤー側の情報ですが、プレイヤー自身は「速度」と「ジャンプする時の速度」、そして「プレイヤーの重さ」を設定する必要があります。

(Player.java)

「プレイヤーの速度」には常に「mg(プレイヤーの重さ×重力加速度)」を加算していき、もしスペースキーが押されたら、「プレイヤーの速度」に「ジャンプ時の速度」を代入し、ジャンプさせます。

あとは天井との当たり判定を行い、際限なくジャンプし続けないようにします。

続いて「Main」クラスのプログラムです。

(Main.java)

障害物を作る

Obstacleクラスを作成する

障害物に関する処理は、すべてこの「Obstacle」クラス内に記述します。

なので、「Obstacle.java」というファイルを作成してください。

障害物を描画する

障害物は「矩形」で表現します。

まずはその「矩形」に関する情報を保存する変数群を宣言していき、「init」関数で変数の初期化を行い、「draw」関数で描画処理を記述していきます。

最後にゲッターとセッターの定義も行います。

(Obstacle.java)

次に、「Main」クラス内では、「Obstacle配列」型の変数「_obstacle」を宣言し、配列の数を「MAX_OBSTACLE」という名前の定数で定義します。

あとはプレイヤーの時と同じように「インスタンス化」、「init関数を呼ぶ」「draw関数を呼ぶ」処理を記述していき、最後にゲッターとセッターの定義も行います。

(Main.java)

結果

このような矩形が描画されていれば成功です。

障害物を自動的に生成する

ゲームでは一定の時間をおいて、障害物を自動で生成していきます。

そのために、障害物のX・Y座標と幅・高さ、色を自動で決定しています。

今から、それを行うための処理を記述していきます。

まずは、矩形が生成されているのか、それともされていないのかを保存するための変数を宣言する必要があるので、「boolean」型の「_exist」という変数を宣言します。

また、ゲームでは障害物が左へ流れていくので、その移動速度を保存する「float」型の「_vx」という変数も宣言します。

(Obstacle.java)

そして、「Main」クラス内に記述する内容ですが、「Obstacle」に関しては特にこれといった処理はありませんが、新たに「カウンタ」という要素を追加します。

(Main.java)

結果

このように障害物が流れてくれば成功です。

当たり判定

最後に当たり判定の処理を記述します。

「円」と「(X軸に対して平行な)矩形」の当たり判定は以下のように行なっていきます。

赤い円に注目してください。

この赤い円の中心座標から半径「r」に伸びている線は、破線の矩形内に入っているため、実線の矩形と当たっていることが言えます。

つまり、「円のX座標+半径r」が破線より内側で、なおかつ「円のY座標+半径r」も破線の内側だと、実線の矩形と当たっていることになります。

ちなみに実線は、実際に当たり判定を行う障害物(矩形)です。

 

しかし、上記の条件に当てはまらない例があります。

上の画像では、確かに「円のX座標+半径r」と「円のY座標+半径r」が破線より内側にありますが、実際には当たっていません。

なので、先ほど紹介したやり方だけでは、正確に当たり判定を行うことができません。

そこで、上の画像でいう「len(length:長さ の略)」の値を計算し、もし「len」が「円の半径r」より小さかったら当たっているという判定を行います。

 

まずは、「Player」クラスで「半径r」の値を定数化する必要があるので、「R」という定数名で定義をします。

そして当たり判定処理は「Main」クラス内に記述します。

(Player.java)

(Main.java)

矩形と当たった瞬間に、「当たりました」と出力されれば成功です。

 

これでプレイヤーと障害物の処理が完成しました。

次回(最終回)は画面遷移処理を完成させて、ゲーム自体も完成させます。

次回

JavaFXでかんたん風船アクションを作るPart3(最終回)前回 https://itech-program.com/java/1077 画面遷移を行う 画面の状態を決定する 今回のゲー...
ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。