メガドライブのゲームの作り方について、まとめたいと考えているのですが、わかりやすくまとめるのはなかなか難しいですね。これからしばらくは簡単なサンプルプログラムを紹介できたらと思います。
今回は、「画像を表示する」です。
メガドライブで画像を表示するためには、3つの段階が必要です。
① VRAMに画像のタイルデータ(8x8ドットを1セルとする画像データ)を読み込む。
② 画像のパレットを読み込む。
③ 画像のタイルマップデータ(画像のタイルデータの並びなどの情報:パターンネームテーブル)を読み込む。
画像は、SGDK付属のReCompでImage構造体のデータとして、プログラムに取り込みます。
*メガドライブのゲームの作り方 その3 - 画像の取り扱いを参照
●サンプルコード : test_01
<main.c>
#include <genesis.h>
/* gfx.resで指定した画像(Imgae構造体)を読み込めるように設定 */
#include "gfx.h"
int main()
{
/* ①VRAMに画像のタイルデータを読み込む */
VDP_loadTileSet(image.tileset, TILE_USERINDEX, FALSE);
/* ②画像のパレットを、1番目のパレット(PAL0)に読み込む */
VDP_setPalette(PAL0, image.palette->data);
/* ③画像のタイルマップデータをスクロール面(PLAN_A)に読み込む */
VDP_setMap(PLAN_A, image.map, TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, TILE_USERINDEX), 0, 0);
while(1)
{
/* 1/60秒毎に発生するVSyncを待つ */
VDP_waitVSync();
}
return (0);
}
<gfx.res>
/* test_01.pngをimage構造体として読み込む */
IMAGE image "test01.png" -1
●サンプルコード : test_02
実は、上記の3つの段階の処理を、まとめて行なってくれる関数も用意されています。
<main.c>
#include <genesis.h>
/* gfx.resで指定した画像(Imgae構造体)を読み込めるように設定 */
#include "gfx.h"
int main()
{
/* 画像をPLAN_Aに表示 */
VDP_drawImageEx(PLAN_A, &image, TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, TILE_USERINDEX), 0, 0, TRUE, FALSE);
while(1)
{
/* 1/60秒毎に発生するVSyncを待つ */
VDP_waitVSync();
}
return (0);
}
<gfx.res>
/* test_01.pngをimage構造体として読み込む */
IMAGE image "test01.png" -1
実行すると、画面にこんな画像が表示されるはずです。
ところで、先日ClubERAの皆さんに集まって頂いて、メガドライブプログラミング教室?を開催しました。各自ノートパソコンを持参して頂いて、SGDKのインストールから始めました。
内容は、
-
メガドライブのハードウェアの解説(スプライトやスクロール面、サウンドチップなど)
-
SGDKの解説(WindowsにとってのDirectXの様な存在。メガドライブのゲームエンジン。)
-
SGDKやプログラミングに必要なツールのインストールと設定(インストーラーは用意しておきます。)
-
C言語とHELLO WORLDプログラム(文字を画面に表示する最も簡単なプログラミング)の解説
-
1942みたいな縦スクロールシューティングゲームを実際に作ってみる
-
スペースインベーダー、ギャラクシアン、パックマンの既存のプログラミングを改造して遊んでみる(キャラクタや効果音を自分で作ったオリジナルのものに変更)
こんな感じの内容を用意していました。各自のPCのOSのバージョンの違いや、セキュリティーソフトの関係などで、SGDKやその他のツールのインストールに結構時間がかかりました。
それでもなんとか、HELLO WORLDプログラムまでは終了することができました。皆さん長時間付き合ってくれて有り難う!
最終的に、簡単な縦画面のシューテングゲームをみんなで完成できればと思っています。