提供:Japanese Scratch-Wiki
クローンを活用すると、たった1つのスプライト で、複数のスプライトを用意したような効果が得られる。各クローンでは個別に値をもつことができるが、このような値を他のスプライトやクローンで利用するには、工夫が必要になる。
クローンでの情報の扱い
クローンを利用する場合、それぞれのクローンごとに異なる情報 (たとえば、HP (ヒットポイント) や、X座標、Y座標など) を扱いたいことがある。ここでは、このような情報を別のクローンやスプライトから読み書きしたい場合 (パブリックな情報とする場合)と、そうでない場合 (プライベートな情報にする場合)の2種類にわけて、それぞれのスクリプトの作り方と利用方法を紹介する。
クローン内のみで利用する情報
そのクローンでしか利用しない情報を扱うときは、ほかのクローンと情報を共有するしくみが不要なので、比較的シンプルに実現できる。
ローカル変数を利用する
クローンで利用する変数を作成するときに「このスプライトのみ」をチェックしておくと、この変数はクローンごとに別のものとして扱われるため、クローンの外からこの変数の値を読み書きすることができない (このような変数をローカル変数という)。 これを利用してクローンごとに異なるID番号をつけておくと、それぞれのクローンに別の動作を指定できる。
準備
まず、次の変数を用意する:
- クローンのIDとなる変数 (「このスプライトのみ」をチェック)。この例では「ボタン番号」
スクリプト例
まず、次のスクリプトをクローンの作成元となるスプライトに作成する。
@greenFlag が押されたとき::events hat [ボタン番号 v] を [0] にする (3) 回繰り返す // 必要なクローン数を指定する [ボタン番号 v] を (1) ずつ変える [自分自身 v] のクローンを作る end
次に、個々のボタンなどで実行するスクリプトを作成する。
クローンされたとき もし <(ボタン番号) = [1]> なら // 1つめのクローンで実行する内容 end もし <(ボタン番号) = [2]> なら // 2つめのクローンで実行する内容 end もし <(ボタン番号) = [3]> なら // 3つめのクローンで実行する内容。4つめ以降も同様に end
すべてのクローンでただちに実行すべき処理があるときは、「もし〜なら」ブロックの前に追加しても良いが、もう1つ「クローンされたとき」ブロックを追加して、そこにそれらの内容を記述したほうがわかりやすいだろう。
クローンを種類ごとに分けて処理する
ID番号ではなく、クローンの種類ごとに動作を変えることもできる。
準備
この例では、次の変数を使用する。
スクリプト例
「スペースキーが押されたとき」に弾丸を発射する場合、次のスクリプトを記述する:
[スペース v] キーが押されたとき // 必要に応じて変更する [弾の種類 v] を [正義の弾丸] にする [発射X v] を (x座標) にする [発射Y v] を (y座標) にする [弾の向き v] を (向き) にする [弾丸 v] のクローンを作る // クローンの元となるスプライトを指定
そして、弾丸スプライトに次のスクリプトを追加する。
クローンされたとき x座標を (発射X) 、y座標を (発射Y) にする (弾の向き) 度に向ける もし <(弾の種類) = [正義の弾丸]> なら コスチュームを [正義の弾丸 v] にする <<[端 v] に触れた> または <[敵 v] に触れた>> まで繰り返す (10) 歩動かす end end もし <(弾の種類) = [悪の弾丸]> なら コスチュームを [悪の弾丸 v] にする <<[端 v] に触れた> または <[プレイヤー v] に触れた>> まで繰り返す (10) 歩動かす end end
他のスプライトやクローンから情報を読み書きする
次に、クローンごとに独自の情報を持ちながら、他のスプライトやクローンからそれらの情報を読み書きできるようにする。このためには、情報をリストに格納してクローンのIDによって管理すればよい
準備
- クローンの総数:クローン全体の数を管理する変数。カウンターとして使用される。
- クローンID:クローンを特定するための識別情報を入れるローカル変数(「このスプライトのみ」をチェック)。
- X座標リスト、Y座標リスト:クローンの情報 (プロパティ) を外部と共有するためのリスト。この例では、各クローンの座標情報をこれらで管理する。
スクリプト例
次のスクリプトをクローン元のスプライトに追加する。
@greenFlag が押されたとき::events hat [クローンの総数 v] を [0] にする [X座標リスト v] のすべてを削除する [Y座標リスト v] のすべてを削除する (10) 回繰り返す // 作成するクローンの総数に変更する [] を [X座標リスト v] に追加する [] を [Y座標リスト v] に追加する [クローンの総数 v] を (1) ずつ変える [自分自身 v] のクローンを作る end
各クローンでの処理を、次のように指定する。
クローンされたとき [クローンID v] を (クローンの総数) にする ずっと [X座標リスト v] の (クローンID) 番目を (x座標) で置き換える [Y座標リスト v] の (クローンID) 番目を (x座標) で置き換える end
ここで説明した方法を組み合わせて、クローンの種類ごとに処理をわけながら、さらに情報を別のスプライトやクローンと共有させることも可能である。
応用例
ここで紹介したテクニックは、次のような場面で活用できる:
- 1つのスプライトから、複数のボタンを生成する
- 1つのスプライトから、さまざまな種類の、大量の敵を発生させる
- 複雑な (または、多少簡略化した) パーティクル効果
- 1つのスプライトで、雲、爆発などさまざまな効果を発生させる
- タワーディフェンスゲームで、数多くの建物をマップに建築する
- 弾丸を表すスプライトを1つ作って、銃を発射するすべてのキャラクターの弾丸をそこから作成する。