スクラッチコーチキャンプ スクラッチで使える無料素材集
  • 素材
  • 修行
  • はじめての方へ
  • スクラッチゲームの作り方

    二次元配列(ペアリスト)と先頭削除トリック

    二次元配列(ペアリスト)と先頭削除トリック
    この記事は スクラッチコーチで掲載されているオリジナル記事 のバックアップです。
    スターター作品
    なし
    今回の完成サンプル
    なし
    [soy-series name="スクラッチ小技"]

    さぁ、スクラッチでナニ作る!?

    動画で見てみよう

    [talk]チャンネル登録して応援よろしく!チャンネル登録する[/talk]

    チュートリアルの元になった作品

    [prj-embed prj="1318584092" mini="1" title="プレイしておこう" prj-title="二次元配列(ペアリングリスト)の使い方" prj-author="ok-scratch"]今回の[prj-link prj="1318584092" title="二次元配列(ペアリングリスト)の使い方" author="ok-scratch"]スクラッチを作る参考作品[/prj-link]です。リストを「辞書」として使う発想がマジでキレッキレ。TYPE_NAMEで名前を検索→同じインデックスでHP・スピードを引き出すだけで連想配列が完成するの、シンプルなのにイカす。さらに先頭を取り出したらそのまま削除するだけで全件処理できる先頭削除トリックも合体してて、2つのデータ構造テクニックが一気に体験できるのが熱い。この仕組みがどうなってるか、見ていこう。[/prj-embed]

    今回の目標

    ウェーブリストと敵タイプ辞書(ペアリスト3本)を初期化し、スペースキーで先頭削除トリックを使いながら全敵タイプを順番に召喚するタワーディフェンスのベースを作る。

    スターター作品をリミックスしよう

    このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
    スターター作品をダウンロード

    #1データの初期化

    [talk class="m-l-n"]まずステージ側で、ゲームに使う4つのリストをまっさらにするよ。「■ウェーブ」「■敵の種類名」「■敵のHP」「■敵のスピード」――全部空にしてからデータを入れ直す仕組みだね。[/talk]

    準備

    スプライト「stage」を開く

    ステージ
    スプライトについて
    ゲームの背景とウェーブデータ・敵の種類データを管理するステージ

    リスト「■ウェーブ」の追加

    召喚する敵の順番を格納したリスト(ゴブリン→ゴブリン→オーク→ボスの順)

    リスト「■ウェーブ」の追加

    リスト「■敵の種類名」の追加

    敵の種類名一覧(ゴブリン・オーク・ボス)

    リスト「■敵の種類名」の追加

    リスト「■敵のHP」の追加

    各敵の種類に対応するHP値のリスト

    リスト「■敵のHP」の追加

    リスト「■敵のスピード」の追加

    各敵の種類に対応する移動スピードのリスト

    リスト「■敵のスピード」の追加

    実装

    step-0

    イベントgreenflag が押されたときのあとにリスト( )のすべてを削除するを4つ並べて、全リストをクリアしよう。ゲームを再スタートするたびに前回のデータが残らないようにする、お約束の初期化処理だよ。

    #2敵の種類データを登録

    [talk class="m-l-n"]次に、敵の種類ごとのデータを「辞書」として登録していくよ。Scratchには辞書(名前で値を引ける仕組み)がないから、同じ順番で並べた複数のリストで代用するんだ。これが「ペアリスト辞書パターン」と呼ばれるテクニック。[/talk] step-1

    「■敵の種類名」リストに「ゴブリン」「オーク」「ボス」の順でリスト( ) を ( ) に追加するして、「■敵のHP」にも対応するHP(10、20)を同じ順番で追加するよ。リストの1番目同士、2番目同士が対応しているのがポイントだね。

    [talk]Scratchにはデータを名前で検索する「辞書」がないけど、このペアリストパターンを使えば名前で検索して対応するデータを取り出せるんだ。実はこのテクニック、Scratchで超有名なグリフパッチがマルチプレイヤーゲームの開発で使っていた方法だよ。プレイヤーIDとプレイヤーデータを2つのリストで管理して、誰がどこにいるかを高速に検索してたんだ。[/talk]

    #3スピードとウェーブの登録

    [talk class="m-l-n"]敵の種類データの残りを埋めて、さらに出撃順を決める「■ウェーブ」リストを作り始めるよ。[/talk] step-2

    「■敵のHP」にボスのHP(50)を追加し、「■敵のスピード」にゴブリン(3)、オーク(2)、ボス(1)の移動スピードを登録しよう。HPが高い敵ほどスピードが遅い――ゲームバランスの基本だね。最後に「■ウェーブ」リストへ最初の出撃メンバー「ゴブリン」を追加するよ。

    #4ウェーブ順序の完成

    [talk class="m-l-n"]残りのウェーブ順序を全部登録して、出撃リストを完成させよう。[/talk] step-3

    「■ウェーブ」リストに「ゴブリン」「オーク」「ゴブリン」「ボス」の順で追加するよ。最終的にゴブリン→ゴブリン→オーク→ゴブリン→ボスの順で敵が登場するんだ。コードをいじらず、リストの中身を変えるだけで出撃パターンを自由に組めるのがこの仕組みの強みだね。

    #5司令官の初期配置

    [talk class="m-l-n"]ステージのデータ設定が終わったから、次は「司令官」スプライトを作っていくよ。この司令官がウェーブ開始の合図を出す役割だね。[/talk]

    準備

    スプライト「司令官」を開く

    司令官司令官
    スプライトについて
    ウェーブデータをもとに敵を順番に召喚する司令官スプライト
    どんな役割か
    スペースキーを押すとウェーブリストの順番通りに敵を召喚する仕組みを作るよ。敵の種類ごとにHPとスピードを設定して、1体ずつ順番に送り込む仕組みだよ。

    実装

    step-4

    イベントgreenflag が押されたときで旗が押されたら画面左上(x:-180、y:130)に移動して、見た目( ) と ( ) 秒言うで「スペースキーで召喚開始」と2秒間表示するよ。プレイヤーへの操作ガイドだね。

    #6敵スプライトの工場化

    [talk class="m-l-n"]司令官の準備ができたから、次は「敵」スプライトだよ。このスプライト自体は画面に出ないで、クローンを量産する「工場」として使うんだ。[/talk]

    準備

    スプライト「敵」を開く

    敵
    スプライトについて
    WAVEリストに従って画面上部から下に向かって移動する敵スプライト
    どんな役割か
    召喚メッセージを受け取って自分のクローンを生成し、種類に応じたコスチュームに切り替えて画面上から下へ移動する敵を作るよ。クローンを使ってたくさんの敵を出すのがポイントだよ!

    変数「クローン判定」を追加

    このスプライトがクローンかどうかを示すフラグ(1=クローン、0=オリジナル)

    変数「クローン判定」を追加

    実装

    step-5

    イベントgreenflag が押されたときで「クローン判定」変数を0にして見た目隠すで自分を隠すよ。工場(親スプライト)は裏方に徹して、画面で戦うのはクローンだけっていう役割分担だね。

    #7ウェーブの召喚ループ

    [talk class="m-l-n"]敵の下準備ができたから、司令官に戻ってメインの処理を作るよ。ここで2つの重要テクニックが合体するんだ。[/talk]

    準備

    スプライト「司令官」を開く

    司令官
    司令官

    変数「■現在の敵の種類」を追加

    現在召喚中の敵の種類名(ゴブリン・オーク・ボス)

    変数「■現在の敵の種類」を追加

    変数「■検索インデックス」を追加

    TYPE_NAMEリストで敵の種類を検索したときのインデックス番号

    変数「■検索インデックス」を追加

    変数「■現在のHP」を追加

    現在召喚する敵のHP値

    変数「■現在のHP」を追加

    変数「■現在のスピード」を追加

    現在召喚する敵の移動スピード値

    変数「■現在のスピード」を追加

    メッセージ「召喚」を追加

    敵を1体召喚するためのメッセージ

    メッセージ「召喚」を追加

    実装

    step-6

    イベント( ) キーが押されたときでスペースキーを検知したら、制御( ) 回繰り返すで「■ウェーブ」リストの長さ分だけ繰り返すよ。ループの中では常に1番目のアイテムを取り出して「■現在の敵の種類」にセットし、リスト( )中の( )の場所で「■敵の種類名」リストからインデックスを検索。そのインデックスで「■敵のHP」と「■敵のスピード」から対応する値を引っ張ってくるんだ。

    データの準備ができたら「召喚」メッセージを送り、処理済みの1番目をリストから削除して1秒待つよ。削除すると次のアイテムが自動的に1番目に繰り上がるから、常に1番目を見るだけで全件処理できる仕組みなんだ。これが「先頭削除トリック」と呼ばれるキュー処理パターンだよ。

    [talk]普通はインデックス変数を1, 2, 3...と増やしながらリストを見ていくよね。でも先頭削除トリックなら変数が1つ減るし、数え間違いが起きない。コンビニのレジ待ち行列と同じ原理で、先頭の人が対応されたら後ろの人が自動的に前に詰めるんだ。[/talk]

    #8召喚メッセージの受信

    [talk class="m-l-n"]司令官のウェーブ処理ができたから、今度は「敵」スプライトに戻ろう。司令官が送った「召喚」メッセージを受け取る処理を作るよ。ここにクローンガードという仕組みを入れるのが大事なポイント。[/talk]

    準備

    スプライト「敵」を開く

    敵

    実装

    step-7

    イベント( ) を受け取ったときで「召喚」を受信したら、まず「クローン判定」が1かどうかチェックするよ。もし1(=クローン)なら制御 でスクリプトを止めて、親スプライト(工場)だけが制御( ) のクローンを作るを実行するんだ。

    このガードがないとクローンもさらにクローンを作ってしまって、敵がねずみ算式に増殖しちゃうよ。

    #9クローンの初期設定

    [talk class="m-l-n"]クローンが生まれた瞬間の初期設定を作っていこう。ここで敵の見た目と登場位置が決まるんだ。[/talk] step-8

    制御クローンされたときで始まったら「クローン判定」を1にして、画面上部のランダムな位置(x:-100〜100、y:160)に出現させるよ。「■現在の敵の種類」の値でコスチュームを切り替えるから、ゴブリンならゴブリンの見た目、ボスならボスの見た目で登場する仕組みだね。

    最背面に配置して表示したら、自分の種類名とHPを1秒間吹き出しで見せるよ。表示は「ゴブリンのHP:10」みたいな感じだよ。

    #10敵の落下と消滅

    [talk class="m-l-n"]最後に、敵が画面の上から下に落ちてくる動きを作ろう。これでウェーブ召喚システムの完成だよ。[/talk] step-9

    制御ずっとループの中で、y座標を「■現在のスピード」×-5ずつ変化させて落下させるよ。ゴブリンはスピード3だから毎回-15ずつ、ボスはスピード1だから-5ずつ落ちる計算だね。y座標が-160より下になったら画面外に出たと判断して、制御このクローンを削除するでクローンを消すんだ。

    0.05秒の待ち時間を入れることで落下のテンポを調整しているよ。この値を変えれば全体の難易度が変わるから、いろいろ調整してみよう。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    旗を押してからスペースキーを叩くと、ウェーブの順に敵が上から次々と降ってくる。ゴブリンは速くてボスはゆっくりで、スピードの違いがはっきりわかるね

    まとめ

    先頭削除トリックとペアリスト辞書の2つをマスターしたね!リストからアイテムを取り出して削除するだけで全件処理できるし、複数リストを並べるだけで辞書が作れる。この2つのテクニック、Scratchのいろんな場面で使えるから最強だよ。敵の種類を追加したり、ウェーブパターンを変えたりして、自分だけのタワーディフェンスに育てよう!

    ブクマよろしくお願いします!という口コミを寄せてくれた方 ブクマよろしくお願いします!
    どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!