スクラッチ(Scratch)でカービィ「吸い込みワザ」を作ろう!
スクラッチ(Scratch)のクローン、メッセージング、カスタムブロック、ペイントエディターによるグラデーションなどについて解説します。
日時: 2024/01/13(土) & 2024/01/14(日) 17:30 ~ 18:30
場所: オンライン講座
対象: KIDSPROスクール生、KIDSPRO eラーニングをご利用の方
必要なもの: Scratchが使えるパソコン、またはタブレット
費用: 無料
完成版のカービィ吸い込みワザ
・画面クリックでスタート
・矢印キーで左右操作
・スペースキーで吸い込み
※学習用の吸い込みワザ「テンプレート(コスチュームのみ)」は、https://scratch.mit.edu/projects/949202477/を利用してください。
プレイヤーねこ(player)のスクリプト
プレイヤーねこの大きさや位置などを指定する。
変数「横移動」を「0」にセットし、旗を押したあとにプレイヤーねこが左右に動かないようにする。
カスタムブロック「左右移動」と「吸い込み」を繰り返し実行する。
- スペースキーを押したときに実行される。
- もしもプレイヤーねこの向きが90度(右向き)であれば変数「吸い込み方向」を「1」にし、それ以外-90度(左向き)であれば変数「吸い込み方向」を「-1」にセットする。
- 音をならして、メッセージ「吸い込み」を送って待つブロックを実行する。
※「送るブロック」ではなく「送って待つブロック」を実行すると、送ったメッセージの下に連結したスクリプトが実行し終わるまで、次のブロックは実行されなくなります。今回は、「送って待つブロック」を実行することにより、プレイヤーねこの他のスクリプト(横移動やコスチューム変更など)が動作しなようにしました。 - 変数「横移動」を「0」にセットする。
※吸い込みワザを使った後も、プレイヤーねこが左右に動かにようにしました。
プレイヤーねこが、右矢印キーを押すと右に4ピクセルずつ移動し、左矢印キーを押すと左に4ピクセルずつ移動する。
右矢印キーおよび左矢印キーを押していない時は、変数「横移動」の値が徐々に小さくなる。これにより、右矢印キーまたは左矢印キーを押すのをやめた後、プレイヤーねこは直ぐにストップするのではなく、惰性で少しだけ動いてからストップするようになる。
プレイヤーねこの横移動を実現する、変数「横移動」の絶対値が「0.5」より大きいときに、「次のコスチュームにする」ブロックを繰り返し実行し、プレイヤーねこが走っているようなアニメーション効果をつけた。
スプライト「ゴンザレス」から送信される「吸い込まれた」メッセージを受け取ったとき、プレイヤーねこが少し膨らんでまた元の大きさに戻るアニメーション効果をつけた。
「ゴンザレス」はプレイヤーねこに吸い込まれた直後に「吸い込まれた」メッセージを送信するようコーディングしたので、プレイヤーねこがゴンザレスを吸い込んだ後、ねこの大きさが少しだけ身体が大きくなったようにみえる。
を使った場合、に連結されたスクリプトを実行し終わってから、の下に連結したブロックが実行される。
を使った場合、に連結されたスクリプトとの下に連結したブロックは同時に実行される。
吸い込みスプライトのスクリプト
吸い込みスプライトのコスチューム
ペイントエディターでコスチュームにグラデーションをつけた。
※吸い込みスプライトのコスチュームは白だが、説明用に色をつけてあります。
Scratchペイントエディターでオブジェクト(コスチューム)にグラデーションをつけるやり方は、以前に投稿した下記ページを参考にしください。
旗をクリックした直後は、「隠す」ブロックでステージから見えなくする。
クローンを使うときは、本体を隠しておいたほうがコーディングがやりやすいケースが多い。
- 変数「吸い込み間隔」を「5」にする。
- 大きさを20%にして、プレイヤーねこに中心に瞬間移動する。
- プレイヤーねこが右を向いていれば変数「吸い込み方向」は「1」になっているので(プレイヤーねこのスクリプトを確認してください)、吸い込みスプライトはねこの中心より15ピクセル右、5ピクセル上に瞬間移動する。逆に、プレイヤーねこが左を向いていれば変数「吸い込み方向」は「-1」になるので、吸い込みスプライトはねこの中心より15ピクセル左、5ピクセル上に瞬間移動する。
※つまり、プレイヤーねこが左右どちらを向いていようが、ねこの口のあたりに吸い込みスプライトは瞬間移動するようになります。 - 大きさを10%ずつ大きくししながら、そして、ねこの向いている方向に5、6、7…12、13と間隔を少しずつ大きくしながら8体のクローンを生成する。
※吸い込みスプライトの大きさは10%ずつ大きくなるので、生成される間隔も大きくするために変数「吸い込み間隔」の大きさも変更しました。また、このとき吸い込みスプライト本体は隠れいている状態なので、後に説明する「クローンされたとき」ハットブロックの下に「表示する」ブロックを連結しないと、吸い込みスプライトのクローンはステージにひょうじされないので注意してください。 - 0.5秒待ってから、「吸い込み終了」を送って待つブロックを実行する。
※後に説明する「吸い込み終了」ハットブロックを受け取ったとき実行する「このクローンを削除する」ブロックを実行することにより、生成された8体の吸い込みクローンは吸い込みエフェクトが完了すると同時に消えます。
吸い込みスプライトのクローンが生成されると、ステージに表示される。
「吸い込み終了」メッセージを受け取ったとき、ステージに存在している吸い込みスプライトのクローンはすべて削除される。
ゴンザレス(Champ99:吸い込まれる対象)のスクリプト
ゴンザレス本体はステージから隠し、スコア用の変数の値を「0」にセットする。
「発生間隔」が「0.1秒」になるまで、「5病」から「0.1秒」ずつ発生間隔を短くしながら、ゴンザレスのクローンを100体まで生成する。
ゴンザレスのクローンは生成される度にコスチュームが変わり、発生するX座標(横の位置)も変わる。
ゴンザレスはステージに姿を表し、カスタムブロック「吸い込み判定」「敵の横移動」「敵のジャンプ」を繰り返し実行する。
- 吸い込みスプライトにゴンザレスが触れたときに実行される。
- ゴンザレスのクローンを他のスプライトの前面にする。
- ゴンザレスのクローンが「5」より小さくなるまで、左に45度ずつ回転しながら大きさも1%ずつ小さくなる。そして、ゴンザレスのクローンのX座標とY座標がプレイヤーねこのX座標とY座標に近づいていく。
- ゴンザレスのクローンが「5」より小さくなったら、音を鳴らしてスコア用の変数の値を「1」増やして、「吸い込まれた」メッセージを送信する。
※この「吸い込まれた」メッセージをプレイヤーねこが受け取ると、プレイヤーねこが少し膨らんでまた元の大きさに戻るアニメーションが実行されます。 - 最後にゴンザレスのクローンのみを削除する。
ゴンザレスのクローンが生成されると、ローカル変数「敵の動作タイプ」の値が「0」「1」「2」「3」のいずれかの値となり、変数「敵の動作タイプ」の値が「3」以外であれば、1~10のいずれかの値を返す乱数の値ブロックが「1」になるまで、スプリプとの実行をストップする。
ローカル変数「敵の動作タイプ」の値が「0」ときゴンザレスのクローンは何もしない、「1」ときは右に移動、「2」ときは左に移動、「3」ときはジャンプするスクリプトを実行するようにコーディングした。
※変数「敵の動作タイプ」を作る際には「このスプライトのみ」を選択し、ローカル変数としてください。ローカル変数はクローン毎に別々の値を保持できるのに対して、「すべてのスプライト用」を選択し、すべてのスプライトから読み書きできるグローバル変数の場合、複数のクローンが同じ共通の値を保持することになります。そのため、すべてのクローンが同じ動きをしてしまうので注意してください。
ローカル変数「敵の横移動」の値が「1」ならゴンザレスのクローンは4ピクセルずつ右に移動し続け、ローカル変数「敵の横移動」の値が「2」ならゴンザレスのクローンは4ピクセルずつ左に移動し続ける。
※変数「敵の横移動」を作る際には「このスプライトのみ」を選択し、ローカル変数としてください。グローバル変数にすると、すべてのクローンが同じ動きをしてしまうので注意してください。
ローカル変数「敵の横移動」の値が「3」ならゴンザレスのクローンは、ローカル変数「敵の上下移動」の値を「12」して、その後、ゴンザレスのクローンが地面の茶色に触れるまで、Y座標の値を変えるブロックを実行するたびに、ローカル変数「敵の上下移動」の値を「0.5」ずつ小さくして重力のジャンプをする。
※変数「敵の上下移動」を作る際には「このスプライトのみ」を選択し、ローカル変数としてください。グローバル変数にすると、すべてのクローンが同じ動きをしてしまうので注意してください。
ゴンザレスのクローンが重力のジャンプをした際に、地面の茶色い部分に食い込んでしまうが、その食い込みを一瞬でなくすことができる。
※ただし、カスタムブロックを作る際に、「画面を再描画せずに実行する」にチェックを入れてください。このチェックを入れると、カスタムブロック内のすべてのプログラミングブロックが完了するまで、画面上の変更が表示されないままとなり、一瞬でゴンザレスのクローンの食い込みがなくなります。逆に、「画面を再描画せずに実行する」にチェックを入れずにカスタムブロックを生成すると、ゴンザレスのクローンはゆっくり地面に食い込みから地面に戻るようになります。
1. グローバル変数
2. ローカル変数
- 新しい変数を作るときに「すべてのスプライト用」を選ぶと、その変数はグローバル変数となる。グローバル変数は、すべてのスプライトやステージから読み書きができる。
- 新しい変数を作るときに「このスプライトのみ」を選ぶと、その変数はローカル変数となる。変数を作ったスプライトのみが読み書きができる。他のスプライトやステージから書き込むことは出来ないが、調べるカテゴリーのを使えば読み取ることはできる。
また、ローカル変数はクローン毎に別々の値を保持できるので、クローンを使ったプログラムには有益です。
①ブロックパレット左下のをクリックする。
②プロックパレット上にが表示されたらクリックする。
③自分の好きな名前を入力する。
④「OK」ボタンをクリックする。
カスタムブロックを作る際に、「画面を再描画せずに実行する」にチェックを入れると、カスタムブロック内のすべてのプログラミングブロックが完了するまで、画面上の変更が表示されないままとなります。
そのため、ビームが一瞬でufoからplatformまで照射されますが、「画面を再描画せずに実行する」にチェックが入っていないときは、ビームは目で見て分かる程度のスピードでufoからplatformに照射されます。
「画面を再描画せずに実行する」がノーチェックの場合
「画面を再描画せずに実行する」をチェックした場合
タイトル画面のスクリプト
タイトル画面スプライトのコスチューム
旗をクリックするとタイトル画面が表示され、その後にステージのどこかをマウスクリックすると「スタート」メッセージが送信されゲームが始まる。
MITメディアラボにより開発されたビジュアルプログラミング言語。子供たちが物語やゲーム、 アニメーションなどのインタラクティブな作品をプログラミングできる。また、自分の作った作品を世界中の人々と共有できるコミュニティーサイトでもある。世界中で1億人を超えるユーザがいる。
こちらのホームページにアクセスすれば無料で利用できる。