1. 写一个游戏引擎类的头文件(.h);
  2. 写一个游戏引擎类的实现文件(.cpp);
  3. 在编程中如何调用游戏引擎。

一 、在VS2015中新建一个 Visual C++ 常规空项目,添加一个游戏引擎头文件实现文件。详细步骤如下:

二 、游戏引擎头文件 GameEngine.h 源代码:

#pragma once
#include <windows.h>int WINAPI        WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow);LRESULT CALLBACK  WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);BOOL GameInitialize(HINSTANCE hInstance);
void GameStart(HWND hWindow);
void GameEnd();
void GameActivate(HWND hWindow);
void GameDeactivate(HWND hWindow);
void GamePaint(HDC hDC);
void GameCycle();class GameEngine
{
protected://成员变量static GameEngine*  m_pGameEngine;HINSTANCE           m_hInstance;HWND                m_hWindow;TCHAR               m_szWindowClass[32];TCHAR               m_szTitle[32];WORD                m_wIcon, m_wSmallIcon;int                 m_iWidth, m_iHeight;int                 m_iFrameDelay;BOOL                m_bSleep;public://构造函数/析构函数GameEngine(HINSTANCE hInstance, LPTSTR szWindowClass, LPTSTR szTitle,WORD wIcon, WORD wSmallIcon, int iWidth = 640, int iHeight = 480);virtual ~GameEngine();static GameEngine*  GetEngine() { return m_pGameEngine; };BOOL                Initialize(int iCmdShow);LRESULT             HandleEvent(HWND hWindow, UINT msg, WPARAM wParam,LPARAM lParam);HINSTANCE GetInstance() { return m_hInstance; };HWND      GetWindow() { return m_hWindow; };void      SetWindow(HWND hWindow) { m_hWindow = hWindow; };LPTSTR    GetTitle() { return m_szTitle; };WORD      GetIcon() { return m_wIcon; };WORD      GetSmallIcon() { return m_wSmallIcon; };int       GetWidth() { return m_iWidth; };int       GetHeight() { return m_iHeight; };int       GetFrameDelay() { return m_iFrameDelay; };void      SetFrameRate(int iFrameRate) {m_iFrameDelay = 1000 / iFrameRate;};BOOL      GetSleep() { return m_bSleep; };void      SetSleep(BOOL bSleep) { m_bSleep = bSleep; };
};

三 、游戏引擎实现文件 GameEngine.cpp 源代码:

#include "GameEngine.h"GameEngine *GameEngine::m_pGameEngine = NULL;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MSG         msg;static int  iTickTrigger = 0;int         iTickCount;if (GameInitialize(hInstance)){// 初始化游戏引擎if (!GameEngine::GetEngine()->Initialize(iCmdShow))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::GetEngine()->GetSleep()){// Check the tick count to see if a game cycle has elapsediTickCount = GetTickCount();if (iTickCount > iTickTrigger){iTickTrigger = iTickCount +GameEngine::GetEngine()->GetFrameDelay();GameCycle();}}}}return (int)msg.wParam;}// 结束游戏GameEnd();return TRUE;
}LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{// 将所有Windows消息路由到游戏引擎return GameEngine::GetEngine()->HandleEvent(hWindow, msg, wParam, lParam);
}//-----------------------------------------------------------------
// 游戏引擎的构造函数/析构函数
//-----------------------------------------------------------------
GameEngine::GameEngine(HINSTANCE hInstance, LPTSTR szWindowClass,LPTSTR szTitle, WORD wIcon, WORD wSmallIcon, int iWidth, int iHeight)
{// 设置游戏引擎的成员变量m_pGameEngine = this;m_hInstance = hInstance;m_hWindow = NULL;if (lstrlen(szWindowClass) > 0)lstrcpy(m_szWindowClass, szWindowClass);if (lstrlen(szTitle) > 0)lstrcpy(m_szTitle, szTitle);m_wIcon = wIcon;m_wSmallIcon = wSmallIcon;m_iWidth = iWidth;m_iHeight = iHeight;m_iFrameDelay = 50;   // 游戏周期,一般设为20帧/秒m_bSleep = TRUE;
}GameEngine::~GameEngine()
{
}BOOL GameEngine::Initialize(int iCmdShow)
{WNDCLASSEX    wndclass;// 为主窗口创建窗口类wndclass.cbSize = sizeof(wndclass);wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = m_hInstance;wndclass.hIcon = LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon()));wndclass.hIconSm = LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon()));wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = m_szWindowClass;// 注册窗口类if (!RegisterClassEx(&wndclass))return FALSE;// 根据游戏大小计算窗口大小和位置int iWindowWidth = m_iWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2,iWindowHeight = m_iHeight + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 +GetSystemMetrics(SM_CYCAPTION);if (wndclass.lpszMenuName != NULL)iWindowHeight += GetSystemMetrics(SM_CYMENU);int iXWindowPos = (GetSystemMetrics(SM_CXSCREEN) - iWindowWidth) / 2,iYWindowPos = (GetSystemMetrics(SM_CYSCREEN) - iWindowHeight) / 2;// 创建窗口m_hWindow = CreateWindow(m_szWindowClass, m_szTitle, WS_POPUPWINDOW |WS_CAPTION | WS_MINIMIZEBOX, iXWindowPos, iYWindowPos, iWindowWidth,iWindowHeight, NULL, NULL, m_hInstance, NULL);if (!m_hWindow)return FALSE;// 显示并更新窗口ShowWindow(m_hWindow, iCmdShow);UpdateWindow(m_hWindow);return TRUE;
}LRESULT GameEngine::HandleEvent(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{// 将Windows消息路由到游戏引擎成员函数switch (msg){case WM_CREATE:// 设置游戏窗口并开始游戏SetWindow(hWindow);GameStart(hWindow);return 0;case WM_SETFOCUS://激活游戏并更新睡眠状态GameActivate(hWindow);SetSleep(FALSE);return 0;case WM_KILLFOCUS:// 停用游戏并更新睡眠状态GameDeactivate(hWindow);SetSleep(TRUE);return 0;case WM_PAINT:HDC         hDC;PAINTSTRUCT ps;hDC = BeginPaint(hWindow, &ps);// 绘制游戏GamePaint(hDC);EndPaint(hWindow, &ps);return 0;case WM_DESTROY:// 结束游戏并退出应用程序GameEnd();PostQuitMessage(0);return 0;}return DefWindowProc(hWindow, msg, wParam, lParam);
}

四 、调用游戏引擎,添加一个要做的游戏应用文件 FIRSTGAME.cpp 源码如下:

#pragma once#include <windows.h>
#include "Resource.h"
#include "GameEngine.h"GameEngine* g_pGame;BOOL GameInitialize(HINSTANCE hInstance)
{// 创建游戏引擎g_pGame = new GameEngine(hInstance, TEXT("第一个游戏"),TEXT("第一个游戏"), IDI_ICON1, IDI_ICON2);//IDI_ICON1, IDI_ICON2 这是建立游戏资源.ico后缀图片的IDif (g_pGame == NULL)return FALSE;// 设定游戏速度为15帧/秒g_pGame->SetFrameRate(15);return TRUE;
}void GameStart(HWND hWindow)
{}void GameEnd()
{// 清理游戏引擎delete g_pGame;
}void GameActivate(HWND hWindow)
{HDC   hDC;RECT  rect;// 在游戏屏幕上绘制激活文本GetClientRect(hWindow, &rect);hDC = GetDC(hWindow);DrawText(hDC, TEXT("第一个游戏开始!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);ReleaseDC(hWindow, hDC);
}void GameDeactivate(HWND hWindow)
{HDC   hDC;RECT  rect;// 在游戏屏幕上绘制激停文本GetClientRect(hWindow, &rect);hDC = GetDC(hWindow);DrawText(hDC, TEXT("第一个游戏结束!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);ReleaseDC(hWindow, hDC);
}void GamePaint(HDC hDC)
{
}void GameCycle()
{HDC   hDC;HWND  hWindow = g_pGame->GetWindow();// 在游戏屏幕上的任意位置绘制游戏图标hDC = GetDC(hWindow);DrawIcon(hDC,200,200,(HICON)(WORD)GetClassLong(hWindow, GCL_HICON));ReleaseDC(hWindow, hDC);
}

五 、编译后运行画面:

六 、源代码出自如下书籍资料:

1.游戏编程精粹     作者:(美) Michael Dickheiser著

2.游戏编程入门    作者:(美) Michael Morrison著

【如何用C++编程制作一个简单的游戏引擎】相关推荐

  1. 小福利,用Excel VBA编程制作一个变色小游戏

    小福利,用Excel VBA编程制作一个变色小游戏 设计思想:在正方形的四条边上都是设置循环函数,不断改变颜色和单元格里面的数值. Option ExplicitSub 按钮1_Click() Dim ...

  2. 如何制作一个简单的游戏 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  3. 如何制作一个简单的游戏 Cocos2d-x 2.0.4

    本文实践自 Ray Wenderlich 的文章< How To Make A Simple iPhone Game with Cocos2D 2.X Tutorial>,文中使用Coco ...

  4. 怎样用HTML5 Canvas制作一个简单的游戏

    为了让大家清楚HTML5制作游戏的简单流程,所以先了制作一个非常简单的游戏,来看一看这个过程.   游戏非常简单,无非就是英雄抓住怪物就得分,然后游戏重新开始,怪物出现在地图的随机位置,英雄初始化在地 ...

  5. [译]怎样用HTML5 Canvas制作一个简单的游戏

    这是我翻译自LostDecadeGames主页的一篇文章,原文地址:How To Make A Simple HTML5 Canvas Game. 下面是正文: 自从我制作了一些HTML5游戏(例如C ...

  6. 如何利用Construct 2制作一个简单的游戏

    Construct 2 是一款专门制作游戏的软件,它的存在,让没有编程基础的人也可以轻松的制作游戏,享受其中的快乐. 这是一款几乎没有门槛的软件,任何人都可以快速上手.作为广大游戏爱好者之一,我希望将 ...

  7. html5上色游戏制作,怎样用HTML5 Canvas制作一个简单的游戏

    原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...

  8. 使用pygame制作一个简单的游戏

    翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novice to Professional&g ...

  9. python自己制作节奏大师游戏_使用pygame制作一个简单的游戏

    翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novice to Professional&g ...

最新文章

  1. 马斯克新视频:Boring公司将优先解决公交快速通勤
  2. python怎么把数据写入txt-如何将python中文件写入TXT
  3. 对 Stream 中 Map 与 ForEach 做个简单说明
  4. 魔术师发牌问题 java_魔术师发牌问题--java实现
  5. c向文件中插入数据_Redis从文件中批量插入数据
  6. oracle外表日期,三步教会您掌握oracle外表(external table)
  7. 误删path怎么办(已重启)
  8. python 读取excel太慢_Python 读取excel并转换为字典
  9. devops 应用_如何在DevOps中应用系统思考
  10. java获取当前行数
  11. 强化学习之DQN(附莫烦代码)
  12. 微信小程序获取用户头像和昵称能力调整!新的代替方案!
  13. JMeter详细使用教程及实际案例
  14. 互联网行业的常用黑话,你知道几条?
  15. 一个生肖一首诗,看看你是哪一首?
  16. 电脑开启麦克风有回音,录音声音太小怎么办?
  17. gif图怎么压缩大小?在线压缩gif技巧
  18. 10个优秀的Spring Boot开源项目整理分享
  19. deepin linux 2014下载,Deepin 2014官方正式发布下载
  20. 计算机网络框架大纲(脑图可自提)----1.概述

热门文章

  1. 全志T3(A40I)/T5(T507)性能对比,一代更比一代强
  2. [听风]TBC单体插件装备掉落查询AtlasLootClassic
  3. 双非渣本的实习秋招路
  4. 植物大战僵尸联机版手游
  5. 打造现代医药物流面临的挑战及应对措施
  6. Java音乐播放器,窗体程序 完整源码
  7. linux如何取消分区加密,linux下分区与加密详解
  8. HttpServletResponse header设置
  9. QQ好友列表获取导出类:爬虫爬取QQ号
  10. KMP快速计算next与nextval