さて、本来ならここでデータ構造を決めた後、プログラムの構造を考えるのですが、そんなことをしていると飽きてしまいそうなので、早くもプログラムを作り始めてしまいます。
まず、eMbedded Visual C++ 3.0(以下eVC)を起動します。
プロジェクトを新規作成して、基となるプログラムを作ります。作り方は第1回目にやりましたね。
最初は、インベーダーを表示するだけのプログラムから始めます。
まずは、表示するキャラクタを作成します。リソースへビットマップを追加し、そこにインベーダーを描きます。今回は使いませんが砲台や他のキャラクタもここで作っておきましょう。
リソースの追加1
リソースの追加2
リソースの追加3ビットマップの追加
リソースの追加4追加されたビットマップ
前回、画面サイズについて書きましたが、表示されるキャラクタは画面サイズに密接に関わってきます。320x240がポポペの画面サイズなので、中を動き回るキャラクタはそれよりも小さいほうが画面からはみ出さず、扱いが楽です。
ということで、今回は、縦横を10分割した32x24を1つのキャラクタのサイズにします。得点を表す数字は1桁を16x24として、2桁で32x24になるようにします。
キャラクタを描く
作成するビットマップ
ビットマップを作成したら、今度はそれを表示する処理を作ります。
ビットマップはいったんメモリに読み込んでから使用します。プログラム開始時にデバイスコンテキストハンドル(HDC)を作成し、ビットマップを選択します。
まず、グローバル変数としてHDCとビットマップのハンドルを用意します。
HDC hdcBmp; // キャラクタ用HDC
HBITMAP hBmp; // キャラクタ用ビットマップ
このビットマップは、プログラム実行中継続して使用するため、プログラムの最初に読み込みます。場所は、WM_CREATE通知の処理の中です。
case WM_CREATE:
hwndCB = CommandBar_Create(hInst, hWnd, 1);
CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0);
CommandBar_AddAdornments(hwndCB, 0, 0);
// 画像の準備
hdcBmp = CreateCompatibleDC(GetDC(hWnd));
hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
SelectObject(hdcBmp, hBmp);
break;
画面への表示は、WM_PAINTが通知されたときに行います。手順としては、まず画面のHDCを取得し、次にビットマップのキャラクタを画面にコピーします。最後に画面のHDCを解放して終わりです。これで、画面にインベーダーが表示されます。インベーダーは、ビットマップの(0,24)-(31,47)の座標に描かれています。
文字列を表示している部分は要らないのでコメントにします。消してしまっても構いません。変数szHelloが未使用となるためビルド時にワーニングが出てしまいますので、szHelloの宣言は消しておいて下さい。
case WM_PAINT:
RECT rt;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rt);
//LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
//DrawText(hdc, szHello, _tcslen(szHello), &rt,
// DT_SINGLELINE | DT_VCENTER | DT_CENTER);
BitBlt(hdc, 0, 24, 32, 24, hdcBmp, 0, 24, SRCCOPY);
EndPaint(hWnd, &ps);
break;
プログラム終了時には、メモリに読み込んだビットマップとデバイスコンテキストハンドルを解放しなければなりません。
case WM_DESTROY:
DeleteDC(hdcBmp);
DeleteObject(hBmp);
CommandBar_Destroy(hwndCB);
PostQuitMessage(0);
break;
一口に「表示」といっても、これだけの手順が必要になります。ちょっと初心者向きとは言えませんね。しかし、Windowsプログラミングに必要な事なので慣れるしかありません。
ビルドして実行すると画面左上にインベーダーが表示されます。
シミュレータで実行したところ
まず、eMbedded Visual C++ 3.0(以下eVC)を起動します。
プロジェクトを新規作成して、基となるプログラムを作ります。作り方は第1回目にやりましたね。
最初は、インベーダーを表示するだけのプログラムから始めます。
まずは、表示するキャラクタを作成します。リソースへビットマップを追加し、そこにインベーダーを描きます。今回は使いませんが砲台や他のキャラクタもここで作っておきましょう。
リソースの追加1
リソースの追加2
リソースの追加3ビットマップの追加
リソースの追加4追加されたビットマップ
前回、画面サイズについて書きましたが、表示されるキャラクタは画面サイズに密接に関わってきます。320x240がポポペの画面サイズなので、中を動き回るキャラクタはそれよりも小さいほうが画面からはみ出さず、扱いが楽です。
ということで、今回は、縦横を10分割した32x24を1つのキャラクタのサイズにします。得点を表す数字は1桁を16x24として、2桁で32x24になるようにします。
キャラクタを描く
作成するビットマップ
ビットマップを作成したら、今度はそれを表示する処理を作ります。
ビットマップはいったんメモリに読み込んでから使用します。プログラム開始時にデバイスコンテキストハンドル(HDC)を作成し、ビットマップを選択します。
まず、グローバル変数としてHDCとビットマップのハンドルを用意します。
HDC hdcBmp; // キャラクタ用HDC
HBITMAP hBmp; // キャラクタ用ビットマップ
このビットマップは、プログラム実行中継続して使用するため、プログラムの最初に読み込みます。場所は、WM_CREATE通知の処理の中です。
case WM_CREATE:
hwndCB = CommandBar_Create(hInst, hWnd, 1);
CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0);
CommandBar_AddAdornments(hwndCB, 0, 0);
// 画像の準備
hdcBmp = CreateCompatibleDC(GetDC(hWnd));
hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
SelectObject(hdcBmp, hBmp);
break;
画面への表示は、WM_PAINTが通知されたときに行います。手順としては、まず画面のHDCを取得し、次にビットマップのキャラクタを画面にコピーします。最後に画面のHDCを解放して終わりです。これで、画面にインベーダーが表示されます。インベーダーは、ビットマップの(0,24)-(31,47)の座標に描かれています。
文字列を表示している部分は要らないのでコメントにします。消してしまっても構いません。変数szHelloが未使用となるためビルド時にワーニングが出てしまいますので、szHelloの宣言は消しておいて下さい。
case WM_PAINT:
RECT rt;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rt);
//LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
//DrawText(hdc, szHello, _tcslen(szHello), &rt,
// DT_SINGLELINE | DT_VCENTER | DT_CENTER);
BitBlt(hdc, 0, 24, 32, 24, hdcBmp, 0, 24, SRCCOPY);
EndPaint(hWnd, &ps);
break;
プログラム終了時には、メモリに読み込んだビットマップとデバイスコンテキストハンドルを解放しなければなりません。
case WM_DESTROY:
DeleteDC(hdcBmp);
DeleteObject(hBmp);
CommandBar_Destroy(hwndCB);
PostQuitMessage(0);
break;
一口に「表示」といっても、これだけの手順が必要になります。ちょっと初心者向きとは言えませんね。しかし、Windowsプログラミングに必要な事なので慣れるしかありません。
ビルドして実行すると画面左上にインベーダーが表示されます。
シミュレータで実行したところ