Scratch 1.4にはパックマンのサンプルプログラムが付いています
非常に完成度の高いゲームなので、どうやって実装しているのか調べてみました。一度にゲーム全体を把握しようとするとわけがわからなくなるので、まずはパックマンの動きだけを調べてみることにします
パックマンだけの実装
わかりやすくするために、以下の機能だけを残して、他の処理は取り除きました
・矢印キーでのパックマン操作
・迷路の壁の判定(ワープもする)
・モンスターの部屋には入らない
・パックマンが動いているときはパクパクとアニメーション
・黄色いドットを食べる(音も鳴らす)
なので・・
・オープニング画面はなし
・スコアはなし
・パワーエサはなし
・敵もなし
・フルーツターゲット(ボーナス)もなし
・食べ終わってもクリアにはならない
です。
ただひたすらパクパク食べるだけです
これでプログラムがかなりシンプルになりました
こちらがそのプログラムです
パックマンただひたすら食べるだけ Scratchで作成
パックマンのコスチューム
コスチュームは全部で5つ
5つめのCollisionというコスチュームは、壁との当たり判定に使っています
拡大したのがこちら
オリジナル版は4つのマーカーの色が同じような青だったので、わかりやすく赤・水色・緑・青に変更しました。壁との衝突判定時に一瞬だけこのコスチュームに切り替えて、上下左右のマーカーの色が壁の色にぶつかっていないかを調べています
ステージ
背景は2つ。オリジナル版ではステージのクリアごとに交互に利用していますが、今回のプログラムでは切り替えていません。切り替えたい場合は手動で。壁部分に同じ色を使えば、自作のコースに差し替えても動作すると思います
プログラムについて
使っている変数
パックマンの動きだけだと、変数はこれだけです。黄色い背景の変数は「このスプライトのみ」です。このプログラムでは全ての変数を「このスプライトのみ」にしても動作しますが、この先の拡張を考えて一応オリジナルのプログラムと同じにしています
DesiredDir | 行きたい方向(上(1) 右(2) 下(3) 左(4)) |
FrameCount | 実行してからずっとカウントし続けるカウンター(コスチュームの変更に利用) |
HitWall | 壁にぶつかったかの判定 |
JailColour | モンスターの部屋の入り口にぶつかったかの判定 |
PacmanDir | パックマンの行く方向(上(1) 右(2) 下(3) 左(4)) |
PackmanFrame | 最初のコスチュームの番号 |
PackmanSpeed | パックマンの速さ。数値を大きくするとパックマンが早く動きますが、数値によっては壁をすり抜けたり、ドットを食べ残したりします。変更する場合は1.0〜2.0くらいで |
TempCostume | コスチューム番号を一時的に保存 |
TempDir | パックマンの向きを一時的に保存 |
TempX | 現在のx座標を偶数に変換した値を一時的に保存 |
TempY | 現在のy座標を偶数に変換した値を一時的に保存 |
プログラムの概要
2つのスレッドで構成されています
1つめ
パックマンを実際に動かす処理を行なっています
2つめ
キーの押下状態を調べて、行きたい方向に壁がなければ進むように変数にセットします
下矢印の時だけ、モンスターの部屋に入らないようにする処理を追加しています
ドット(黄色)に触れれば黒で塗りつぶします
こうやってプログラムを読み解いて行くと、そんなに複雑ではないことがわかります。ドットを食べる処理が黒く塗りつぶしているだけだったり、ワープの処理も拍子抜けするくらい簡単だったりします
これならがんばれば自分でも作れそうな気がしますね