第1回:スプライトを洗い出す - Scratchの本格横スクロールゲームをリバースエンジニアリングしよう!
2022-1-08
Scratchで、本格的なゲームを作りたくありませんか?
だったら一度、ほかの人が作った本格ゲームの中身を調べてみましょう。
単純なゲームなら作れるけど、もっとすごいゲームを作ろうとすると、ごちゃごちゃになって手に負えなくなってしまう。そんな経験がある人におすすめです。
他の人が作った製品や機械の中身を調べることを「リバースエンジニアリング」といいます。もしかすると、あなたも自宅の家電や壊れたオモチャをドライバーで空けてみたことがあるかも知れません。中を見ると、色んなことが分かりますよね。
それを、他の人が作った本格ゲームでやってみましょう。
ここでは、Scratchの本格ゲームをリバースエンジニアリングしていく、私なりの手順を紹介します。題材には、スマホなどで無料で遊べる恐竜ランニングゲームを取り上げます。もちろん、ゲーム以外の題材でも、同じようにできると思います。
ただし、情報が盛りだくさんになったので、記事を4つに分けています。
- 第1回:スプライトを洗い出す
- 第2回:スプライトとメッセージの関係
- 第3回:恐竜のコードをどう呼び出すか
- 第4回:個別の処理を見ていく
どんなゲームを題材にするのか
さて、本格的なゲームというと、どんなものを思い浮かべますか?
私も、いままで、いくつかのゲームを作ってきましたが、かなりシンプルなものでした。横スクロールゲームだと、こんな感じです。タイトル画面はありますが、リスタートはできません。スコアは、変数を表示するだけです。
ここでは、本格的なゲームとして、次のような流れのものを取り上げます。最初に作者のロゴがあって、タイトル画面を表示して、スタートボタンを押すと実際のプレイ画面を表示してゲームプレイがスタート、障害物と衝突して失敗すると得点画面を表示して、リスタートをうながします。
こんなふうに画面が切り替わっていくと、本格っぽい感じがしますよね。
今回の題材:恐竜ランニングゲーム
今回は、Scratchの横スクロールゲームをリバースエンジニアリングしてみました。題材は、Androidスマホがネットにつながっていないときに遊べる恐竜ランニングゲームです。話題になったので知っている人も多いと思います。
次の埋め込みは、実際にゲームとして遊ぶことができます。スペースキーまたはタップしてみてください。
元々、このゲームは、AndroidのためにGoogleが開発したものです。WebブラウザのGoogle Chromeにも組み込まれています。
誰でも自由に無料で複製・改良できるオープンソースという形式で公開されているので、ネット上にもクローン版がたくさん公開されています。
- Chrome 恐竜ゲーム (Google Chromeで遊べます)
- T-Rex Dinosaur Game - Chrome Dino Runner Online
- 【Chrome裏ワザ】あの「恐竜ゲーム」がオンラインでも遊べるの知ってた?
Scratchにも、いくつかクローン版があります。ただ、オリジナルと動きや演出がちょっと違っているみたいです。今回は、手前みそながら、私が作った恐竜ランニングゲームを題材にしています。
面白いゲームですが、ほどよくシンプルなので、中身を調べたり、改良版を作るには最適な素材だと思います。
リミックスとリバースエンジニアリング
Scratchでは、リミックスが簡単にできますよね。
「リミックス」とは、他の人がScratchで共有しているプロジェクトを元にして、オリジナルの作品を作ることです。面白いプロジェクトを見つけたら、「リミックス」ボタンを押すだけで、プロジェクトのコピーを保存できます。そこに自分独自のアイデアを付け加えれば、オリジナルのプロジェクトになります。
でも、本格的なゲームのようなすごいプロジェクトを改良しようとすると、スプライトも多いしコードも複雑で、どこから手を付けていいか分からない、なんてこともありますよね。
そこで、リミックスしたプロジェクトをリバースエンジニアリングしてみましょう。
Wikipediaでは、リバースエンジニアリングを次のように説明しています。
リバースエンジニアリング(Reverse engineering、直訳すれば逆行工学という意味)とは、機械を分解したり、製品の動作を観察したり、ソフトウェアの動作を解析するなどして、製品の構造を分析し、そこから製造方法や動作原理、設計図などの仕様やソースコードなどを調査すること
リバースエンジにアリングは、市販されている製品や機械からいろいろな情報を引き出します。Scratchだけのテクニックではなく、多くの技術開発の現場で行われています。
Scratchのプロジェクトをリバースエンジニアリングすると、全体の構造を理解できるようになります。特徴的な機能が、どんなコードになっているか調べやすくなりますし、本格的なゲームを作るときに大いに参考になりますよ。
※現実の社会において、内部構造などを調査するリバースエンジニアリングは合法ですが、コピー製品を作って販売すると、知的財産権(特許・著作権・商標など)を侵害する可能性があります。
※Scratchで共有されているプロジェクトは、誰でも自由に使うことができます。 プロジェクトをリバースエンジニアリングした場合も同様だと思います。リミックスするときは、必ずクレジット(元の作者名)を「作品への貢献」として記載するといいでしょう。
リバースエンジニアリングする手順
私がリバースエンジニアリングするときは、だいたい次の手順でやっています。
- まずは遊んでみる
- 中を見る
- スプライトを調べる
- メッセージを調べる
- 変数とリストを調べる
- コードの細部を調べる
面白いゲームがあると、その特徴的なところを深掘りしたくなりますが、それよりも、まずは全体のつながりをつかむことを意識します。
それでは、実際にやっていきましょう。
まずは遊んでみる
最初に、対象のゲームにアクセスして、実際に遊んでみましょう。ある程度、全体像がわかってきたら、ゲームの要素や動きを書き出してみてください。たとえば、プレイ画面であれば、「恐竜」「サボテン」「地面」「雲」「スコア」「Jumpボタン」「Duckボタン」があるという具合です。
こうした画面の要素は、すべてスプライトやコードで実現しているはずです。そして、どうやって実現しているか調べるのがリバースエンジニアリングです。なので、この段階で、調べる対象を洗い出しておくのです。もちろん、最初からすべてを洗い出すのは大変かもしれません。その場合は、あとからリストに追加すれば大丈夫です。
私が、恐竜ランニングゲームについて調べたとき、書き出したメモはこんな感じです。簡単なゲームの説明にくわえて、画面の要素やデザイン・操作などを細かく記録しています。
ゲームの説明
恐竜が画面を走るエターナルランナーゲーム。
サボテンと翼竜を避けて、できるだけ長く走る。
画面の要素
- 地面:砂粒と岩
- 雲:背景で、右から左にスクロール
- Dino:一番左に恐竜(T-Rex)がいる
- スコア:走行した距離
- サボテン:障害物。飛び越える
- 翼竜:障害物。飛び越えたり、くぐったり。スピードが少し早い
ゲームの流れ
- 制作者のロゴ
- タイトル画面
-
STARTで、ゲームプレイ開始
-
地面が横スクロール
- 恐竜は、左端で走るアニメーション
- 最初から、障害物としてサボテンと翼竜が出る
- プレイヤーの操作で、ジャンプ/しゃがむ
4.障害物に衝突すると停止。リトライボタンを表示
デザイン
- ドット絵
- モノクロ
- 横長
操作
- ジャンプ:スペース or 上矢印 or タップ
- しゃがむ:下矢印
効果音
- ジャンプ
- 衝突
- BGM
その他
- 恐竜に、物理エンジン風の動きが付いていて、ジャンプでゆれる。
- 障害物にぶつかると、はねとばされる。
- 背景の雲が、ばらばらに動く
このほかに、プロジェクトの使い方とメモやクレジットにも役に立つ情報があるので、よく読んでおきましょう。
中を見る
つぎは、プロジェクトの中を見てみましょう。これは「中を見る」ボタンを押すだけなので簡単ですね。
スプライトを見る
プロジェクトの中身について、私が最初に調べるのは「スプライト」です。ゲームのなかに、どんなスプライトがあるのか順番に見ていきます。
スプライトの名前も確認しておきましょう。コードから、このスプライト名で呼び出すためです。たとえば、DinoRunnerで、サボテンは「cactus」、翼竜は「birds」となっています。
最初に書き出しておいた画面の要素やゲームの動きと比べてみると、1対1で対応していないところもあるので面白いと思います。
DinoRunnerの場合は、地面が「ground1」と「ground2」に分かれています。得点表示は「score engine」「score engine2」「bestscore engine」に分かれています。
それから、各スプライトの「コスチューム」も見ておきましょう。dino(恐竜)は、次のようにアニメーションに合わせて、複数のコスチュームを持っています。
「cactus」(サボテン)は、数やサイズによって、複数のコスチュームを持っています。
ゲームが本格的になってくると、スプライトもかなりの数になってきます。遊んだときには気がつかなかった素材も見つかると思います。
では、実際のゲームとスプライトがどんな関係になっているのか整理して、全体像を把握するにはどうすればいいでしょうか。