このページはゲームループの基礎講座シリーズの1つです。
今回は第6章の「キャラクタの作成」について説明します。(戻る)
メモリDCの作成
//------------------------------------------------ // メモリ・デバイスコンテキストの作成(OK) //------------------------------------------------ static HDC funcCreateMemDC( HWND hWnd, LONG nWidth, LONG nHeight ) { HDC hDC; HDC hMemDC; HBITMAP hBitmap; // DCコンパチブルの作成 hDC = GetDC( hWnd ); hMemDC = CreateCompatibleDC( hDC ); hBitmap = CreateCompatibleBitmap( hDC, nWidth, nHeight ); SelectObject( hMemDC, hBitmap ); SelectObject( hMemDC, GetStockObject(DC_PEN) ); SelectObject( hMemDC, GetStockObject(DC_BRUSH) ); DeleteObject( hBitmap ); ReleaseDC( hWnd, hDC ); return hMemDC; }
キャラクタの描画
//------------------------------------------------ // キャラクタの描画(OK) //------------------------------------------------ static VOID funcFaceImage( HDC hDC, LONG sx, LONG sy ) { // 横軸(7分割) LONG x1 = (sx * 1 / 7); LONG x2 = (sx * 2 / 7); LONG x3 = (sx * 3 / 7); LONG x4 = (sx * 4 / 7); LONG x5 = (sx * 5 / 7); LONG x6 = (sx * 6 / 7); // 縦軸(7分割) LONG y1 = (sy * 1 / 7); // 未使用 LONG y2 = (sy * 2 / 7); LONG y3 = (sy * 3 / 7); LONG y4 = (sy * 4 / 7); LONG y5 = (sy * 5 / 7); LONG y6 = (sy * 6 / 7); // 笑顔 SetDCPenColor( hDC, RGB(0xCC,0xCC,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0xFF,0x00) ); Ellipse( hDC, 0, 0, sx, sy ); // 両目 SetDCPenColor( hDC, RGB(0xCC,0xCC,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0xFF,0xFF) ); Ellipse( hDC, x1, y2, x3, y4 ); Ellipse( hDC, x4, y2, x6, y4 ); // 黒目 SetPixelV( hDC, x2-1, y3, RGB(0x00,0x00,0x00) ); SetPixelV( hDC, x5-0, y3, RGB(0x00,0x00,0x00) ); // 口 SetDCPenColor( hDC, RGB(0xCC,0x00,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0x00,0x00) ); RoundRect( hDC, x2, y5, x5, y6, 4, 4 ); }
ソース・ファイルに組み込む
//------------------------------------------------------------------------------ // 第6章 キャラクタの作成 //------------------------------------------------------------------------------ #include <tchar.h> #include <Windows.h> //------------------------------------------------ // break 付きのキーワード(OK) //------------------------------------------------ #define CASE break;case #define DEFAULT break;default //------------------------------------------------ // 記号定数(OK) //------------------------------------------------ #define SCREEN_STYLE (WS_OVERLAPPEDWINDOW ^ (WS_THICKFRAME|WS_MAXIMIZEBOX)) #define SCREEN_WIDTH (640) // スクリーンの横幅(32ドット×20個) #define SCREEN_HEIGHT (480) // スクリーンの高さ(32ドット×15個) //------------------------------------------------ // 記号定数(OK) //------------------------------------------------ #define ERRMSG_TITLE TEXT("WinMain関数") #define ERRMSG_WINREG TEXT("ウインドウ・クラスが登録できません。") #define ERRMSG_CREATE TEXT("ウインドウが作成できません。")[←前へ] [目次] [次へ→]ここに funcCreateMemDC 関数を記述します。ここに funcFaceImage 関数を記述します。//------------------------------------------------ // ウインドウのプロシージャ関数(OK) //------------------------------------------------ static LRESULT CALLBACK mainWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {static HDC hFaceChip; static LONG nFaceW; static LONG nFaceH; switch ( uMsg ){ CASE WM_CREATE: nFaceW = 32; nFaceH = 32; hFaceChip = funcCreateMemDC( hWnd, nFaceW, nFaceH ); funcFaceImage( hFaceChip, nFaceW, nFaceH ); CASE WM_CLOSE: DeleteDC( hFaceChip ); DestroyWindow( hWnd );CASE WM_DESTROY: PostQuitMessage( 0 ); CASE WM_PAINT: { PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint( hWnd, &ps ); /* 描画処理 */ EndPaint( hWnd, &ps ); } CASE WM_ENDSESSION: PostMessage( hWnd, WM_CLOSE, 0, 0 ); CASE WM_LBUTTONDOWN: SendMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0 ); CASE WM_LBUTTONDBLCLK: SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE) ); CASE WM_RBUTTONDBLCLK: SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE) ); DEFAULT: return DefWindowProc( hWnd, uMsg, wParam, lParam ); } return 0; }ここから下は同じなので省略します。//------------------------------------------------------------------------------ // End of Lesson6.cpp //------------------------------------------------------------------------------
※コメント投稿者のブログIDはブログ作成者のみに通知されます