2017年03月18日

ドリームキャストの2Dゲームを作った(1)画像の表示

ドリームキャストの2Dゲームを作りました。様々な人にお世話になりましたが、一応完成しました。

宣伝。こんなやつ。

これからドリームキャストのゲームを作る方の為に、わかったこと学んだことをまとめようと思っていたのですが、いざ書くとなると何を書けばいいかわからず一向に筆が進みませんでした。講座を作る人って凄いです。

とりあえず、すごく大まかな点だけ言うと、
1.使用したライブラリはKallitiOS 2.1.0です。
2.一から書けるほどスキルがないのでexamplesフォルダに入っている「png」サンプルを改造しました。
  このサンプルはその名の通りpng画像を読み込んで表示するサンプルです。
  この中に画像表示、コントローラー入力があります。
3.プログラミングの師匠の勧めに従い、DXライブラリの近似関数を作成。組み上げる。
といった形で進めました。

まず(1)番ですが、開発環境の構築と実行は前の記事で扱っていますので、そちらを参考にしてもらえればと思います。

で、今回は(2)番を扱おうかと思います。
画像を表示するのは、
1.ビデオメモリ(VRAM)にメモリ領域を確保する。
2.画像を読み込んでVRAMに書き込む。
3.VRAMを参照してポリゴン表示。
といった流れになります。


【1.メモリ領域の確保】
テクスチャとして使う画像データはメインメモリではなく、ビデオメモリに書き込む必要があります。
ビデオメモリ操作用の関数は次の通りです。
pvr_ptr_t pvr_mem_malloc (size_t size)
void pvr_mem_free (pvr_ptr_t chunk)

大体わかると思いますが、普通のmallocとほぼ同じです。pvr_mem_mallocでVRAMに領域を確保できます。
標準的なARGB1555等の1ピクセル2バイトで256*256の画像を扱うなら、2*256*256のサイズを確保する必要がありますね。


【2.画像を読み込んでVRAMに書き込む】
PNG画像を読み込む関数はいくつかあるのですが、僕は以下の関数を使いました。
int png_load_texture(const char *filename, pvr_ptr_t *tex, uint32 alpha, uint32 *w, uint32 *h)

*texにVRAMのアドレスを、*wと*hで画像の高さと幅を取得できます。
ちなみにこの関数はVRAMの確保もしてくれるので、事前のpvr_mem_mallocは必要ありません(たぶん)。使用後のpvr_mem_freeは要りますので注意を。
ここで重要な点として、テクスチャサイズは8*2の乗数でなければなりません。
8、16、32、64、128、256、512、1024です。


【3.VRAMを参照してポリゴン表示】
png_load_textureで得たアドレス(pvr_ptr_t *tex)を使ってポリゴンを表示します。
pngサンプルの中では「draw_back」関数ですね。
pvr_poly_cxt_t cxt;
pvr_poly_hdr_t hdr;
pvr_vertex_t vert;

pvr_poly_cxt_txr(&cxt, PVR_LIST_OP_POLY, PVR_TXRFMT_RGB565, 512, 512, back_tex, PVR_FILTER_BILINEAR);
pvr_poly_compile(&hdr, &cxt);
pvr_prim(&hdr, sizeof(hdr));

vert.argb = PVR_PACK_COLOR(1.0f, 1.0f, 1.0f, 1.0f);
vert.oargb = 0;
vert.flags = PVR_CMD_VERTEX;

vert.x = 1;
vert.y = 1;
vert.z = 1;
vert.u = 0.0;
vert.v = 0.0;
pvr_prim(&vert, sizeof(vert));

vert.x = 640;
vert.y = 1;
vert.z = 1;
vert.u = 1.0;
vert.v = 0.0;
pvr_prim(&vert, sizeof(vert));

vert.x = 1;
vert.y = 480;
vert.z = 1;
vert.u = 0.0;
vert.v = 1.0;
pvr_prim(&vert, sizeof(vert));

vert.x = 640;
vert.y = 480;
vert.z = 1;
vert.u = 1.0;
vert.v = 1.0;
vert.flags = PVR_CMD_VERTEX_EOL;
pvr_prim(&vert, sizeof(vert));

ポリゴンを表示するにはTA(タイルアクセラレーター)に32バイトまたは64バイトのポリゴンデータを書き込まねばなりません。この部分ではデータの作成と書き込みをしています。
pvr_poly_cxt_txrでは、ポリゴン情報を作成しています。
  PVR_LIST_OP_POLYはOpaquePolygonつまり不透明ポリゴンを指定しています。
  PVR_TXRFMT_RGB565はテクスチャのピクセルがRGB565の2バイトであると言っています。
  次に幅、高さで、back_texは先ほど取得したテクスチャのアドレスを入れます。
ピクセルデータ、幅、高さ、アドレスは使用するテクスチャによって変更しましょう。
pvr_primはTAへの書き込み関数です。
次に頂点データを入力します。スプライトなので、四角形の四点を指定しています。
pvr_primで各頂点データを送って、完了です。

大体こんな流れなのですが、分かりにくくてすみません。
画像の一部を表示したり、不透明以外のポリゴンを表示するのはまた次回以降で書きたいと思います。
分からないところがあればコメントして頂ければ、わかる範囲でお答えしたいと思います。

posted by たあし at 13:50| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする