1.复习贪吃蛇
1.贪吃蛇所包括的函数
基于C语言的Win32应用程序
void CreateApple()
void ShowApple()
void CreateSnake()
void ShowSnake()
void SnakeMove();
bool IsEatApple()
void GrowUp()
bool IsGameOve()
消息处理函数
WndProc()
{
case WM_CREATE:
CreateSnake()
CreateApple()
break;
case WM_PAINT:
ShowSnake()
ShowApple()
break;
case WM_TIMER:
SnakeMove()
if( IsEatApple() == true)
GrowUp()
if( IsGameOve() == true)
MessageBox()
break;
case WM_KEYDOWN:
FX = ...
break;
}
2.俄罗斯方块所包含的函数
void CreateBackSqaure()
void CreateMoveSquare()
vodi ShowBackSuqare()
void ShowMoveSquare();
void DownMove()
void LeftMove()
void RightMove()
void ChangeStyle()
bool IsDownMove()
bool IsLeftMove()
bool IsRightMove()
bool IsChangeStyle()
void ReceiveSquare()
void DeleteLine()
bool IsGameOver()
消息处理函数
WndProc()
{
case WM_CREATE:
CreateBackSqaure()
CreateMoveSquare()
break;
case WM_PAINT:
ShowBackSuqare()
ShowMoveSquare()
break;
case WM_TIMER:
if(IsDownMove() == ture)
{
DownMove()
}
else
{
ReceiveSquare();
DeleteLine();
if(IsGameOver)
{
.....
}
}
break;
case WM_KEYDOWN:
if( IsLeftMove() )
LeftMove
..
..
break;
}
2.游戏壳
1.用来作为模板类,可以进行多次扩展和复用
3.补全参数
GameApp.h头文件
#pragma once
#ifndef _GAMEAPP_H_
#define _GAMEAPP_H_
#include <windows.h>
#define IMPLEMENT(ThisClass)\
CGameApp* CreateObject()\
{\
return new ThisClass;\
}
class CGameApp
{
public:
HINSTANCE m_hIns;
HWND m_hMainWnd;
public:
CGameApp()
{
m_hIns = 0;
m_hMainWnd = 0;
}
virtual ~CGameApp()
{
}
public:
void SetHandle(HINSTANCE hIns,HWND hwnd)
{
this->m_hIns = hIns;
this->m_hMainWnd = hwnd;
}
public:
virtual void OnCreateGame(){} // WM_CREATE
virtual void OnGameDraw(){} // WM_PAINT
virtual void OnGameRun(WPARAM nTimerID){} // WM_TIMER
virtual void OnKeyDown(WPARAM nKey){} // WM_KEYDOWN
virtual void OnLButtonDown(POINT point){} // WM_LBUTTONDOWN
virtual void OnLButtonUp(POINT point){} // WM_LBUTTONUP
virtual void OnMouseMove(POINT point){} // WM_MOUSEMOVE
};
#endif//_GAMEAPP_H_
WinMain主函数
#include <windows.h>
#include "GameApp.h"
#include <time.h>
// HINSTANCE 实例句柄 加载一个外部的资源需要用
// HWND 代表窗口 和窗口相关的操作
// HDC 环境设备句柄 绘图的操作
// Window Message
// WM_LBUTTONDOWN
// WM_KEYDOWN
// WM_PAINT
// WM_TIMER
// ........
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HINSTANCE g_hIns;
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR pCmdLine,int nCmdShow)
{
srand((unsigned int)time(0));
g_hIns = hInstance;
// 1. 设计
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclass.hCursor = ::LoadCursor(0,MAKEINTRESOURCE(IDC_ARROW));
wndclass.hIcon = 0;
wndclass.hIconSm = 0;
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = "lele";
wndclass.lpszMenuName = 0;
wndclass.style = CS_VREDRAW|CS_HREDRAW;
// 2. 注册
if( ::RegisterClassEx(&wndclass)==FALSE)
{
::MessageBox(0,"注册失败","提示",MB_OK);
return 0;
}
// 3. 创建
HWND hwnd = ::CreateWindow("lele","O(∩_∩)O哈哈~",WS_OVERLAPPEDWINDOW,0,0,500,500,0,0,hInstance,0);
if(hwnd == 0)
{
::MessageBox(0,"创建失败","提示",MB_OK);
return 0;
}
// 4. 显示
::ShowWindow(hwnd,SW_SHOW);
// 5. 消息循环
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
// 翻译
::TranslateMessage(&msg);
// 分发
::DispatchMessage(&msg);
}
return 0;
}
//-----------------------------------------
CGameApp* CreateObject();
CGameApp* pApp = 0;
// 消息的处理函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
// 创建游戏
pApp = CreateObject();
if(pApp != 0)
{
// 设置句柄
pApp->SetHandle(g_hIns,hwnd);
// 创建游戏
pApp->OnCreateGame();
}
}
break;
case WM_PAINT:
{
if(pApp != 0)
pApp->OnGameDraw();
}
break;
case WM_TIMER:
{
if(pApp != 0)
pApp->OnGameRun(wParam);
}
break;
case WM_KEYDOWN:
{
if(pApp != 0)
pApp->OnKeyDown(wParam);
}
break;
case WM_LBUTTONDOWN:
{
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
if(pApp != 0)
pApp->OnLButtonDown(point);
}
break;
case WM_LBUTTONUP:
{
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
if(pApp != 0)
pApp->OnLButtonUp(point);
}
break;
case WM_MOUSEMOVE:
{
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
if(pApp != 0)
pApp->OnMouseMove(point);
}
break;
case WM_CLOSE:
{
delete pApp;
pApp = 0;
::PostQuitMessage(0);
}
break;
}
return ::DefWindowProc( hwnd, uMsg, wParam, lParam);
}