游戏引擎及其间单实现

 
游戏引擎负责处理各种琐碎事务:组件游戏,确保它正确运行及关闭它。将游戏分解为事件:
下面这些事件只适用于任何游戏的部分核心事件:
●    初始化
●    启动
●    结束
●    激活
●    停用
●    绘制
●    循环
 
初始化事件在一开始运行游戏时发生,这时游戏执行重要的初始设置任务,包括创建游戏引擎本身。启动和结束事件对应于游戏的开始和结束,这时很适合执行与特定的游戏会话相关联的初始化和清理任务。在最小化游戏或者将其发送至后台,然后在恢复时,就将发生激活和停用事件。当游戏需要绘制自身时,将发送绘制事件,类似于WINDOWS WM_PAINT 消息。最后,循环事件使游戏执行一个单独的游戏周期,它非常重要。
 
游戏的计时机制:游戏在指定的时间内运行的周期越多,看起来就越平滑。事实上,大多数游戏设置都在15 - 16周期每秒的范围内,最快的速度可能达到30周期每秒,比电影还快。除了极少数的一些情况外,应该力求达到的最低速度设置为12周期每秒。
游戏引擎的类:
None.gif#ifndef _GAMEENGINE_H
None.gif
#define _GAMEENGINE_H
None.gif#include 
<windows.h>
None.gif
None.gif
//游戏事件
None.gif
BOOL GameInitialize(HINSTANCE hInstance);     //初始化
None.gif
void GameStart(HWND hWnd);                    //启动
None.gif
void GameEnd();                               //结束
None.gif
void GameActivate(HWND hWnd);                 //激活
None.gif
void GameDeactivate(HWND hWnd);               //停用
None.gif
void GamePaint(HDC hdc);                      //绘制
None.gif
void GameCycle();                             //循环
None.gif
None.gif
None.gif
//游戏引擎类
None.gif
class GameEngine
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif
protected:
InBlock.gif    
static GameEngine * m_pGameEngine;        //指向自身的静态指针
InBlock.gif
    HINSTANCE           m_hInstance;          //实例句柄
InBlock.gif
    HWND                m_hWnd;               //窗口句柄
InBlock.gif
    TCHAR               m_szWndClass[32];     //窗口类名
InBlock.gif
    TCHAR               m_szTitle[32];        //标题
InBlock.gif
    WORD                m_wIcon,m_wSmallIcon; //大小图标
InBlock.gif
    int                 m_iWidth,m_iHeight;   //游戏区的宽和高
InBlock.gif
    int                 m_iFrameDelay;        //帧的延迟时间(ms)
InBlock.gif
    BOOL                m_bSleep;             //休眠状态
InBlock.gif
public:
InBlock.gif    GameEngine(HINSTANCE hInstance,LPTSTR szWndClass,LPTSTR szTitle,
InBlock.gif               WORD wIcon,WORD wSmallIcon,
int iWidth=640,int iHeight=480);
InBlock.gif    
~GameEngine();
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
static GameEngine * GetEngine() ...return m_pGameEngine;};
InBlock.gif    BOOL   Initialize(
int iCmdShow);
InBlock.gif    LRESULT HandlEvent(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    HINSTANCE   GetInstance() 
...return m_hInstance ;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    HWND        GetWindow() 
...return m_hWnd;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    
void        SetWindow(HWND hWnd)...{ m_hWnd=hWnd ;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    LPSTR       GetTitle()
...return m_szTitle ;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    WORD        GetIcon() 
...return m_wIcon;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    WORD        GetSmallIcon() 
...return m_wSmallIcon; };
ExpandedSubBlockStart.gifContractedSubBlock.gif    
int         GetWidth() ...return m_iWidth;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    
int         GetHeight() ...return m_iHeight;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    
int         GetFrameDelay() ...return m_iFrameDelay ;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    
void        SetFrameDelay(int iFrameRate)...{ m_iFrameDelay=1000/iFrameRate;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    BOOL        GetSleep()
...return m_bSleep;};
ExpandedSubBlockStart.gifContractedSubBlock.gif    
void        SetSleep(BOOL bSleep)...{ m_bSleep=bSleep;};
InBlock.gif
ExpandedBlockEnd.gif}
;
None.gif
None.gifLRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
None.gif
None.gif
#endif

其实现文件如下:

None.gif#include "GameEngine.h"
None.gif
None.gif
//静态成员初始化
None.gif
GameEngine * GameEngine::m_pGameEngine=NULL;
None.gif
//构造成员函数
None.gif
GameEngine::GameEngine(HINSTANCE hInstance,LPSTR szWndClass,LPSTR szTitle,
None.gif                       WORD wIcon,WORD wSmallIcon,
int iWidth,int iHeight)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    m_pGameEngine
=this;
InBlock.gif    m_hInstance
=hInstance;
InBlock.gif    m_hWnd
=NULL;
InBlock.gif    
if(lstrlen(szWndClass)>0)
InBlock.gif        lstrcpy(m_szWndClass,szWndClass);
InBlock.gif    
if(lstrlen(szTitle)>0)
InBlock.gif        lstrcpy(m_szTitle,szTitle);
InBlock.gif    m_wIcon
=wIcon;
InBlock.gif    m_wSmallIcon
=wSmallIcon;
InBlock.gif    m_iWidth
=iWidth;
InBlock.gif    m_iHeight
=iHeight;
InBlock.gif    m_iFrameDelay
=50;  //默认为20帧每妙
InBlock.gif
    m_bSleep=TRUE;
ExpandedBlockEnd.gif}

None.gif
//析构成员函数
None.gif
GameEngine::~GameEngine()
ExpandedBlockStart.gifContractedBlock.gif
...{
ExpandedBlockEnd.gif}

None.gif
//引擎初始化
None.gif
BOOL GameEngine::Initialize(int iCmdShow)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    WNDCLASSEX  wc;
InBlock.gif
InBlock.gif    
//创建主窗口的类
InBlock.gif
    wc.cbSize=sizeof(WNDCLASSEX);
InBlock.gif    wc.style
=CS_HREDRAW|CS_VREDRAW;
InBlock.gif    wc.lpfnWndProc
=WndProc;
InBlock.gif    wc.cbClsExtra
=0;
InBlock.gif    wc.cbWndExtra
=0;
InBlock.gif    wc.hbrBackground
=(HBRUSH)(COLOR_WINDOW+1);
InBlock.gif    wc.hCursor
=LoadCursor(NULL,IDC_ARROW);
InBlock.gif    wc.hIcon
=LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon()));
InBlock.gif    wc.hIconSm
=LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon()));
InBlock.gif    wc.hInstance
=m_hInstance;
InBlock.gif    wc.lpszClassName
=m_szWndClass;
InBlock.gif    wc.lpszMenuName
=NULL;
InBlock.gif
InBlock.gif    
//注册窗口类
InBlock.gif
    if(!RegisterClassEx(&wc))
InBlock.gif        
return FALSE;
InBlock.gif    
InBlock.gif    
//根据游戏大小计算窗口大小和位置
InBlock.gif
    int iWindowWidth=m_iWidth+GetSystemMetrics(SM_CXFIXEDFRAME)*2;
InBlock.gif    
int iWindowHeight=m_iHeight+GetSystemMetrics(SM_CYFIXEDFRAME)*2+GetSystemMetrics(SM_CYCAPTION);
InBlock.gif    
if(wc.lpszMenuName!=NULL)
InBlock.gif        iWindowHeight
+=GetSystemMetrics(SM_CYMENU);
InBlock.gif    
int iXWindowPos=(GetSystemMetrics(SM_CXSCREEN)-iWindowWidth)/2;
InBlock.gif    
int iYWindowPos=(GetSystemMetrics(SM_CYSCREEN)-iWindowHeight)/2;
InBlock.gif
InBlock.gif    
//创建窗口
InBlock.gif
    m_hWnd=CreateWindow(m_szWndClass,m_szTitle,WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX,iXWindowPos,iYWindowPos,
InBlock.gif                        iWindowWidth,iWindowHeight,NULL,NULL,m_hInstance,NULL);
InBlock.gif    
if(!m_hWnd)
InBlock.gif        
return FALSE;
InBlock.gif    
//显示和更新窗口
InBlock.gif
    ShowWindow(m_hWnd,iCmdShow);
InBlock.gif    UpdateWindow(m_hWnd);
InBlock.gif    
InBlock.gif    
return TRUE;
ExpandedBlockEnd.gif}

None.gif
//游戏消息处理函数
None.gif
LRESULT GameEngine::HandlEvent(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    
switch(msg)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif    
case WM_CREATE:
InBlock.gif        
//设置游戏窗口并开始游戏
InBlock.gif
        SetWindow(hWnd);
InBlock.gif        GameStart(hWnd);
InBlock.gif        
return 0;
InBlock.gif    
case WM_SETFOCUS:
InBlock.gif        
//激活游戏并更新休眠状态
InBlock.gif
        GameActivate(hWnd);
InBlock.gif        SetSleep(FALSE);
InBlock.gif        
return 0;
InBlock.gif    
case WM_KILLFOCUS:
InBlock.gif        
//停用游戏并更新休眠状态
InBlock.gif
        GameDeactivate(hWnd);
InBlock.gif        SetSleep(TRUE);
InBlock.gif        
return 0;
InBlock.gif    
case WM_PAINT:
InBlock.gif        HDC hDc;
InBlock.gif        PAINTSTRUCT ps;
InBlock.gif        hDc
=BeginPaint(hWnd,&ps);
InBlock.gif        
//绘制游戏
InBlock.gif
        GamePaint(hDc);
InBlock.gif        EndPaint(hWnd,
&ps);
InBlock.gif        
return 0;
InBlock.gif    
case WM_DESTROY:
InBlock.gif        
//结束游戏
InBlock.gif
        GameEnd();
InBlock.gif        PostQuitMessage(
0);
InBlock.gif        
return 0;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return DefWindowProc(hWnd,msg,wParam,lParam);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gifLRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    
return GameEngine::GetEngine()->HandlEvent(hWnd,msg,wParam,lParam);
ExpandedBlockEnd.gif}

None.gif
//主函数入口
None.gif
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCommandLine,int iCmdShow )
ExpandedBlockStart.gifContractedBlock.gif
...{   
InBlock.gif    MSG msg;
InBlock.gif    
static int  iTickTriger=0;
InBlock.gif    
int         iTickCount;
InBlock.gif
InBlock.gif    
if(GameInitialize(hInstance))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        
if(!GameEngine::GetEngine()->Initialize(iCmdShow))
InBlock.gif            
return FALSE;
InBlock.gif        
while(TRUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
...{
InBlock.gif            
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
...{
InBlock.gif                
if(msg.message==WM_QUIT)
InBlock.gif                    
break;
InBlock.gif                TranslateMessage(
&msg);
InBlock.gif                DispatchMessage(
&msg);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
...{   
InBlock.gif                
//确保游戏引擎没有休眠
InBlock.gif
                if(!GameEngine::GetEngine()->GetSleep())
ExpandedSubBlockStart.gifContractedSubBlock.gif                
...{
InBlock.gif                    
//检查滴答计数,查看是否经历了一个周期
InBlock.gif
                    iTickCount=GetTickCount();
InBlock.gif                    
if(iTickCount>iTickTriger)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
...{
InBlock.gif                        iTickTriger
=iTickCount+GameEngine::GetEngine()->GetFrameDelay();
InBlock.gif                        
//游戏循环
InBlock.gif
                        GameCycle();
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
//游戏结束
InBlock.gif
    GameEnd();
InBlock.gif    
return TRUE;
ExpandedBlockEnd.gif}

None.gif
None.gif

其使用方法:

xxx.h文件要先声明一个全局游戏引擎指针。

None.gif#include "resource.h"
None.gif#include 
"GameEngine.h"
None.gif
None.gifGameEngine 
* g_pGame; //全局游戏引擎指针

然后xxx.cpp文件包含该xxx.h文件,在实现相应的游戏事件:

None.gif#include "Blizzard.h"
None.gif
None.gifBOOL GameInitialize(HINSTANCE hInstance)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    g_pGame
=new GameEngine(hInstance,TEXT("PRIZE"),TEXT("PRIZE"),IDI_PRIZE,IDI_PRIZE);
InBlock.gif    
if(g_pGame==NULL)
InBlock.gif        
return FALSE;
InBlock.gif    g_pGame
->SetFrameDelay(15);
InBlock.gif    
return TRUE;
ExpandedBlockEnd.gif}

None.gif
void GameStart(HWND hWnd)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    srand(GetTickCount());
ExpandedBlockEnd.gif}

None.gif
void GameEnd()
ExpandedBlockStart.gifContractedBlock.gif
...{
ExpandedBlockEnd.gif}

None.gif
void GameActivate(HWND hWnd)
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    HDC hDc;
InBlock.gif    RECT rect;
InBlock.gif    GetClientRect(hWnd,
&rect);
InBlock.gif    hDc
=GetDC(hWnd);
InBlock.gif    DrawText(hDc,
"Here comes ....",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
InBlock.gif    ReleaseDC(hWnd,hDc);
ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gif
void GameDeactivate(HWND hWnd)...{}
ExpandedBlockStart.gifContractedBlock.gif
void GamePaint(HDC hdc)...{}
None.gif
void GameCycle()
ExpandedBlockStart.gifContractedBlock.gif
...{
InBlock.gif    HDC hDc;
InBlock.gif    HWND hWnd
=g_pGame->GetWindow();
InBlock.gif    hDc
=GetDC(hWnd);
InBlock.gif    DrawIcon(hDc,rand()
%g_pGame->GetWidth(),rand()%g_pGame->GetHeight(),(HICON)(WORD)GetClassLong(hWnd,GCL_HICON));
InBlock.gif    ReleaseDC(hWnd,hDc);
ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/mywolrd/archive/2008/02/27/1930742.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值