初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

Processing 入門

23.潜水艦4 爆弾投下と複数キーの操作

 

今回は「潜水艦3 敵の表示と移動」の続きです。

昔、ゲームセンター用のゲームを作っていました。
発売する前のロケテストでは、プレイ時間、やられ方、また
どんなプレイをした人がコンティニューをするかなど情報を集めます。
その情報をもとにゲームの調整を行うのです。

一般人プレイヤーのデータって、とても役に立つんですよね。
ゲームを作ったならば誰かにプレイしてもらい、感想を聞いてみてください。
いろいろな発見があると思います。

 

 

プレイヤーから爆弾を投下しよう

プレイヤーから爆弾を投下するプログラムを作ります。
スペースキーを押したとき、爆弾を投下します。
爆弾の数は6個とします。
仕組みは敵のときとほぼ同じです。見比べながら作業しましょう。

 

爆弾を投下するプログラム

 

y座標の変数 bPy[ ]-20 のとき未使用としています。
-20 という数は適当です。画面から見えない座標ならOKです。

スペースキーが押されたかどうかの判断は 69 行目です。
key == ' ‘
2つのシングルコーテーションの間には半角スペースを入れてください。
(シングルコーテーションは7のキーにあります)
この方法でスペースキーが押されたかどうかを調べています。

 

実行してみましょう。
まず船を左右に動かし、キーが反応するか確認します。
(キーが反応しないときは、マウスでゲーム画面をクリック)
次にスペースバーを押して爆弾が投下されるか確認しましょう。

爆弾を投下するプログラム

 

少しでも長めにキーを押すと、連続して(つながって)投下されます。
これはキーの受付を毎フレームしているためです。

 

 

間隔を空けてキーを受け付けよう

爆弾が一発ずつ投下されるように、間隔をあけてキーを受け付けるようにします。
間隔をカウントするための変数 bombWait を用意します。

 

間隔をあけてキーを受け付ける

爆弾を投下するとき bombWait = 10 にしています。
これが0になるまで、次の爆弾を投下できないようにします。(74-75行目)

なお、&& などで条件を追加するとき複数行できます。
覚えておくといいでしょう。

 

実行してみましょう。
キーを押す長さに関係なく、一発ずつ投下されるようになりました。

間隔をあけた投下ができているか確認する

 

 

複数のキーを同時に判断しよう

船を左右に動かしながら、爆弾を投下してみてください。
「遊びにくい」と思いませんか?

原因は、スペースキーを押すと船の移動が止まってしまうからなんです。

 

移動しながら爆弾の投下ができない

 

どうして移動しながら投下できないのでしょうか。
船の移動のキー受け付け処理を見てみましょう。

船の移動のキーの受け付け処理

左右に動かすため keykeyCode を調べています。
この変数は、最後に押したキーの情報を持ちます。(厳密には少し違う)
爆弾投下でスペースキーを押すと値が変化するため、移動が停止してしまうのです。

63行目に println を入れて、2つの値の変化を確認してみてください。

 

 

この問題を解決します。
左右キーとスペースキー、3つのキーの受け付けを判断するため変数 keyState を用意します。
押している押していないという情報を持たせます。

移動と投下のキー受け付けを同時に行う

keyPressedkeyReleased を使います。
これらの関数は Processing が用意したもので
keyPressed はキーが押されるたびに呼び出されます。
keyReleased はキーが離されたときに呼び出されます。

この2つの関数を使って、変数 keyState に押下状態をセットします。
これだけで3つのキーを別々に判断することができます。

 

それでは実行してみましょう。
船を移動しながら爆弾の投下ができるようになりました。

移動しながら爆弾投下できるか確認する

 

 

未使用の爆弾を表示しよう

ゲームを作った本人は「爆弾はトータルで6発だ」と分かってますが
何も知らない人がプレイしたら「全部で何発撃てるんだろうか」と
いろいろと思ったりします。
ルールを見た目で分からせることも大切なので、爆弾の使用状況を
表示するようにしましょう。

画面上部の中央に、未使用の爆弾を表示します。

 

未使用の爆弾を表示する

 

簡単にできましたね。
実行してみましょう。

爆弾の使用状況を確認する