goo blog サービス終了のお知らせ 

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

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

第11章 キャラクタの点滅

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

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

キャラクタの点滅

CASE WM_TIMER:
{
    HDC hDC = GetDC(hWnd);
    
    if ( bFaceBlink ){
        SelectObject(    hDC, GetStockObject(DC_PEN) );
        SelectObject(    hDC, GetStockObject(DC_BRUSH) );
        SetDCPenColor(   hDC, RGB(0xCC,0xCC,0x00) );
        SetDCBrushColor( hDC, RGB(0xFF,0xFF,0x00) );
        Ellipse( hDC, nFaceX, nFaceY, (nFaceX + nFaceW), (nFaceY + nFaceH) );
    }
    else{
        TransparentBlt( hDC, nFaceX, nFaceY, nFaceW, nFaceH, hFaceChip, 0, 0, nFaceW, nFaceH, RGB(0x00,0x00,0x00) );
    }
    ReleaseDC( hWnd, hDC );
    bFaceBlink = !bFaceBlink;
}

ソース・ファイルに組み込む

//------------------------------------------------------------------------------
// 第11章 キャラクタの点滅
//------------------------------------------------------------------------------
#include <tchar.h>
#include <Windows.h>    // MSImg32.Lib

//------------------------------------------------
// 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個)
# #define TID_BLINK (1) // 点滅識別ID #define TMS_BLINK (200) // 点滅間隔(ms)
//------------------------------------------------ // 記号定数(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; static LONG nFaceX; static LONG nFaceY; static LONG nFaceSpeed;
static BOOL bFaceBlink;
switch ( uMsg ){ CASE WM_CREATE: nFaceSpeed = 16; nFaceW = 32; nFaceH = 32; hFaceChip = funcCreateMemDC( hWnd, nFaceW, nFaceH ); funcFaceImage( hFaceChip, nFaceW, nFaceH );
SetTimer( hWnd, TID_BLINK, TMS_BLINK, NULL );
CASE WM_CLOSE:
KillTimer( hWnd, TID_BLINK );
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_TIMER: { HDC hDC = GetDC(hWnd); if ( bFaceBlink ){ SelectObject( hDC, GetStockObject(DC_PEN) ); SelectObject( hDC, GetStockObject(DC_BRUSH) ); SetDCPenColor( hDC, RGB(0xCC,0xCC,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0xFF,0x00) ); Ellipse( hDC, nFaceX, nFaceY, (nFaceX + nFaceW), (nFaceY + nFaceH) ); } else{ TransparentBlt( hDC, nFaceX, nFaceY, nFaceW, nFaceH, hFaceChip, 0, 0, nFaceW, nFaceH, RGB(0x00,0x00,0x00) ); } ReleaseDC( hWnd, hDC ); bFaceBlink = !bFaceBlink; }
CASE WM_KEYDOWN: { HDC hDC; RECT rc; switch ( wParam ){ // 矢印キー CASE VK_UP: nFaceY -= nFaceSpeed; CASE VK_DOWN: nFaceY += nFaceSpeed; CASE VK_LEFT: nFaceX -= nFaceSpeed; CASE VK_RIGHT: nFaceX += nFaceSpeed; // テンキー CASE VK_NUMPAD1: nFaceY += nFaceSpeed; nFaceX -= nFaceSpeed; CASE VK_NUMPAD2: nFaceY += nFaceSpeed; CASE VK_NUMPAD3: nFaceY += nFaceSpeed; nFaceX += nFaceSpeed; CASE VK_NUMPAD4: nFaceX -= nFaceSpeed; CASE VK_NUMPAD5: nFaceY += nFaceSpeed; CASE VK_NUMPAD6: nFaceX += nFaceSpeed; CASE VK_NUMPAD7: nFaceY -= nFaceSpeed; nFaceX -= nFaceSpeed; CASE VK_NUMPAD8: nFaceY -= nFaceSpeed; CASE VK_NUMPAD9: nFaceY -= nFaceSpeed; nFaceX += nFaceSpeed; DEFAULT: return 0; } // 画面内に移動制御 GetClientRect( hWnd, &rc ); if ( nFaceX < rc.left ){ nFaceX = (rc.left); MessageBeep( MB_OK ); } else if ( nFaceX > (rc.right - nFaceW) ){ nFaceX = (rc.right - nFaceW); MessageBeep( MB_OK ); } if ( nFaceY < rc.top ){ nFaceY = (rc.top); MessageBeep( MB_OK ); } else if ( nFaceY > (rc.bottom - nFaceH) ){ nFaceY = (rc.bottom - nFaceH); MessageBeep( MB_OK ); } // キャラクタの描画 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; }
ここから下は同じなので省略します。
//------------------------------------------------------------------------------ // End of Lesson11.cpp //------------------------------------------------------------------------------
←前へ] [目次] [次へ→

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 第10章 キャラクタの制御 | トップ | 付録A ゲームのフレームワー... »
最新の画像もっと見る

コメントを投稿

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