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

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

第8章 キャラクタの透過

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

このページはゲームループの基礎講座シリーズの1つです。
今回は第8章の「キャラクタの透過」について説明します。(戻る)

透過色の描画

TransparentBlt( hDC, nFaceX, nFaceY, nFaceW, nFaceH, hFaceChip, 0, 0, nFaceW, nFaceH, RGB(0x00,0x00,0x00) );

透過色の注意点

// 黒目
SetPixelV( hDC, x2-1, y3, RGB(0x01,0x01,0x01) );
SetPixelV( hDC, x5-0, y3, RGB(0x01,0x01,0x01) );

キャラクタ描画を修正

//------------------------------------------------
// キャラクタの描画(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(0x01,0x01,0x01) ); SetPixelV( hDC, x5-0, y3, RGB(0x01,0x01,0x01) );
// 口 SetDCPenColor( hDC, RGB(0xCC,0x00,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0x00,0x00) ); RoundRect( hDC, x2, y5, x5, y6, 4, 4 ); }

プロシージャ関数に組み込む

//------------------------------------------------
// ウインドウのプロシージャ関数(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_LBUTTONUP:
        {
            LONG    nFaceX = (LOWORD(lParam) - (nFaceW / 2));
            LONG    nFaceY = (HIWORD(lParam) - (nFaceH / 2));
            HDC     hDC;
            
            hDC = GetDC( hWnd );
TransparentBlt( hDC, nFaceX, nFaceY, nFaceW, nFaceH, hFaceChip, 0, 0, nFaceW, nFaceH, RGB(0x00,0x00,0x00) );
ReleaseDC( hWnd, hDC ); } 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; }
←前へ] [目次] [次へ→

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

コメントを投稿

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