【初めてのスクラッチ】「~色に触れたら」が作動しないときにとるべき方法

プログラミング

 

スクラッチに少し慣れてくると、わたしのように日頃そんなにゲームをしない人間でもゲームを作りたくなるから不思議ですよね。

で、やっぱり最初に思いつくのがシューティング系のゲームではないでしょうか?

ちなみにわたしが小学生の頃流行っていたのは「インベーダーゲーム」とその次の「ギャラクシアン」でした。どっちかというと「ギャラクシアン」世代でしたね。

ギャラクシアンは敵に動きがあってハラハラ度が高かった気がします。

 

 

スポンサーリンク




誰でも作れるシューティングゲーム

 

ギャラクシアンも当時はすごいゲームだと思っていましたが、こうしてスクラッチでプログラミングをかじってみると、あれくらいの動きなら作れそうな気がしてきます。

実際はそんな簡単じゃないんでしょうけど、まずは手探りでシューティングゲーム(のようなもの)を作ってみましょう。

 

作ってみましょうというか、とりあえず今、こんな感じのものを作っています。

 

 

絵はもうメチャメチャ原始的。

でも絵はあとからどうにでもなる(はず)なのでここではまずスクリプトを作っていきます。

 

スプライトの種類

 

これが今回のゲームで使う5つのスプライトです。

スクラッチ シューティングゲーム

 

左から順に、

 

壁A

砲座

ミサイル

壁B

魔人

 

「魔人」という名は勝手につけました。スプライトのライブラリに「Ghoul」という名で収録されています。

残りの4つはペイントエディタで作成したもの。

 

背景は宇宙を選びました。

 

各スプライトの動き

スクラッチ シューティングゲーム

 

砲座を左右の矢印ボタンで動かし、スペースキーでミサイルを発射

 

壁Aと壁Bをよけて魔人に命中させたらOKです。

 

できるなら、命中の数をカウントする、プラス、魔人からも攻撃をさせるスクリプトを作りたいのですが、それは次回に。

 

 

それぞれのスクリプト

 

では順番にスクリプトをご紹介します。誰でもできる超簡単スクリプト

 

動く壁のスクリプト

 

最初にもっとも簡単な、壁のスクリプトです。

スクラッチ スクリプト

 

◆左のスクリプト

  • 「旗がクリックされたとき」・・・ゲームスタート
  • 「大きさを〇%にする」・・・サイズを変えるときに使います。たいていの場合、大きすぎるので小さくしておきます。
  • 「X座標を〇、Y座標を〇にする」・・・壁を動かす高さを決めます。
  • 「隠す」・・・わたしはつけましたけど、なくても問題ありませんでした。

 

今回はクローンを使って壁を動かすことにします。なので、

 

  • 自分自身のクローンを作る
  • 2秒待つ

 

これで2秒ごとにクローンを作ることを「ずっと」行うわけです。

 

◆右のスクリプト

これはそのクローンを動かすスクリプト。

 

  • 「表示する」・・・まずクローンを表示させます。
  • 「X座標を〇ずつ変える」「◎回繰り返す」・・・これで動き方を決めます。〇が大きいほどスピードが速くなり、◎が少ないと画面の途中までしか行きません。
  • 「このクローンを削除する」・・・クローンは300個までしか作れないため、常に削除していきます。

 

壁Bも同じです。ただ進む向きが逆なので「x座標をマイナスの数字ずつ変える」とします。

 

 

砲座のスクリプト

 

これはまず左右への動かし方。

スクラッチ シューティング

 

簡単ですね。これで左に右にスイスイ動きます

 

この砲座からスペースキーを押したときにミサイルを発射するスクリプトを作りたい。それをつけくわえたのがこちらです。

別のスプライトのクローンを作る

 

もしスペースキーが押されたなら

スプライト3のクローンを作る

 

「スプライト3」というのはこのあとに出てくる「ミサイル」のことです。

 

感覚的にはこれだけでもよさそうに思えますよね?

 

それでもなぜ「スペースキーが押された ではない まで待つ」のブロックがついているのかというと、

 

コンピューターの処理能力の速さから、スペースキーが1回押された間に何度もクローンをつくる処理がされてしまうからです。

 

分かりにくいと思うので動画で見てみましょう。

 

 

スマホで撮った動画なので分かりにくいですが、ご覧のようにミサイルが何重にも重なって発射されています

 

では次に「スペースキーが押された ではない まで待つ」のブロックをつけてみると、

 

 

このようにスペースキーを1回押すごとにミサイルが一発だけ発射されます(2重に見えるのは画像の粗さのため)。

 

ミサイルのスクリプト

ミサイル スクリプト

 

幼児のラクガキ?これでも一応ミサイルのつもりです。

 

  • コスチューム1は「壁A」に当たったとき
  • コスチューム2は「壁B」に命中したとき

 

ではスクリプトを見てみましょう。

ミサイル スクリプト

 

長いので2つに分解します。

 

ミサイルのスクリプト~クローンされたとき

 

  • クローンされたとき・・・先ほど砲座のスクリプトでスペースキーが押されたときに「スプライト3のクローンを作る」プログラムを作りましたよね?
  • スプライト2へ行く・・・砲座へ行くということです。
  • 表示する大きさを〇%にする、コスチュームをミサイルにする・・・そのままですね

 

つまりミサイルは、

 

クローンされる

砲座に行く

姿を現す

ミサイルの形になる

 

という動きをします。順番は問いません。この4つのブロックがあればOK。

 

ミサイルのスクリプト~前(上)へ進む

 

ミサイルですから前へ飛んでいかなければなりません。そのスクリプトがこちら。

ミサイルのスクリプト

 

Y座標を8ずつ変える」を「『端に触れた』まで繰り返す

 

これで画面の上の端に着くまでミサイルが飛んでいきます。簡単ですね。

 

端に着いたらクローンは削除しておきましょう。

クローンを削除する

 

ミサイルのスクリプト~壁に当たったとき

 

「当たったとき」というのは「~色に触れたとき」で判断します。

 

□ピンクの壁Aに当たったとき

色に触れたなら

 

□緑の壁Bに当たったとき

~色に触れたとき

 

壁に当たったらミサイルがコスチュームを変えるスクリプトです。コスチュームは、ほら、先ほどご覧いただきましたよね?

ミサイル コスチューム

 

壁に当たったらミサイルは爆発、ということで壁Aならコスチューム1、壁Bならコスチューム2になります。

 

見たほうが分かりやすいのでご覧ください。

 

 

ところでこの動画のタイトル、「当たったら減速するミサイル」となっています。これには意味があって、もう一度スクリプトをご覧ください。

 

これはピンクの壁に当たったときのスクリプトですが、「y座標を-16ずつ変える」ブロックがくっついています。

色に触れたなら

 

何かというと、実はこれでミサイルが壁に当たったときに一瞬そこで減速するように見せています。

 

試しにこれを外してみましょう。

 

これも動画のほうが分かりやすいでしょう。

 

 

いかがですか?これだと壁にぶつかってもそのままのスピードで飛んでいってしまいますね。ぶつかっているのにちょっと不自然。

それを避けるのが先ほどの「y座標を-16ずつ変える」ブロックです。

これを組み込むと、壁にぶつかるとちょっと止まるわけですね。もう一度。

 

 

ミサイルのスクリプト~魔人に当たったとき

 

2つの壁をくぐり抜け、魔人にミサイルが当たったときのスクリプト。

 

せっかくなので魔人に当たったときのミサイルのコスチュームをペイントエディタで追加しました。

 

もっとマシな絵はないんかい!!という気持ちは脇に置いておいて・・・

 

これがそのコスチュームを使ったスクリプト。

もし魔人(の色)に触れたなら

コスチュームを今の絵にする

大きさを150%にする

y座標をー16ずつ変える

 

 

それを動かしたのがこちらです。

 

 

なんだか魔人に当たったときのコスチュームが一瞬だけ表示されますね。なぜ一瞬で消えるのかは謎。

 

いずれにしてもこれではミサイルが変化するだけなので、当てられた魔人のほうのアクションを考えないといけません。

 

魔人のスクリプト~ミサイルに当たったら

 

さっきから言おう言おうと思っていたのですが、魔人の色、暗い茶色なのでよく見えませんね。動画の一番上にいるの見えてますでしょうか?

 

で、これが魔人のスクリプト。自動的に右から左、左から右へと行ったり来たりします。

 

ミサイルが当たったら何らかの変化をさせたいわけです。

 

 

「~色に触れたなら」ブロックでは作動しない

 

最初に考えたのがこちら。

 

もし黄色(ミサイルの頭の色)に触れたなら

渦巻きの効果を25ずつ変える

 

これでミサイルが命中したら魔人がグルグルとなっていくようにしたつもりだったのですが・・・

 

なぜかうまくいきません。

 

ミサイルが当たっても魔人はまったく変化なし。

 

 

3回目と6回目の発射でミサイルが魔人に命中しているはずなのですが・・・

 

「渦巻きの効果を変える」ブロックがいけないのかと思い、「隠す」や「○○と言う」ブロックにしたりもしましたが、やはり魔人は変化なし。

 

スクリプトの何かが間違っているということです。

 

「~色に触れたなら」が作動しないときにとるべき方法

 

ここでようやく本題に入ります。

 

なぜ「~色に触れたなら」が作動しないのか?

 

あれこれ考えていたら、この本に載っていたあることを思い出しました。

 

 

スクラッチの内部では「ネコがリンゴに触れた瞬間」と「リンゴがネコに触れた瞬間」は同時とは判定されず、ネコがリンゴに触れた瞬間を先に起きたことだと理解してしまうんだ。

 

つまり、「ミサイルが魔人に触れた瞬間」はあっても、「その次の瞬間にはミサイルは魔人を離れている」ので魔人がミサイルに触れたとは認識されない。

この解釈が当てはまるのでは?と考え、スクリプトを変えてみました。

 

まずミサイルのスクリプトから。ブロックを1つつけくわえます。

メッセージを送る

 

もし魔人(の色)に触れたなら、

メッセージ「当たった」を送る

 

次に魔人。

色に触れたなら 取る

作動しなかった「ミサイル(の色)に触れたなら」のブロックを外します。

そして別にこのようなブロックを組み立てます。

 

「当たった」を受け取ったとき

コスチューム2にする

「ギャア!」と2秒言う

 

コスチューム2とは新しく作ったこれです。

 

魔人が暗くてよく見えないので明るい色にしました。落差ありすぎ。

 

でもこれでミサイルが当たったら魔人が変化するようになりましたよ。

 

 

ただ、これを作っている過程で不思議なことがありました。

 

実はこのピンクのコスチュームの前にこんなコスチュームを作っていたのですが、

 

なぜかこのコスチュームで同じことを試すと、

ミサイルが命中した魔人が今までと違う動きをするのです。

 

命中したとたん、斜めに落下してくるんです!!

 

そんなスクリプト作ってないのになぜ?コスチューム変えただけなのに?

 

このコスチュームの形が影響しているのでしょうか?

 

でもこれってまさに「ギャラクシアン」の動きそっくり!!

 

ミサイルを当てられて炎になってこちらに突っ込んでくる、というスクリプトも作れますね。それをよけるという。

 

 

プログラミングはいろいろ問題が出てくる

 

プログラミングをやっているといろいろ問題(バグ)が出てくるとは聞いていましたが本当ですね。

スクラッチでさえ、不思議なことがたくさん起こります。

まずはこの落下現象の原因を探りたい!!

 

それからこのゲームをもう少しましなものに作り替えたい!!

 

そんな気持ちになれるのって日常ではあまりないですよね~

 

あー、プログラミング、面白いかも♪

 

 

 

 

コメント