2013年11月24日
32KバイトSRAM搭載のPIC32MX150F128Bを使った256×224ドット、16色、正方画素のカラービデオ出力実験の応用で、PICワンチップによるテレビゲームパックマンを作成しました。以前作成したキャラクターベースのパックマンをグラフィック版に書き直したものですが、動きがスムーズになり、見栄えもずいぶんよくなりました。とてもワンチップマイコンだけで実現されているとは思えないほど、いい感じに仕上がりました。
ハードウェアはカラービデオ出力実験のときに使ったものと全く同じです。また、キャラクターベースのパックマンからもマイコンを変更しただけなので、ICソケットを使って作られていた方は、単純にマイコンを差し替えするだけで動作します。ただ、ビデオ出力の安定化のために75Ωの抵抗を追加しましたので、必要に応じて付けて下さい。
また、試したわけではありませんが、PIC32MX150F128Bの代わりにUSB機能搭載のPIC32MX250F128Bもそのまま使用可能だと思います。
(2014.4.4)実際PIC32MX250F128Bでも動作確認済みです。
この写真は私の記事を見たNASUさんが起こしてくれたプリント基板です。もともとPIC32MX120F032B用として作られたものですが、PICマイコンを差し替えただけで、今回のゲームも問題なく動作しました。ここで頒布もされています。
(2013.12.12)ビデオ信号波形の計算式にミスがあり、ソースプログラムとHEXファイルの修正をしました。色合いが少しよくなりました。
(2015.11.21)今後のシステム対応のため、設定変更を行いました。
ソースファイルのダウンロード |
今回も全てのソースコードと、念のためにHEXファイルを掲載しておきます。プロジェクトに全てのソースファイル、インクルードファイルを追加して、ビルドしてください。MPLAB XC32 v1.31またはC32 v2.02で動作確認しています。XC32 v1.33以降には対応していません。
ビルドに際して、オプションで最適化の設定が必要です。フラッシュメモリの容量は128Kバイトと大きいのでまだまだ余裕があるのですが、さすがにグラフィック処理が重く、最適化なしでは表示が間に合わず、ちらつきが発生することがあります。MPLAB IDEの場合、メニューの「Project」-「Build Options」-「Project」で、図のように「MPLAB PIC32 C Compiler」-「Categories」-「Optimization」の「Optimization Level」を1またはそれ以上に設定してください。フリー版だとビルド時に警告が出て、利用できないようなメッセージが出ますが、実際にはLevel1は利用可能なようです。
MPLAB IDEの場合
各ファイルは以下の機能となっています。
・composite32-high4.c
高解像度グラフィックビデオ出力システム。詳細はこちらのページを参照ください。
・composite32-high4.h
上記システムのインクルードファイル。
・pacman2.c
main関数を含む、ゲーム本体。
・pacman2.h
パックマンプログラムの定数や構造体などを定義したインクルードファイル。
・pacman2data.c
フォントとビットマップデータ
ビデオ端子、音声端子をテレビに接続して、電源オンするとタイトル画面が表示されます。今回はタイトルアニメーションも作成しました。STARTボタンで音楽と共にゲームが始まります。あとは方向ボタンでモンスターを避けながらクッキーを全部食べてください。
キャラクターベースとは違い画像が本物っぽく、動きも滑らかです。フルーツの画像もそれらしくなっていて、楽しい感じがします。ただシステムの問題として、横幅1ドットの点は正しい色が出ないことが多く、2ドット以上並べないとおかしな色となることがあります。特に13面以降に出てくるフルーツの「鍵」がひどくて、白いはずの縦線が奇妙な色になるのですが、なかなかそこまでたどり着くことができないので、あまり見る機会はないかもしれません。
2面、5面、9面などの終わりには、アーケード版同様にコーヒーブレイクがあります。息抜きに楽しんでください。
1万点を越えるとハイスコアが登録されます。ハイスコアはフラッシュメモリの最後のページに書き込みをしますので、電源を切っても残ります。
これまでこのハード向けに作ったゲームでは、回路図にはあるけれど使われていなかったFIREボタンを、今回一時停止ボタンとして使いました。ゲーム中に押すと一時停止し、もう一度押すと再開します。元々は画面写真撮影用に作った機能なのですが、あってもいいかなと思い、残すことにしました。
今回のプログラムは、以前作成したキャラクターベースのパックマンをグラフィックベースに改造したものなので、多くの部分は以前と共通です。そのため、ソースプログラムを見ると分かるかもしれませんが、ちょっと継ぎはぎのようなところもあります。フォントデータには、今回使っていないデータも残っていたりします。
プログラム上の一番大きな違いとしては、動きが1ドット単位になったことです。動作スピードの基本単位は、これまでの作品同様にビデオ信号1画面分と同じ60分の1秒を使っています。キャラクターベースの場合は、面の難易度に応じて60分の何秒で1キャラクター移動するかを定義していました。しかし、1ドット単位ではその方式だと遅すぎるため、今回は60分の1秒で何ドット移動するかを定義しています。何ドットといっても実際は1ドット以下が必要なため、小数点以下を256倍して定義しました。
60分の1秒単位というのは、高精細なゲームにとっては大まかすぎる時間なので、今後はより短い時間を扱えるようシステムに機能追加したほうがいいかもしれません。
今回あらためてPIC32MX150F128Bのよさを感じました。細かいドットで正常な色が出ない問題はありますが、ワンチップでここまでできれば、ほかにもいろいろと作れそうです。フラッシュメモリも大きいので、画像データなど大きさをあまり気にせずに作れます。
最後に、今回もYouTubeに紹介動画を掲載したので、ご覧ください。
ご意見、ご質問、メッセージなどありましたらこちらの掲示板にお願いします。