⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamewnd.cpp

📁 Embedded VC “是男人就挺过二十秒”源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GameWnd.cpp: implementation of the CGameWnd class.
//
/**///////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GameWnd.h"
#include "resource.h"
#include "commctrl.h"

//----------------------------------------------------------------
//Macro define
#define WND_CLASS            TEXT("Evade_Class")
#define WND_TITLE            TEXT("Evade_Title")

//The ID for the command bar
#define ID_COMMANDBAR        100

//Screen width
#define SCREEN_WIDTH	GetSystemMetrics(SM_CXSCREEN)
//Screen height
#define SCREEN_HEIGHT	GetSystemMetrics(SM_CYSCREEN)


//The window position
#define MAINWND_POS_X	0
#define MAINWND_POS_Y	24

//Level training
#define LEVEL0_BULLET_COUNT				50
#define LEVEL0_BULLET_MAXMOVEDISTANCE	2
#define LEVEL0_PLANE_MOVEDISTANCE		3

//Level_1 value
#define LEVEL1_BULLET_COUNT				100
#define LEVEL1_BULLET_MAXMOVEDISTANCE	3
#define LEVEL1_PLANE_MOVEDISTANCE		3

//Level_2 value
#define LEVEL2_BULLET_COUNT				150
#define LEVEL2_BULLET_MAXMOVEDISTANCE	4
#define LEVEL2_PLANE_MOVEDISTANCE		3

//Level_3 value
#define LEVEL3_BULLET_COUNT				200
#define LEVEL3_BULLET_MAXMOVEDISTANCE	5
#define LEVEL3_PLANE_MOVEDISTANCE		3



//Default value
#define DEFAULT_BULLET_COUNT			LEVEL1_BULLET_COUNT
#define DEFAULT_BULLET_MAXMOVEDISTANCE	LEVEL1_BULLET_MAXMOVEDISTANCE
#define DEFAULT_PLANE_MOVEDISTANCE		LEVEL1_PLANE_MOVEDISTANCE

#define DEFAULT_REFRESH_INTERVAL		50 //0.05s

#define DEFAULT_TEXT_TIME_COLOR			RGB(0,0,255)
#define DEFAULT_TEXT_TIME_HEIGHT		16    

//The offset of the time text
#define TXT_TIME_OFFSET_TOP				2
#define TXT_TIME_OFFSET_LEFT			(SCREEN_WIDTH - 100)
#define TXT_TIME_OFFSET_RIGHT			4
#define TXT_TIME_HEIGHT					40
//-----------------------------------------------------------------
//Initialize
CGameWnd *CGameWnd::m_pInstance = NULL;


/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////

CGameWnd::CGameWnd()
{
    m_hWndCB = NULL;
    m_bMovePlane = FALSE;
    m_bCollide = FALSE;
    m_hInst = NULL;
    m_hWnd = NULL;
    
    memset(&m_rcWndPlay,0,sizeof(m_rcWndPlay));
    memset(&m_ptPlaneSkewing,0,sizeof(m_ptPlaneSkewing));
    memset(&m_KeyStatus,0,sizeof(m_KeyStatus));
    memset(&m_rcWndMain,0,sizeof(m_rcWndMain));

    m_Setting.iBulletCount = DEFAULT_BULLET_COUNT;
    m_Setting.iBulletMaxMoveDistance = DEFAULT_BULLET_MAXMOVEDISTANCE;
    m_Setting.iRefreshInterval = DEFAULT_REFRESH_INTERVAL;
    m_Setting.iPlaneMoveDistance = DEFAULT_PLANE_MOVEDISTANCE;


    m_TxtTime.SetTextColor(DEFAULT_TEXT_TIME_COLOR);
    m_TxtTime.SetTextHeight(DEFAULT_TEXT_TIME_HEIGHT);
    m_TxtTime.SetFormat(DT_RIGHT | DT_VCENTER);
}

CGameWnd::~CGameWnd()
{
    if(m_pInstance != NULL)
    {
        delete m_pInstance;
        m_pInstance = NULL;
    }
}


//----------------------------------------------------------------
//Description:
//    Get the object instance
//-----------------------------------------------------------------
CGameWnd * CGameWnd::GetInstance()
{
    if(m_pInstance == NULL)
    {
        m_pInstance = new CGameWnd();
    }
    return m_pInstance;
}


//----------------------------------------------------------------
//Description:
//    Initialize the window
//-----------------------------------------------------------------
BOOL CGameWnd::Initialize(HINSTANCE hInst)
{
    m_hInst = hInst;

    WNDCLASS ws;
    memset(&ws,0,sizeof(ws));
    ws.lpfnWndProc = WndProc;
    ws.hInstance = hInst;
    ws.lpszClassName = WND_CLASS;
    ws.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    if(RegisterClass(&ws) == FALSE)
    {
        return FALSE;
    }


    //Find the task bar
    HWND hWndTaskBar = FindWindow(TEXT("HHTaskBar"), NULL);  
//    RECT rcTaskBar = {0};
//    GetWindowRect(hWndTaskBar,&rcTaskBar);

    m_rcWndMain.left = MAINWND_POS_X;
    m_rcWndMain.top = MAINWND_POS_Y;
    m_rcWndMain.right = SCREEN_WIDTH;
    m_rcWndMain.bottom = SCREEN_HEIGHT - MAINWND_POS_Y;

    m_hWnd = CreateWindow(
                        WND_CLASS,
                        WND_TITLE,
                        WS_POPUP ,
                        m_rcWndMain.left,
                        m_rcWndMain.top,
                        m_rcWndMain.right - m_rcWndMain.left ,
                        m_rcWndMain.bottom/* - m_rcWndMain.top*/,
                        NULL,
                        NULL,
                        hInst,
                        NULL
                        );
            
    if(IsWindow(m_hWnd)==FALSE)
    {
        return FALSE;
    }

    
    RECT rcCmdBar = {0};
    GetWindowRect(m_hWndCB,&rcCmdBar);

    m_rcWndPlay.left = m_rcWndMain.left;
    m_rcWndPlay.right = m_rcWndMain.right;
    m_rcWndPlay.top = /*m_rcWndMain.top + */(rcCmdBar.bottom - rcCmdBar.top);
    m_rcWndPlay.bottom = m_rcWndMain.bottom;

    RECT rcTxtTime;
    rcTxtTime.top = m_rcWndPlay.top + TXT_TIME_OFFSET_TOP;
    rcTxtTime.left = /*m_rcWndPlay.left + */TXT_TIME_OFFSET_LEFT;
    rcTxtTime.right = m_rcWndPlay.right - TXT_TIME_OFFSET_RIGHT;
    rcTxtTime.bottom = rcTxtTime.top + TXT_TIME_HEIGHT;
    m_TxtTime.SetPosition(&rcTxtTime);

    CheckMenu();
    
    return TRUE;
}


//----------------------------------------------------------------
//Description:
//    The window process
//-----------------------------------------------------------------
LRESULT CGameWnd::WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    switch(wMsg)
    {
        case WM_DESTROY:
            m_pInstance->OnDestroy(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_PAINT:
            m_pInstance->OnPaint(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_ERASEBKGND:
            //Needn't to redraw the background
            return 0;
        case WM_MOUSEMOVE:
            m_pInstance->OnMouseMove(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_LBUTTONDOWN:
            m_pInstance->OnLButtonDown(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_LBUTTONUP:
            m_pInstance->OnLButtonUp(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_KEYDOWN:
            m_pInstance->OnKeyDown(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_KEYUP:
            m_pInstance->OnKeyUp(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_CREATE:
            m_pInstance->OnCreate(hWnd,wMsg,wParam,lParam);
            return 0;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
				case IDM_TRAINING:
					m_pInstance->OnMenuLevel(IDM_TRAINING);
					break;
                case IDM_LEVEL_1:
                    m_pInstance->OnMenuLevel(IDM_LEVEL_1);
                    return 0;
                case IDM_LEVEL_2:
                    m_pInstance->OnMenuLevel(IDM_LEVEL_2);
                    return 0;
                case IDM_LEVEL_3:
                    m_pInstance->OnMenuLevel(IDM_LEVEL_3);
                    return 0;
                case IDM_START:
                    m_pInstance->StartGame();
                    return 0;
				case IDM_FINISH:
					m_pInstance->EndGame();
					break;
                case IDM_EXIT:
                    DestroyWindow(hWnd);
                    return 0;
            }
            break;
    }
    return DefWindowProc(hWnd,wMsg,wParam,lParam);
}


//----------------------------------------------------------------
//Description:
//    Show the window
//-----------------------------------------------------------------
BOOL CGameWnd::ShowWindow(BOOL bShow)
{
    if(m_hWnd == NULL)
    {
        return FALSE;
    }

    if(bShow == TRUE)
    {
        ::ShowWindow(m_hWnd,SW_SHOW);
    }
    else
    {
        ::ShowWindow(m_hWnd,SW_HIDE);
    }


    return TRUE;
}


//----------------------------------------------------------------
//Description:
//    On message WM_DESTROY
//-----------------------------------------------------------------
void CGameWnd::OnDestroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    PostQuitMessage(0x00);
}


//----------------------------------------------------------------
//Description:
//    On message WM_PAINT
//-----------------------------------------------------------------
void CGameWnd::OnPaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd,&ps);

    //Create the memory DC
    HBITMAP hBitmap = CreateCompatibleBitmap(hdc,m_rcWndMain.right - m_rcWndMain.left,m_rcWndMain.bottom/* - m_rcWndMain.top*/);

    HDC hdcMem = CreateCompatibleDC(hdc);
    HGDIOBJ hOldSel = SelectObject(hdcMem,hBitmap);

    Rectangle(hdcMem,m_rcWndMain.left,0/*m_rcWndMain.top*/,m_rcWndMain.right,m_rcWndMain.bottom);

    m_Bullets.Draw(hdcMem);
    if(m_bCollide == FALSE)
    {
        m_Plane.DrawNormal(hdcMem);
    }
    else
    {
        m_Plane.DrawDestroy(hdcMem);
    }

    m_TxtTime.Draw(hdcMem);

    BitBlt(hdc,
            m_rcWndMain.left,
            0/*m_rcWndMain.top*/,
            m_rcWndMain.right - m_rcWndMain.left,
            m_rcWndMain.bottom/* - m_rcWndMain.top*/,
            hdcMem,
            0,
            0,
            SRCCOPY);


    SelectObject(hdcMem,hOldSel);
    DeleteObject(hBitmap);
    DeleteDC(hdcMem);
    EndPaint(hWnd,&ps);
}



//----------------------------------------------------------------
//Description:
//    Start the game
//-----------------------------------------------------------------
void CGameWnd::StartGame()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -