ライン

ワンチップマイコンによる回転スクロールシューティングゲーム VELUDDA

ライン

2014年11月15日

 電子機器に内蔵されている基板を見ていると、何やら構造物の建ち並ぶ街並みを上空から眺めているような気持ちになることがあります。この基板上空を空飛ぶ円盤に乗って飛行していると、突如前方から攻撃を仕掛けられ、また地上からは砲弾が狙って飛んでくる・・・しまった、ここは敵の要塞上空だったのか!生きて帰るには敵機を全滅させるしかない!
 そんな空想に耽りながら、PIC32MXマイコンによるオリジナルの本格的シューティングタイプのテレビゲームを作りました。タイトルは「VELUDDA」(ベルーダ)。マイコンチップだけでカラービデオ信号生成とサウンド出力、そして画面の回転とスクロールの処理をしながらシューティングゲームを実行するという無茶をしていますが、実に動きは滑らかです。PIC32MXの性能の高さを実感することができる作品に仕上がりました。


ハードウェア

 以前行った、拡大縮小回転機能付きビデオ出力実験の回路に、操作用のボタン6個と、モノラルの音声出力を追加しただけの、シンプルなハードウェア構成です。使用したマイコンはPIC32MX370F512Hで、動作システムクロックが最大100MHz、搭載メモリはプログラム用フラッシュが512KB+ブート用12KB、SRAMが128KBとこれまでのPICマイコンとは比べものにならないくらい高性能なチップです。それでいてチップ自体は6ドル程度と、非常にコストパフォーマンスに優れています。パッケージが0.5ミリピッチの64ピンTQFPというのが難点ですが、市販の変換基板を使うなどすれば扱いやすくなります。また、試したわけではありませんが、USB機能搭載のPIC32MX470F512Hでも動作すると思います。
 電源は3.3Vですが、アルカリ乾電池2本でも動作します。私は5VのACアダプタと3端子レギュレータで3.3Vを作っています。6個のボタンは、タクトスイッチでよいです。カバーをつけると操作しやすくなるのでお勧めです。
 発振子には必ず14.31818MHzの水晶を使ってください。セラミックのレゾネータでは精度が低く、カラーが出せません。
 システムの詳細は解説は、拡大縮小回転機能付きビデオ出力実験を参照してください。

 右の写真はpupさんが起こしてくれたプリント基板で製作したものです。チップ部品を使用して、とてもコンパクトに仕上げてくれました。

回路図

完成写真

プリント基板

遊び方

 ビデオ出力と音声出力をテレビにつなぎ、電源を入れるとタイトル画面が出ます。ここでSTARTボタンを押すと、音楽とともにゲームが始まります。
 自機は画面下のほうにある白くて丸い円盤です。敵要塞の上空を円盤で飛んで敵部隊を全滅させるという想定です。ゲームが始まると地上の要塞画像が下にスクロールしていきます。円盤は停止することができません。その代わり、左右のボタンで旋回することができます。旋回すると要塞画像が回転します。また、上ボタンを押している間は、通常の1.5倍にスピードアップします。マップの上下端、左右端はつながっているので、飛んでいるとやがて一周します。
 ゲーム開始するとすぐに、敵が編隊を組んで現れます。FIREボタンでミサイルを発射して、やっつけてください。敵機に衝突すると自機が1機減ります。敵機を全滅させるとステージクリアです。
 ステージ2からは地上から砲弾が撃たれます。砲弾は狙って飛んできますので、必ず避けてください。砲台はミサイルで破壊することができません。ただ、落下した砲弾が当たったときだけ破壊されます。
 自機は最初5機あります。ステージが5の倍数ごとにサービスで1機増えます。残りがなくなるとゲーム終了です。
 タイトル画面で上下ボタンにより、BGMの有無を選択できます。BGMにはエリック・サティの「グノシエンヌ」という少し風変わりな曲を採用したのですが、音源が単純な方形波のため、長時間プレイしていると、だんだん耳障りになってくるかもしれません。そのときはMUSIC OFFを選択してください。また、ゲーム中にSTARTボタンを押すと、一時停止することができます。

タイトル画面

プレイ画面

キャラクター一覧


画面回転スクロールの原理

 ゲーム全体マップは横1024ドット×縦512ドットのフィールドになっています。このフィールドの画像をスクロールと回転をさせながら画面に切り取って表示させるのが、本ゲームプログラムの一番の課題ですので、ここを解説します。
 前述の通り、拡大縮小回転機能付きビデオ出力実験のシステムを使いました。ただし、画面最上部は得点などを表示させたいので、改造して8行分だけ固定領域を設けました。この領域を除くと、表示領域は横256ドット×縦216ドットとなります。ビデオメモリは256ドット×256ドット、8ビット色分あり、ここから実際に表示させたい部分を切り取って出力するように設定を行うのですが、そのままの大きさで画面を回転させるとビデオメモリ領域からはみ出してしまいますので、1周してもはみ出さないように表示領域を縮小する必要があります(表示自体は拡大される)。
 計算すると約1.31倍するとよいことがわかるので、表示領域はその逆数をとって、ちょうど4分の3、横192×縦162ドット相当としました。

解説図1


 回転だけであればこれだけでよいのですが、スクロールさせるとなると、地上背景のマップ情報から一部を切り取って描画し続ける必要があります。
 スクロールするたびに表示領域全体を描画していると処理がとても間に合わないので、変更点だけを追加で描画し、画面表示開始位置を変更する方法を使いました。単純な縦スクロールのゲームでは普通に使われる手法ですが、回転を伴うと話は簡単ではありません。
 まず最初に表示領域全体の描画を行うのですが、このとき傾いている場合は図のように、その表示領域を含む矩形の描画窓領域分をビデオメモリ上に描画します。
 そして、スクロールや回転をすると、同様に新たな描画窓の矩形範囲を計算し、上下左右それぞれの増分だけ描画を行います(図の斜線領域)。

解説図2


 ビデオメモリは256ドット×256ドットの有限な範囲しかありませんが、表示は上下端、左右端がそれぞれ環状につながっていて繰り返されるようになっています。描画する際も、例えば上にはみ出した場合は、一番下に描画を行います。あとは表示開始位置と表示角度の設定を変更すると、回転スクロールが実現されます。
 このようにして、移動するたびに追加描画をしていくのですが、ビデオメモリが環状になっているため、追加描画した反対側は自然に消滅(新たに反対側の表示に消費される)していきます。最初に計算したように、描画窓がビデオメモリのサイズを超えることはないので、描画が反対側の表示部分を侵食することもありません。
 このように巧妙な仕組みで、回転スクロールを実現することができました。

解説図3


プログラムの使い方とダウンロード

 ソースファイルは6個に分かれています。またヘッダファイルが3個あります。
    bmpdata.s    地上画像データ
    graphlib2.c    グラフィック描画関連ライブラリ、フォントデータ含む
    musicdata.c   音楽関連データ
    rotatevideo2.c  拡大縮小回転機能付きビデオ出力システム(改造版)
    veludda.c     ゲーム本体(main関数、コンフィグ設定など含む)
    veludda_chars.c キャラクタービットマップデータ
    graphlib2.h    グラフィック描画関連ライブラリのヘッダー
    rotatevideo2.h  拡大縮小回転機能付きビデオ出力システム(改造版)のヘッダー
    veludda.h     ゲーム関連ヘッダー。各種ゲームパラメータ設定もここ

 MPLAB Xで全てをプロジェクトに追加して、コンパイルしてください。コンパイルに 際しては、オプションで最適化の設定が必要です。「xc32-g++」のoptimizationの項目でoptimization-levelをLevel1以上にしてください。Level1まではフリー版でも利用可能です。コンパイル済みのHEXファイルも公開しておきます。
 また、CコンパイラはXC32 v1.32以下に対応しています。v1.33から仕様が変更となり、ライブラリとしてplib.hを使用すると警告が出るようになりました。マイクロチップ社としては、今後xc.hの利用を推奨しているようですが、これまで作成したビデオ出力関連システムはplib.h用となっていて、xc.hには対応していません。ただ、v1.33でplib.hを使用した場合も、警告は出ますがコンパイルは正常にできているようです。

ソースプログラムのダウンロード


最後に

 拡大縮小回転機能付きビデオ出力実験に成功してから、応用作品を早く作りたいと思ってきましたが、ようやく完成しました。ゲームとしてもなかなか楽しめるものになったので、満足しています。今回のゲームを応用すれば、同様の回転スクロール型のビデオゲームが簡単に作れます。
 PIC32MX370F512HおよびUSB機能搭載版のPIC32MX470F512Hは、今のところ国内の販売店では販売されていないようで、マイクロチップのDirectショップや、その他海外通販サイトから購入する必要があるのが残念ですが、PICマイコンとしては、PIC32MZシリーズに次ぐ性能で、チップ自体のコストパフォーマンスは非常に高く、入手して損はないと思います。入手しましたらぜひこのゲームで遊んでみてください。
 ご意見、ご質問、メッセージなどありましたらこちらの掲示板にお願いします。

Copyright (C) KenKen All Rights Reserved.