画像を表示してみる

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.hVDP_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パターンを表示することができました。これだけでもテトリスなら作れそうですね。メガドラでテトリス・・・あっ


上のページに戻る