SGDK+Code::Blocksでの開発環境を整えたので、さっそく使ってきます。
まずは画像を1枚表示します。新しいゲーム開発環境を使う時のセオリーは1ドットを表示するとか1文字出すが基本ですが、SGDKを使う場合、そのへんはすっとばした方が理解が早く、また、楽しいです。
まずは、新しいプロジェクトを作成します。Code::Blocksを起動して、メニューのFile->New->Project...で、Empty Projectを選択して、プロジェクト名を付けます。
コンパイラ設定は、Sega Genesis Compilerを選択するようにします。ウィンドウ左端のプロジェクト名を右クリックしてメニュー最下段のProperties...を選択します。
Makefileを指定してください。この辺はCode::Blocksの環境設定での新規プロジェクトの作成と同じです。
一応、Hello worldの表示確認をしておきます。
#include <genesis.h> int main() { VDP_drawText("hello world", 0, 0); while(1) { VDP_waitVSync(); } return (0); }
注意点としては、Code:BlocksのBuild対象がdefaultになってないとエラーになります。Debugだとだめみたいです。
メガドラの仕様はよくわかってないのですが、画面は320×224らしいのと、パレット1つが16色らしいので、edgeとかの16色を扱えるツールを使って画像を用意します。
edgeでこんな感じで16色のpngで保存します。
Code::Blocksのプロジェクトフォルダにresという名前のフォルダを作成して、そこに画像ファイルを置きます。(※画像の配置場所はここでなくてもいいのですがわかりやすいので)
Code::BlocksでFile->New->empty fileを選びます。最初にファイルを保存するかどうか聞かれるので、先ほど作成したresフォルダにresource.resという名前で保存します。自動的にresource.resがプロジェクトのResources\resの位置に追加されるはずです。
resources.resをCode::Blocksか、テキストエディタで開き、
IMAGE ys_title "ys_title16.png" -1
と書いてセーブしておきます。この辺、画像ファイルをドロップするだけでリソース追加できそうな気がするのですが、よくわかりません。
hello worldのプログラムが書いてあるmain.cに三行追加します。
#include <genesis.h> #include "resource.h" int main() { VDP_setPalette(0, ys_title.palette->data); VDP_drawImageEx(BPLAN, &ys_title, TILE_ATTR_FULL(PAL0, 0, 0, 0, TILE_USERINDEX), 0, 0, 0, 1); VDP_drawText("hello world", 0, 0); while(1) { VDP_waitVSync(); } return (0); } ※ 最近のSGDKではVDP_drawImageEx()の第一引数の定義が変わっていて、BPLANではなくPLAN_Bのようです。
resource.hは、いつの間にやらresフォルダに勝手に作られていました。
VDP_setPalette()はパレットを設定してて、VDP_drawImageEx()で画像を表示するっぽいです。仕組みは分かりません。
Buildすると、outフォルダにrom.binが出来るのでエミュレータに放り込みます。
かんたん!これだけでも、文字表示と合わせてテキストアドベンチャーゲームが作れそうですね。
Regenというエミュレータでは、BGやパレットやスプライトの定義を見ることができます。 (デバッグ版だけかもしれません / v0.97 (with debuggers) )
メニューのTools→VDP Debugger...を選択します。
png画像を8x8のパーツに切り分けて表示しているみたいですね。定義データの最初の16個は単色パターンが定義してあるようです。
また、パターン定義の後半に数字やアルファベットが定義してありました。VDP_drawText()は、これを使って文字を表示しているわけですか、なるほど。
これまで、VDP_ナントカみたいな関数を使ってきましたが、これらの使い方は、SGDKのdoc/htmlフォルダにあるドキュメントに書かれています。なぜか公式サイト上では読めないようなので、自分のサイト上にUpしてあります。
BG面に描画する関数は、vdp_bg.hで定義されているようです。色々と楽しげな関数が用意されてますね。
せっかくなので、BG面に指定位置に書き込みをしてみます。何かよさげな命令はないかなーと探してみると、vdp_tile.hにVDP_setTileMapXY()という関数がありました。たぶん、(x,y)の位置にBGデータを配置するんだと思うので、てきとーに使ってみます。
VDP_PLAN_A、VDP_PLAN_Bというのは、メガドラのBG面が2枚あって、そのどちらに表示するかの指定だと思います、たぶん。TILE_ATTR_FULL()マクロは、BGのパレットやら反転指定をしているみたいですね、なんとなく。
#include <genesis.h> #include "resource.h" int main() { int y; VDP_setPalette(0, ys_title.palette->data); VDP_drawImageEx(BPLAN, &ys_title, TILE_ATTR_FULL(PAL0, 0, 0, 0, TILE_USERINDEX), 0, 0, 0, 1); VDP_drawText("hello world", 0, 0); for (y = 0; y < 16; y++) { VDP_setTileMapXY(VDP_PLAN_A, TILE_ATTR_FULL(PAL0, 1, 0, 0, y), 0, y); VDP_setTileMapXY(VDP_PLAN_A, TILE_ATTR_FULL(PAL0, 1, 0, 0, y), 39, y); } while(1) { VDP_waitVSync(); } return (0); } ※ 最近のSGDKではVDP_drawImageEx()の第一引数の定義が変わっていて、BPLANではなくPLAN_Bのようです。
BG面の任意の位置にBGパターンを表示することができました。これだけでもテトリスなら作れそうですね。メガドラでテトリス・・・あっ