プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

第6章 キャラクタの作成

2012年03月10日 05時30分06秒 | 無料で学べる講座

このページはゲームループの基礎講座シリーズの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 //------------------------------------------------------------------------------
←前へ] [目次] [次へ→

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 第5章 ウインドウのプロシー... | トップ | 第7章 キャラクタの描画 »
最新の画像もっと見る

コメントを投稿

無料で学べる講座」カテゴリの最新記事