提供: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番号ではなく、クローンの種類ごとに動作を変えることもできる。

準備

この例では、次の変数を使用する。

  • 弾丸の種類:クローンされた弾丸が、プレイヤーが発射したものか、敵が発射したものかを表す変数
  • 発射Xと発射Y:弾丸の発射場所を表す変数
  • 弾の向き:弾の向かう方向を表す変数

スクリプト例

「スペースキーが押されたとき」に弾丸を発射する場合、次のスクリプトを記述する:

[スペース 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つ作って、銃を発射するすべてのキャラクターの弾丸をそこから作成する。

関連項目

Cookieは私達のサービスを提供するのに役立ちます。このサービスを使用することにより、お客様はCookieの使用に同意するものとします。