【Scratch 3.0】アクションゲーム バルーンファイト風 体当たりして風船(バルーン)を割る方法(Tips)

スポンサーリンク
バルーンファイト風 体当たりして風船(バルーン)を割る方法_m

バルーンファイト風アクションゲームの第3回目は、空中を飛び回っているときに風船(バルーン)に体当たりして破裂させる部分のプログラムを作っていきます。

風船が破裂した後は、コントロールが効かずに落下するようにします。

登場するキャラクター・コスチューム・背景などはすべてScratchに標準で備わっている素材を使っているので、インターネットから素材をダウンロードするなどの手間は掛かりません。

この記事を読んでいただくと、バルーンファイト風に体当たりして風船(バルーン)を割るプログラミングの方法が分かります。

バルーンファイトとは

バルーンファイトは、キャラクターが風船を着けて空中をふわふわ飛び回り障害物を避けながら敵の風船を割って進む固定画面型アクションゲーム。主人公と敵がぶつかった時、下にいた方の風船が割れる。敵は風船が割れるとパラシュートで降下して、地上に降りると風船をふくらませて再び飛び立とうとする。敵が地上に降りている間に敵に体当たりすると、その敵を倒すことができる。任天堂が1984年アーケードゲームを、1985年にファミコン版を発売。

完成品

この章の内容をご自身のScratch環境に反映すると、同じ動きを再現することができます。

完成した動き

風船(のクローン)がキャラクターに体当たりされると1つずつ減っていきます。

主人公の風船が2つとも割れた後は、コントロールができずに落下してゲームオーバーになり、敵キャラクターの風船を2つとも割ると落下してステージから消えます。

バルーンファイト風 風船(バルーン)を割る方法-完成-GIFアニメ

使用したスプライトと背景

スプライトは「ネコ」「バルーン」「タコ1」「タコ2」の4つ、それと「ステージ」です。

【ネコのスプライト】

「ネコ」スプライトの作り方は以前の記事で説明済みなのでこちらを参照してください。↓↓↓
【Scratch 3.0】アクションゲーム バルーンファイト風 風船を背負って空中をふわふわ移動する方法(Tips)

【バルーンのスプライト】

「バルーン」スプライトの作り方は以前の記事で説明済みなのでこちらを参照してください。↓↓↓
【Scratch 3.0】アクションゲーム バルーンファイト風 風船を背負って空中をふわふわ移動する方法(Tips)

【タコ1・タコ2のスプライト】

「タコ1」と「タコ2」スプライトの作り方は前回説明済みなのでこちらを参照してください。↓↓↓
【Scratch 3.0】アクションゲーム バルーンファイト風 敵キャラクターを追加して動かす方法(Tips)

【ステージ】

「ステージ」に設定する背景の作り方は以前の記事で説明済みなのでこちらを参照してください。↓↓↓
【Scratch 3.0】アクションゲーム バルーンファイト風 風船を背負って空中をふわふわ移動する方法(Tips)

完成したスクリプト

完成したスクリプトの全体です。

今回のテーマである「風船が割られて落下する」ために追加・修正したブロックを赤枠で囲っています。

【ネコのスクリプト】

変数
  • 縦スピード:このスプライトのみ
  • 横スピード:このスプライトのみ
  • 着地した:このスプライトのみ
  • 方向:このスプライトのみ
  • コスチューム保存用:このスプライトのみ
リスト
  • x座標:すべてのスプライト用
  • y座標:すべてのスプライト用
  • ユーザー:すべてのスプライト用

「すべてのスプライト用」で作成する変数やリストは、同じ名前で複数作ることはできないのでいずれかのスプライト上で一度だけ作成すればOKです。

【バルーンのスクリプト】

変数
  • n:このスプライトのみ
  • sw:すべてのスプライト用
  • コスチューム保存用:このスプライトのみ
リスト
  • コスチューム:すべてのスプライト用
  • x座標:すべてのスプライト用
  • y座標:すべてのスプライト用
  • ユーザー:すべてのスプライト用

「すべてのスプライト用」で作成する変数やリストは、同じ名前で複数作ることはできないのでいずれかのスプライト上で一度だけ作成すればOKです。

【タコ1・タコ2のスクリプト】

「タコ1」と「タコ2」のスクリプトは、共通のブロックを使用していて値が違うだけなので、違う部分だけ色を分けて明示します。赤字が「タコ1」スプライト用の値で青字が「タコ2」スプライト用の値になります。

変数
  • 縦スピード:このスプライトのみ
  • 横スピード:このスプライトのみ
  • 方向:このスプライトのみ
リスト
  • x座標:すべてのスプライト用
  • y座標:すべてのスプライト用
  • ユーザー:すべてのスプライト用

「すべてのスプライト用」で作成する変数やリストは、同じ名前で複数作ることはできないのでいずれかのスプライト上で一度だけ作成すればOKです。

【ステージのスクリプト】

「ステージ」のスクリプトはありません。

スクリプトの作り方

ここからはプログラムを作っていく中でポイントとなる部分を説明します。

ポイント①:「ユーザー」リストを追加してバルーンの残数が分かるようにする

「バルーン」スプライトに「ユーザー」という名前でリストを1つ追加します。

このリストは、どのキャラクターにバルーンがいくつ残っているかを判別するために使用します。

【バルーン】のスクリプト

このリストのゲームスタート直後の状態は下の図のようになります。
リストの中にスプライトの名称が2つずつあるので、それぞれのスプライトはまだバルーンを2つずつ持っているとみなします。

また、ゲーム中に3つのキャラクターがバルーンをそれぞれ1つずつ失ったときの「ユーザー」リストの状態は下の図のように値が変化します。

ポイント②:バルーンの当たり判定を追加する

当たり判定用のコスチューム

バルーンの当たり判定を行うために「当たり判定用」のバルーンコスチュームを追加します。

下の図のように「当たり判定用」という名前でコスチュームを追加して、判定に使う色をバルーンの絵柄の好きな位置に描いてください。絵柄を大きく描くと当たりやすくなりますし、小さく描くと当たりにくくなります。

当たり判定用のスクリプト

当たり判定のスクリプトは、「当たり判定」定義ブロックの中にまとまっています。

【バルーン】のスクリプト

当たり判定には、バルーンコスチュームに設定した色と「ネコ」スプライトの体の色(オレンジ系)または「タコ1・タコ2」スプライトの体の色(茶系)に触れた場合に実行するように条件を設定します。

スクラッチでの当たり判定は色で判別するのがもっとも手軽なので、できるだけそのような方法を取っています。

条件を満たした場合、「ユーザー」リストと「コスチューム」リストの値を書き換えます。

書き換えるのは、「バルーン」クローンが持っている変数「n」の値と一致する要素番号の値です。変数「n」については前々回の記事でクローンごとに別々の値を持たせるものとして説明しています。

「ユーザー」リストのn番目の要素にはnを入れ、「コスチューム」リストのn番目には空白を入れます。

なお、「x座標・y座標」リストは常に更新し続けられるようになっているので、ここで書き換える意味はありません。

一例ですが、ゲーム中にいくつかのバルーンが割れるときにこれが実行されると各リストの値は下の図のようになります。

「コスチューム」リストを見るとまだ空白になっていない箇所が3か所あるので合計で3つのバルーンがまだ残っていることが分かります。

また「ユーザー」リストを見ると「ネコ」「タコ1」「タコ2」の名前が1つずつあるので、それぞれのスプライトが1つずつバルーンが残っていることが分かります。

ポイント③:バルーンが2つとも無くなったときの動きを追加する

各スプライトのバルーンが2つとも無くなったときは落下させるスクリプトを追加します。

落下とは縦方向(y座標)の動きになるので、「ネコ」「タコ1」「タコ2」それぞれのスクリプトにある「たての動き」定義ブロックに条件を追加します。

追加する条件は、ポイント②で説明した「ユーザー」リストを使います。このリストの中にスプライトと同じ名前がある場合はまだバルーンが残っていると考えることができて、もし名前が見つからなかったらそのスプライトのバルーンは全滅したことを意味します。

そのため、「もし(ユーザーリストに「スプライト名」が含まれる)なら」通常どおり動かすことができて、「でなければ」落下させるスクリプトをつくれば良いわけです。

各スプライトに追加したスクリプトを下の図に示します。

左から【ネコ・タコ1・タコ2】のスクリプト

ここまでのポイントを押さえれば、バルーンファイト風に体当たりして風船(バルーン)を割るスクリプトを完成させることができると思います。

失敗しやすいポイント

上で説明はしませんでしたが、「バルーン」のスクリプトに「すべてのスプライト用」で作成した「sw」変数をつかって下の図のようなスクリプトを組んでいる箇所があります。

【バルーン】のスクリプト

このスクリプトの意味は、バルーンの当たり判定が短時間で連続して発生しないように1度バルーンが割れたら1秒間は間隔を空けるためのものです。

この「sw」変数を「このスプライトのみ」でつくると間隔が空かずに1度当たっただけで2つのバルーンが一気に割れてしまうことがあります。

原因はよく分かりません。。。スクリプトの構造から変えれば上手くいくかもしれませんがとりあえずはグローバル変数である「すべてのスプライト用」でつくるようにしておいた方が無難なようです。

応用編

今回応用編は特にありません。

まとめ

さいごに、今回の記事で説明した『バルーンファイト風に体当たりして風船(バルーン)を割るプログラミング』のポイントをまとめます。

  • ポイント①:「ユーザー」リストを追加してバルーンの残数が分かるようにする
  • ポイント②:バルーンの当たり判定を追加する(色で判定するのが楽)
  • ポイント③:バルーンが2つとも無くなったときの動きを追加する

ここまで作ればバルーンファイトのゲームの骨格ができたと言えるのではないでしょうか?これ以降はオプション機能を追加していくフェーズになるので、過去のTips記事などの参考にしてもらったりしてオリジナルゲームをつくりあげていくと面白いと思います。

どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)

この記事が『よかった/役に立った』と思ったら、左下のGoodボタンを押していただけると嬉しいです。

タイトルとURLをコピーしました