c++游戏引擎

#include "GameEngine.h"
/*导入游戏引擎中需要用到的头文件和相关库文件*/
#include "winuser.h"
#include "mmsystem.h"
#include "wingdi.h"


#pragma comment(lib,"user32.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"gdi32.lib")


/*初始化*/
GameEngine *GameEngine::m_pGameEngine=NULL;
GameEngine ::GameEngine(HINSTANCE hInstance,
LPTSTR szWindowClass,
LPTSTR szTitle,
WORD wIcon,
WORD wSmallIcon,
BOOL bFullScreen,
int nColorbit,
int nWidth,
int nHeight)
{
m_pGameEngine=this;
m_hInstance=hInstance;


lstrcpy(m_szWindowClass,szWindowClass);
lstrcpy(m_szTitle,szTitle);


m_bFullScreen=bFullScreen;
m_nColorbit=nColorbit;
m_nWidth=nWidth;
m_nHeight=nHeight;


m_wIcon=wIcon;
m_wSmallIcon=wSmallIcon;


m_lStartTime=timeGetTime();
m_lNextGameTick=m_lStartTime;
}


GameEngine::~GameEngine(){  }


//youxichuangkouchuangjian
BOOL GameEngine::CreateGameWindow()
{
WNDCLASSEX wcApp;
HWND hWnd=NULL;
int nPosX,nPosY,nWndWidth,nWndHeight;
DWORD dwWinStyle;
wcApp.cbSize=sizeof(wcApp);

wcApp.style=CS_HREDRAW;
wcApp.lpfnWndProc=WndProc;
wcApp.cbWndExtra=0;
wcApp.cbClsExtra=0;
wcApp.hInstance=m_hInstance;
wcApp.hIconSm=LoadIcon(m_hInstance,MAKEINTRESOURCE(m_wIcon));
wcApp.hIcon=LoadIcon(m_hInstance,MAKEINTRESOURCE(m_wSmallIcon));
wcApp.hCursor=LoadCursor(NULL,IDC_ARROW);
wcApp.hbrBackground=(HBRUSH)(COLOR_WINDOW);
wcApp.lpszMenuName=NULL;
wcApp.lpszClassName=m_szWindowClass;


RegisterClassEx(&wcApp);


DEVMODE DevMode;
ZeroMemory(&DevMode,sizeof(DevMode));
DevMode.dmSize=sizeof(DevMode);


EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&DevMode);


BOOL bDisplayChange=FALSE;
if (DevMode.dmBitsPerPel!=(unsigned long)m_nColorbit)
{
DevMode.dmBitsPerPel=m_nColorbit;
bDisplayChange=TRUE;
}


if ((m_bFullScreen&&m_nWidth!=GetSystemMetrics(SM_CXSCREEN))||
m_nWidth>GetSystemMetrics(SM_CXSCREEN))
{
DevMode.dmPelsWidth=m_nWidth;
DevMode.dmPelsHeight=m_nHeight;
bDisplayChange=TRUE;
}
if(bDisplayChange)
{
LONG result=ChangeDisplaySettings(&DevMode,0);
if (result==DISP_CHANGE_SUCCESSFUL)
{
ChangeDisplaySettings(&DevMode,CDS_FULLSCREEN);
}else
{
ChangeDisplaySettings(NULL,0);
return FALSE;
}
}
if (m_bFullScreen)
{
nPosX=0;
nPosY=0;
dwWinStyle=WS_POPUP;
nWndWidth=m_nWidth;
nWndHeight=m_nHeight;
}
else
{
nWndWidth=m_nWidth+GetSystemMetrics(SM_CXFIXEDFRAME)*2;
nWndHeight=m_nHeight+GetSystemMetrics(SM_CXFIXEDFRAME)*10;


nPosX=(GetSystemMetrics(SM_CXSCREEN)-nWndWidth)/2;
nPosY=(GetSystemMetrics(SM_CYSCREEN)-nWndHeight)/2;


dwWinStyle=WS_SYSMENU|WS_CAPTION;


}
hWnd=CreateWindow(m_szWindowClass,
             m_szTitle,
 dwWinStyle,
 nPosX,
 nPosY,
 nWndWidth,
 nWndHeight,
 NULL,
 NULL,
 m_hInstance,
 NULL);
if (!hWnd) {
return FALSE;
}
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nShowCmd )
{
    MSG msg;


if (!GameInitialize(hInstance))
{
return false;
}
while (true)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT) 
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
if (!GameEngine::GetGameEngine()->GetPause())
{
long nTick=timeGetTime();
long nNextTick=GameEngine::GetGameEngine()->GetNextGameTick();


if (nTick>nNextTick) 
{
long nNextTimeTick=nTick+GameEngine::GetGameEngine()->GetFrameDelay();
GameEngine::GetGameEngine()->SetNextGameTick(nNextTimeTick);
GameAction(GameEngine::GetGameEngine()->GetWindow());
}
}
}
}
return true;
}


LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message) 
{
case WM_CREATE:
GameEngine::GetGameEngine()->SetWindow(hWnd);
GameStart(hWnd);
break;
case WM_PAINT:
HDC hDC;
HDC hMemDC;  //定义内存缓冲设备环境
HBITMAP hbmMem,hbmOld; //定义内存缓冲设备环境中的位图
PAINTSTRUCT ps;


hDC=BeginPaint(hWnd,&ps);
hMemDC=CreateCompatibleDC(hDC);
//创建内存兼容位图
hbmMem=CreateCompatibleBitmap(hDC,GameEngine::GetGameEngine()->GetWidth(),
GameEngine::GetGameEngine()->GetHeight()); 
hbmOld=(HBITMAP)SelectObject(hMemDC,hbmMem);
GamePaint(hMemDC); //调用GamePaint()函数绘制到内存设备环境


//将内存设备环境中的内容绘制到物理设备环境
BitBlt(hDC,0,0,GameEngine::GetGameEngine()->GetWidth(),GameEngine::GetGameEngine()->
GetHeight(),hMemDC,0,0,SRCCOPY);


//释放资源
SelectObject(hMemDC,hbmOld);
DeleteObject(hbmMem);
DeleteDC(hMemDC);
EndPaint(hWnd,&ps); //结束绘图
break;
case  WM_LBUTTONDOWN:
MouseClick(hWnd,LOWORD(lParam),HIWORD(lParam),wParam);
break;
case WM_SETFOCUS:
GameActive(hWnd);
GameEngine::GetGameEngine()->SetPause(FALSE);
break;
case WM_KILLFOCUS:
GamePause(hWnd);
GameEngine::GetGameEngine()->SetPause(TRUE);
break;
case WM_CLOSE:
if (GameWindowClose(hWnd))
{
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
GameEnd();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return false;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值