[Scratch3で簡単なゲーム作成編⑥] クローンの使い方を工夫して、スプライトのプログラミングを効率化してみる


2020/09/25

ここまでのゲームの作り込みで、アイテム・敵のスプライトの数・文字表示の位置の数が増えていくにつれて、何が何の役割をもったスプライトなのか分かりにくくなってきます。

そこで、今回はクローンの機能を上手く利用して、スプライトの数を減らし、最小の数のスプライトでゲームを作るテクニックを解説します。


👇プログラミング教室をお探しの人必見!

👇スクラッチの教科書をお探しの人必見!

はじめに

まずベースとなる効率化前のプロジェクトはスクラッチのオンラインページのここにおいております。

今回はこのプログラムを修正しながら以降の内容の解説を進めていきます。

また、
以前の内容・スプライト・クローンの利用法〜中級者編で説明した内容をよく理解していないと、今回の記事の内容が分かりにくいかもしれません。

一度、以降の内容に進む前に、そちらをよく読んでからまた戻ってきていただくと理解がすすむのではないかと思います。

効率化前と後でコーディングブロックがどのように変わったのか比較してもらえるように、効率化後のプロジェクトも
ここでアップロードして公開しております。


おきばしょスプライト

まずはおきばしょというスプライト名にして、他は全て消します。

リストを使った座標の取り出し

ローカル変数おきばしょ_を使って、クローンに裏番号を割り振りましょう。

ローカルリストとして
ヨコリスト_タテリスト_にエサ置き場の座標を登録しておきます。

試しにエサ置き場を5回クローンするだけのブロックを実行してみると、

合同会社タコスキングダム|タコキンのPスクール

裏番号を持ったクローンが狙い通り作成されています。

さて、それでは一つのクローンごとの処理をさせるにはどうしたら良いのでしょうか。

答えは、
クローンされたときにクローン一つ一つにやらせたい処理のブロックを入れることで実現出来ます。

合同会社タコスキングダム|タコキンのPスクール

イベントをまとめる

ここからブロックを大きく手直しするので、少々内容が複雑になってきます。

まずは、ローカル変数
せんたくされた?_をスプライトに追加します。この変数で、食べ物がセットされた時にはゼロ以外の数になるようにしています。(下の図の①の部分)

合同会社タコスキングダム|タコキンのPスクール

上の図の②、③、④の部分は一続きに書くと縦に長くなるので、ひとまず3つに分解してます。

③のブロックでクローンの裏番号(
おきばしょ_)ごとに、何か食べ物が置かれていた場合に捨てる処理をしています。

④のブロックでは、
たべもの1?たべもの5?のどれかで指定された食べ物の名前からコスチュームを設定するブロックです。

ここでの重要なポイントは②のブロックのはたらきです。
このスプライトが押されたときイベントの中でしかクローンの裏番号が識別出来ないので、各クローンのコスチュームを個別に変えるには、このブロック内で行うしかありません。

そこで
たべものモードに飛んで食べ物を選んでる最中は、変数せんたくされた?_が変わるまでスクリプトじっと待機し、この変数が変わってから処理が再開されるようにしています。

たこスプライトとの接触判定

スプライトとクローンの当たり判定のお話はこちらで解説したことがありますので、このテクニックを用います。

合同会社タコスキングダム|タコキンのPスクール

このテクニックの解説に関しては以前詳しく取り上げたので、ここでは割愛します。

スコアボードスプライト

スコアや食べたアイテム数で、表示できるアイテムを増やす機能を前回で盛り込みましたが、このようなキャラクター・アイテムなどの進化フラグはどのスプライトからでも見えるように〇〇みえる?という(グローバル)変数で管理するのが良いやり方です。

スコアボードスプライトのプログラムは以下のようなブロックを追加します。

合同会社タコスキングダム|タコキンのPスクール

これで
〇〇みえる?がゼロでないときに、ゲームの状態を変更し、アイテムを見せる/見せないというフラグを切り替えることができるようになります。


たべものスプライト

次に選択画面に表示されるスプライトも1つにまとめてたべものスプライト1つにします。コスチュームもすべてまとめています。

合同会社タコスキングダム|タコキンのPスクール

ここではクローンに裏番号を割り振るためにローカル変数
たべもの_を使って以下のようにクローンを作成します。

クローンする位置をリストを使うことでより効率的に管理できるようになります。ここでもローカルリスト・
ヨコリスト_タテリスト_の2つを定義して、縦と横の値を順序良く読み出しして使っています。

合同会社タコスキングダム|タコキンのPスクール

条件を満たしたときに特定のクローンを表示させるようにするためには、その条件を
クローンしたときイベントに定義する必要があります。

あとはどのクローンが選択されたかを調べるためには、
このスプライトが押されたときイベント内で、たべもの_を利用して裏番号から条件分岐を作ることで実現できます。

また、先程スコアボードのスプライトで作成していたアイテム表示フラグ
〇〇みえる?を使って、ある条件を満たした時点で表示に切り替えができるようにすることも効率化の大きなポイントとなっています。

合同会社タコスキングダム|タコキンのPスクール


スコアスプライト

最後にスコアボードにスコアを表示させるスプライトを一つにまとめようと思いますが、こちらは既にクローン機能を利用してスコアを表示させていたため、これを統合しようとなるといささかトリッキーかも知れません。

この節の内容を理解できればクローンがかなり理解できていることになりますが、すこし難しいと感じられたら、今のままのプログラムでも十分機能しているので、無理にスプライトの集約化をする必要はありません。

まずは
スコアスプライトに、他のスコアのスプライトのコスチュームをコピーして一つに集約させます。

合同会社タコスキングダム|タコキンのPスクール

元のプログラムのままブロックをまとめただけでは、スコアのスプライトにループが多数存在して処理が混線してくるので、スコアが変わったときだけ描画するようにプログラムを見直します。

まずは
スコアでクローンさせる総数とその割当の設計について考えてみます。

まずは、アイテムの画像を貼り付けるクローンが7個、スコアには最大8桁までの数字が表示できるとして8個、アイテム全6種類として各アイテム取得数が最大3桁までの数字が表示できるように18個、計33個のクローンを必要とします。

合同会社タコスキングダム|タコキンのPスクール

ということで、ゲームが開始したら33回のクローンを生成しておきます。

まずはアイテムの画像を貼り付ける7つのクローン(裏番号は0から6)ですが、引数付きの定義ブロック
スコアみえかたを利用して効率よく配置・表示/非表示を設定しています。共通部分をくくり出して、引数付きの定義ブロックにしているゲームは頻繁に目にするので、積極的に使って身に付けるとよいと思います。

合同会社タコスキングダム|タコキンのPスクール

また、現在のスコアの表示と各アイテム取得数を表示するプログラムですが、たとえば
スコアの現在の得点とりんごの取得数の表示プログラムは以下のようになります。

合同会社タコスキングダム|タコキンのPスクール

ここではそれぞれ定義ブロックを定義し、
スコアひょうじでは8桁の得点の表示に使うクローンの裏番号が7から14ですのでその範囲に絞った使い方をしています。

りんごひょうじでは、取得したりんごの数を3桁で表すので、15から17の裏番号のクローンを使う...というロジックで処理が繰り返えされています。

これらのクローンはゲーム中ずっとスコアを監視して、変化したときに表示を変える必要があります。なので最終的に、
クローンされたときにブロックにずっとブロックの中でこれらの処理を入れて使わないと正しく動作しないことも覚えておいてください。

合同会社タコスキングダム|タコキンのPスクール

以上、ゲームの効率化のお話でしたが実はまだまだ効率化できそうではあります。

プログラミングの効率化・最適化はやればやるほどきりがなくなってくる話になりますので、程々にしておきましょう。


👇プログラミング教室をお探しの人必見!

👇スクラッチの教科書をお探しの人必見!

まとめ

今回の修正で、修正前にこれだけあったスプライトの数がぎゅっと圧縮されてスッキリしました。

合同会社タコスキングダム|タコキンのPスクール

同じような機能をもつスプライトをクローンでまとめ上げることで、すっきりとキレイなプロジェクトに仕上げることができました。

ただし良い事ばかりではなく、スプライトの数が最適化されたことでゲームの拡張はやりやすくなった反面、ひとつあたりのスプライトのコーディング量も大きくなり複雑化してしまうため、機能の集約化やブロックを読み解くには高度なプログラミング知識が必要になってきます。

プログラミング上級者になることは、良いプログラムを書けるようになることと言い換えてもいいように、なかなか一朝一夕では習得できないものです。

今回説明した内容が難しいと感じたらコーディングの集約化にこだわらず、ご自分の今のプログラミング習得レベルにあわせたゲームを作ることを心がけましょう。