レッツ!スクラッチ (15) インベーダーゲームをつくろう ― アイテムをとってパワーアップさせよう!
さて、ゲームにとって欠かせないのは、パワーアップです。
アイテムをとってプレイヤーがパワーアップすることで、より敵を倒しやすくする、というものです。
今回は、一定数の敵を倒すと、アイテムが降ってきて、それをキャッチすると、一度にうてるたまの数が2発になる、というパワーアップをさせましょう。
さらに、そのパワーアップには持続時間があって、一定の時間が過ぎると元に戻るようにします。
また、アイテムを取ったときには点数も入るようにしましょう。
パワーアップしているときはロケットの見た目を変えるようにもしましょう。
ちょっともりだくさんですが、さっそく行ってみましょう!
アイテムをつくる
まずはアイテムのスプライトをつくりましょう。
「スプライトを選ぶ」から、アイテムっぽいイラストを選びます。
今回は「Star」(星)にします。
「Star」スプライトの初期設定をしましょう。
今回、大きさはそのままでよさそうです。それでも念のために大きさを100%に指定しておきましょう。
「旗マークが押されたとき」ブロックの下に「大きさを100%にする」ブロックを置きます。
更に、最初は隠しておくので、その下に「隠す」ブロックを置きます。
アイテムを出現させる
アイテムを出現させるには、まず、どういうときにアイテムが出てくるのかを考えます。
アイテムの出現条件は、2パターン考えられます。
- ある点数になったら出現する
- 一定時間が過ぎたら出現する
今回は一定時間が過ぎたらアイテムが降ってくるようにしましょう。
まずすべてのスプライト用の変数として「アイテム出現」をつくります。
「スプライト1」を表示します。
「旗マークが押されたとき」ブロックの「表示する」の下に「アイテム出現を0にする」ブロックをいれます。
「ずっと」ブロックの中の、一番下に「アイテム出現を1ずつ変える」を入れます。
その下に「もし なら」ブロックを置きます。
「もし なら」の穴には「 =50 」ブロックを入れます。
「 =50 」ブロックの左側には「アイテム出現」変数ブロック、右側は「200」とします。
「もしアイテム出現=200なら」ブロックの中には、「(メッセージ)を送る」ブロックを入れて、メッセージは新しく「アイテム出現」をつくります。
「Star」スプライトを開きます。
「アイテム出現を受け取ったとき」ブロックを置き、「自分自身のクローンを作る」ブロックをくっつけます。
「クローンされたとき」ブロックを置きます。
その下に「表示する」ブロックをくっつけます。
これで、クローンされたらアイテムが表示されます。
次に、「x座標を0、y座標を0にする」ブロックを置き、左側に「1から10までの乱数」ブロックを入れて、「-200から200までの乱数」にします。
右側には「150」と入力します。
これで、「アイテム出現」変数が200になったらアイテムが上の方に表示されるようになりました。
次はアイテムが下に落ちてくる処理を入れます。
「ずっと」ブロックをその下に入れます。
その中に「y座標を-5ずつ変える」ブロックを入れます。
せっかくだから、アイテムが落ちてくるときにクルクルと回転させましょう。
「y座標を-5ずつ変える」ブロックの下に「15度回す」ブロックを入れます。
画面下についたらアイテムを消す処理を入れます。
「5度回す」ブロックの下に「もし なら」ブロックを入れます。
「もし なら」の穴に「 <50 」ブロックを入れて、左側に「y座標」ブロックを入れます。
右側には「-165」と入力します。
-165は、アイテムが画面下についたときのy座標です。
これより下になったら消す処理をします。
「このクローンを削除する」ブロックを入れます。
これでアイテムが画面下に落ちたら消えるようになりました。
次は、アイテムにロケットが触れた場合に、アイテムを消える処理を入れます。
さっきの「もしy座標<-165なら」ブロックの下に「もし なら」ブロックを入れます。
「もし なら」の穴に「スプライト1に触れた」ブロックを入れます。
その中に「(メッセージ)を送る」ブロックを入れ、新しいメッセージとして「アイテムゲット」というメッセージをつくります。
「アイテムゲットを送る」ブロックの下に「このクローンを削除する」ブロックを入れます。
ここまでで、アイテムをゲットしたときの処理ができました。
しかし、このままだとアイテムを取り逃したときに、再びアイテムが出てこなくなってしまいます。
そこで、「クローンされたとき」ブロック内の「もしy座標<-165なら」の中に「アイテム出現を0にする」ブロックを入れることで、「アイテム出現」変数の数字を0に戻します。
アイテムの効力を考える
さて、アイテムが降ってきて、とるところまではできました。
次は、アイテムを取ったらどういう効果があるのかを考えます。
パワーアップですから、ここでは以下のような効力を得られるようにしましょう。
- ロケットの見た目が変わる
- 一回敵のたまに当たってもやられない
- たまを2連射できるようになる
- 敵を倒したときの点数が5倍になる
ロケットの見た目が変わる
パワーアップしたことが一目でわかるように、アイテムを取ったら見た目を変えてみましょう。
「スプライト1」を表示します。
「コスチューム」タブを開きます。
「コスチュームを選ぶ」から再び同じロケットのイラスト(Rocketship-e」を選びます。
このロケットの色を変えましょう。
「塗りつぶし」アイコンを使って、ロケットを好きな色に塗ってみましょう。
ここでは赤と黄色でぬって、パワーアップした感じを出してみました。
このときの左側のイラストの名前を覚えておきましょう。
ここでは「Rocketship-e2」です。
「コード」タブを開きます。
「アイテムゲットを受け取ったとき」ブロックを置き、その下に「コスチュームをRocketship-e2にする」ブロックをくっつけます。
スタート時は元のロケットの画像にするので、「旗マークが押されたとき」ブロックの下に「コスチュームをRocketship-eにする」ブロックを置きます。
Rocketship-eは元の画像です。
これでアイテムをとるとロケットの色が変わります。
これでもいいのですが、折角だからパワーアップであることを目立たせるために、見た目をチカチカさせてみましょう。
「コスチュームをRocketship-e2にする」ブロックの下に「1秒待つ」ブロックを入れて、「0.3秒待つ」に変えます。
その下に「コスチュームをRocketship-eにする」ブロックを入れます。
さらにその下に「0.3秒待つ」ブロックを入れます。
これで、アイテムをとるとロケットの見た目が点滅しているようになります。
一回敵のたまに当たってもやられない
パワーアップしたあとで、敵のたまに当たったら、パワーアップの効果がなくなる代わりに、一回だけやられないようにしてみましょう。
まずは変数「パワーアップ」をすべてのスプライト用としてつくります。
「スプライト1」を表示します。
「アイテムゲットを受け取ったとき」ブロックの下に、「パワーアップを1にする」ブロックを入れます。
「Lightning」スプライトを表示します。
「クローンされたとき」ブロック内の「もしスプライト1に触れたなら」ブロック内に、「もし なら でなければ」ブロックを入れます。
「もし なら」の穴に「 =50 」ブロックを入れます。
「 =50 」ブロックを「パワーアップ=1」にします。
「パワーアップを0にする」ブロックをその中に入れます。
その下に「このクローンを削除する」ブロックを入れます。
「でなければ」の下に「ゲームオーバーを送る」を移します。
「スプライト1」スプライトを表示します。
「アイテムゲットを受け取ったとき」ブロック内の「ずっと」ブロックに、「もし なら でなければ」ブロックを入れ、「でなければ」の中に、「コスチュームをRocketship-e2にする」「0.3秒待つ」「コスチュームをRocketship-eにする」「0.3秒待つ」ブロックを移動します。
「もし なら」ブロックの穴に「 =50 」ブロックを入れ、左側に「パワーアップ」、右側を「0」にします。
「もしパワーアップが0なら」ブロックに、「コスチュームをRocketship-eにする」ブロックを入れます。
これでパワーアップ時に敵のたまを受けると、パワーアップが解除されるようになります。
そのあとに敵のたまに再びあたるとゲームオーバーになります。
パワーアップが解除されたら、再び時間がたてばアイテムが降ってくるようにしたいので、「コスチュームをRocketship-eにする」ブロックの下に「アイテム出現を0にする」ブロックを入れます。
これでゲームを動かしてみると、アイテムを取ってパワーアップした後に、敵のたまを受けると、「アイテム出現」変数は0になりますが、その後、0から増えなくなります。
なぜでしょうか?
これは、「アイテムゲットを受け取ったとき」ブロックの「ずっと」ブロックをゲームが動いている間中、プログラムとして実行しているからです。
パワーアップが0になったら、この「ずっと」ブロックの動作は終了しなければなりません。
そういうときは、先ほどの「アイテム出現を0にする」ブロックの下に「すべてを止める」ブロックを入れて、「このスクリプトを止める」に変えます。
こうすることで、アイテム出現を0にしたタイミングで、このブロックの「ずっと」の処理を止めることができます。
バグ取りをしよう
さて、ここまでできて、ゲームをプレイしてみましょう。
スペースキーを連打しながらゲームを進めていると、自分がパワーアップした状態で、スペースキーを常に連打していて、敵が自分の陣地まで降りてきてしまった場合、これまでの処理ではゲームオーバーになるはずです。
ところが、
- 自分がパワーアップしている
- スペースキーを連打している
- 敵が自分の陣地まで降りてくる
という条件がそろうと、ゲームオーバーにならずに、ずっと自分が爆発を続け、敵は画面の一番下でいったりきたりを続けてしまうことがあります。
どうやら、どこかの処理が「ゲームオーバー」表示を邪魔をしているようです。
敵がいったりきたりして消えないので、「Ghost」スプライトを見てみましょう。
ここで、敵が自分の陣地まできたときにはゲームオーバーにする、という処理を作っている箇所があります。
「もしy座標<-70なら」「ゲームオーバーを送る」というところですね。
ゲームオーバーになったときに、敵のクローンを削除していないために、敵がずっといったりきたりしてしまうのではないでしょうか。
そこで、「ゲームオーバーを送る」ブロックの下に「このクローンを削除する」ブロックを入れましょう。
「もしy座標<-70なら」「ゲームオーバーを送る」という処理は2か所あるので、2か所とも「このクローンを削除する」ブロックを入れておきます。
これで先ほどと同じ条件でゲームをプレイしてみると、今度はきちんとゲームオーバー処理がされるようになりました。
このように、いろんな操作をして、思った通りに動かないことを確認したら、それを直す作業のことを「バグ取り」などと言います。
たまを2連射できるようになる
ここまでつくってきたパワーアップは、見た目を変えることとパワーアップを解除する、ところまでです。
これでは本当のパワーアップとは言えませんね。
ということで、パワーアップしたらたまを2発撃てるようにしましょう。
たまをうつ処理は、「Ball」スプライトでつくっているので、「Ball」スプライトを開きます。
「スペースキーが押されたとき」ブロックは、これまで、「もしたまの存在がゼロならば」、「たまの存在を1にして」、「たまのクローンをつくる」という処理にしていました。
これを、パワーアップしたときは2発うてるようにするにはどうしたらよいでしょうか?
ここからはちょっと複雑になります。
まず「もしたまの存在=0なら」のところをいったん外して、「もし なら」ブロックに戻します。
「パワーアップしていたら2発までうてる」ということは、「パワーアップ」変数が1のときは2発までうてる、ということです。
そして、2発うっているかどうかを確かめるには、「たまの存在」変数を使います。
スペースキーを押して、たまを一発うつごとに、「たまの存在」変数を1増やします。
そして、「たまの存在」変数が0もしくは1のときは、たまをうつことができるけど、2になったらうてない、というようにします。
これをまとめると、
「たまの存在が-1より大きく」かつ、「たまの存在が2より小さい」とき、ということになりますね。
さらに、「パワーアップしているときは2発うてる」という条件が加わります。
「もし なら」ブロックでつくってもよいのですが、ここではもう少しスマートに作ってみましょう。
パワーアップしたときは、「パワーアップ」変数を1にしますね?
パワーアップしていないときは、「パワーアップ」変数は0です。
この「パワーアップ」変数を、先ほどの「たまの存在」変数と組み合わせて、パワーアップしているときと、パワーアップしていないときでうてるたまの数を変えることができます。
つまり、
「パワーアップが0のとき」(パワーアップしていないとき)は、
「たまの存在」変数が1より少なく、-1より大きい
ときに、たまをうてるようにします。
「パワーアップが1のとき」(パワーアップしているとき)は、
「たまの存在」変数が2より少なく、-1より大きい
ときに、たまをうてるようにします。
さあ、ブロックにしてみましょうか。
まずはゲームオーバーでないとき(「ゲームオーバー」変数が1ではないとき)はたまをうてるようにするので、
「もし なら」ブロックに「 かつ 」ブロックを入れます。
次に「 かつ 」ブロックの右側に、「 ではない」ブロックを入れます。
「 ではない」ブロックに「 =50 」ブロックを入れます。
「 =50 」を「 =1 」にします。
「 =1 」の左側は「ゲームオーバー」変数にします。
ここまでは前と同じですね。ここからです。
「 かつゲームオーバー=1ではない」ブロックの左側に、もう一つ、「 かつ 」ブロックを入れます。
見た目にも、ちょっと複雑になってきました。
これで3つの条件がそろったときに、「もし なら」ブロックの中が実行されることになります。
「 かつ 」ブロックの左側には「 >50 」ブロックを入れます。
「 >50 」の数字を「-1」にします。
「 >-1 」の右側には、「たまの存在」変数を入れます。
これで、『「たまの存在」変数が0より大きいとき』という条件をつけることができました。
「たまの存在>-1かつ 」ブロックの右側に、「 <50 」ブロックを入れます。
「 <50 」ブロックの左側は、「たまの存在」変数を入れます。
「たまの存在<50」の50を「2」にします。
これで、「たまの存在変数が-1より大きく、2より小さい」とき、という意味になります。
しかし、これだとパワーアップしていなくても2発うてることになってしまいます。
そこで、パワーアップしているときは2発うてて、パワーアップしていない時は1発しかうてない、というように変えてみましょう。
「たまの存在<2」の「2」の部分に、「 + 」ブロックを入れます。
「 + 」ブロックの右側は「1」にします。
「 +1 」の左側に「パワーアップ」変数を入れます。
できました!
これで、パワーアップ変数が0のときは、たまの存在変数が0のときだけ、たまをうてて、
パワーアップ変数が1のときは、たまの存在変数が0か1のときに、たまをうてる、
ということになります。
でもまだ完成ではありません。あと少しです!
次は、たまのクローンを削除するときに、「たまの存在」変数を減らしてあげる処理を入れます。
「たまの存在」変数が2のままではたまをうつことができなくなってしまうからです。
たまがなくなったら「たまの存在」変数を減らすので、クローンが削除される手前で、「たまの存在」変数を1つ減らしてあげればよいのです。
「クローンされたとき」ブロック内の、「このクローンを削除する」ブロックの手前には、「たまの存在を0にする」ブロックがありますね?
この「たまの存在を0にするブロック」を外して、「たまの存在を1ずつ変える」ブロックを入れましょう。
そして、数を減らすのですから「1」ずつ変えるのではなく「-1」ずつ変える、にしましょう。
「たまの存在を0にする」ブロックは2か所あるので、2か所とも同じようにします。
さあ、これでパワーアップしたら2連射できるようになりました!
でも、ゲームをスタートしてみてください。
たまをパワーアップしたあと、横に動きながら連射していると、敵にたまがあたったときに、爆発の表示が残ってしまうときがあります。
そして、それがどんどん増えていき、しまいには敵が表示されなくなってしまいます。
そう、バグですね。
このバグをとらなければなりません。
どうも原因は爆発処理にありそうです。
「Sun」スプライトを開きましょう。
プログラムが思った通りに動かない場合には、少しだけ条件を変えて、動くか動かないかを確かめてみます。
この爆発処理では、「爆発の大きさを5まで繰り返す」処理と、「爆発の大きさを0まで繰り返す」処理の2つがあります。
このうちの、「爆発の大きさを0まで繰り返す」ブロックをいったん外してゲームを確認してみます。
すると、どうでしょうか?
今度は爆発が画面に残りませんね?
どうやら、この爆発処理を2つ入れてしまったことが原因のようです。
ではどうすればよいでしょうか?
そうですね。「爆発の大きさ=5まで繰り返す」ブロックだけで、爆発のアニメーションを完結させればよいのです。
実は、「このまま爆発が大きくなってパッと消える、だけでいいや」と思ってしまえば、これで完成、としてもかまいません。
でも、それだと、「じゃあ、爆発が大きくなって、さらにそこから小さくなってから消える」というアニメはどうやってやるんだろう?」というモヤモヤとした気持ちが残ってしまいますよね?
ですから、何としても、これまでのアニメーションが動作するように直してみましょう!
まず、このバグはなぜ起きるのか、ということですが、どうやら、「 まで繰り返す」ブロックを二つつなげていることが問題のようです。
「爆発の大きさ=5まで繰り返す」処理が終わったら、「爆発の大きさ=0まで繰り返す」処理を動くようにしていますが、ちょうど「爆発の大きさ=5まで繰り返す」処理が終わったときに、別のたまが、敵に当たって爆発処理が実行されたときに、「爆発の大きさ=0まで繰り返す」処理を最後まで終わらせる前に、もう一つの爆発が始まってしまうことが原因ではないかと思います。
そこで、「 まで繰り返す」ブロックをいったん全部とりのぞきます。
そして、「 10回繰り返す」ブロックを入れます。
「10回繰り返す」の中に「もし なら」ブロックを入れます。
「もし なら」の中に「 =50 」ブロックを入れて、左側を「爆発の大きさ」にして、右側を「5」にします。
「もし爆発の大きさ=5なら」の中に「変数を1にする」ブロックをいれて、新たに「爆発の大きさ2」変数をつくって入れます。
右側の数字は「-1」にします。
「もし爆発の大きさ=5なら」ブロックの下に「爆発の大きさを1ずつ変える」ブロックをくっつけます。
「1」を「爆発の大きさ2」変数にします。
「大きさを100%にする」ブロックを下にくっつけます。
「100」を「 * 」ブロックにします。
「 * 」ブロックの左側を「爆発の大きさ」にして、右側を「20」にします。
「クローンされたとき」の下に「爆発の大きさ2を1にする」ブロックを入れます。
これで完成です。
以下の処理を10回繰り返す、というプログラムです。
その内容は、「爆発の大きさ」変数の内容を、「爆発の変数の大きさ2」変数の数だけ変えて、爆発の表示サイズを「爆発の大きさ」変数×20%で表示する、というものです。
また、「爆発の大きさ」変数が5になった場合には、「爆発の大きさ2」変数を-1にすることで、今度は「爆発の大きさ」変数から毎回1を引いていくことになります。
敵を倒したときの点数が増える
最後に、パワーアップしているときに敵を倒すと、点数が多めに入るようにしてみます。
今回は、敵を倒すといつもは1点のところ、5点入るようにしてみます。
点数が入る処理は、「Ball」スプライトでつくっていましたので、「Ball」スプライトを開きます。
「クローンされたとき」ブロック内の、「もしGhostに触れたなら」ブック内に「点数を1ずつ変える」ブロックがありますね?
この「1」ずつを「パワーアップ*4+1」にしてみましょう。
こうすることで、「パワーアップ」変数が0のときは、1点、
「パワーアップ」変数が1のときは、5点、入ることになります。
「点数を1ずつ変える」ブロックの「1」に「 + 」ブロックを入れて、右側を「1」にします。
「 +1 」ブロックの左側に「 * 」ブロックを入れます。
「 * 」ブロックの左側に「パワーアップ」変数、右側に「4」を入れます。
これでパワーアップの時は点数が5点入るようにしました。
早速ゲームをしてみましょう。
パワーアップしたら5点入ることが確認できましたね?
…でも、あれ?
点数がどんどん増えているのに、一向に敵のスピードが上がりませんね?
これもバグです。
「Ghost」スプライトを見てみましょう。
敵の速度は、「レベル」変数で設定していました。
ということは、レベルがあがっていないことがスピードが上がらない原因のようです。
レベルの処理は「Ball」スプライトでつくっていましたので、「Ball」スプライトを開きます。
「レベル判定を受け取ったとき」ブロックがレベルアップの処理をしている部分です。
この中に「もし点数=レベル*5なら」というブロックがあります。
ここが原因でしょう。
この書き方だと、「点数がレベル×5と同じ数になった場合に、レベルを1つあげる」という意味になります。
でも、例えば、3点入ったときにパワーアップをすると、次に敵を倒したときは5点入るので、合計で8点となります。
すると、「点数がレベル×5」と同じではなくなってしまうので、レベルが上がりません。
ここは、「点数がレベル×5より大きければ」という判定にしてみましょう。
「もし点数=レベル*5なら」の「点数=レベル*5」を外して、「 >50 」ブロックを入れます。
「 >50 」の左側を「点数」変数にします。
右側は「 * 」ブロックを入れます。
「 * 」ブロックの左側は「レベル」変数にして、右側は「5」にします。
さて、これでゲームをしてみると、今度は6点入らないと速度が早くなりませんね?
ということは、先ほどの計算式が間違っているということです。
「点数がレベル×5-1より大きければ」に変えましょう。
こうすることで、レベルが1のときは、1×5=5、5-1=4ということになり、4より大きいつまり、5点のときにレベルが上がるようになります。
「レベル*5」ブロックを外します。後で使うので消さないでください。
代わりに、「 - 」ブロックをいれます。引き算ですね。
引き算の右側を1にします。
引き算の左側は、先ほど外した「レベル*5」を入れます。
これでパワーアップ処理はすべて完成しました!
今回は詰め込みすぎたのでかなり長かったですね。
次回は、ゲームの演出に大事な「音」を入れてみましょう!
→「レッツ!スクラッチ」コンテンツリスト
関連記事