2D游戏开发 - SkyGameEngine2d 引擎架构 | 目录结构 | 引擎入口点

  • 一、引擎架构
  • 二、引擎目录
    • 2.1 src目录介绍
  • 三、项目目录
  • 四、引擎框架入口点分析
    • 4.1 main.cpp 分析
    • 4.2 GameAppDelegate.cpp 分析

SkyGameEngine2d - 探索 简洁 易用 ,一款适合游戏入门学习的2d游戏引擎
项目地址 https://gitee.com/xfcode/SkyGameEngine2d

QQ群号:498358732
加群链接:https://jq.qq.com/?_wv=1027&k=5odSA9K
示例游戏视频链接:https://www.bilibili.com/video/av59147631/
更多文章见:SkyGameEngine2d 游戏引擎相关文章目录汇总


一、引擎架构

游戏引擎是一个比较复杂的软件系统,按照引擎系统的构成可以初略的划分为以下模块

引擎基于windwos平台,在平台之上使用了 DriectX11MIC 库。并且引入了一些第三方的库(Tinyxml2、WICTextureLoader)。

引擎中大量的使用了C++11的特性以及其标准库,其中最为重要的内存管理机制依赖于C++中的智能指针。并且引擎在处理回调方面抛弃了过去的函数指针的形式,而是采用更加安全方便的仿函数

引擎包含的模块有:

  1. 资源管理
  2. 渲染系统
  3. 节点系统
  4. UI系统
  5. 动画系统
  6. 事件系统
  7. 音频管理
  8. 任务调度系统
  9. 外设输入管理

引擎种各个模块并非完全独立的,有些模块之间存在依赖关系,有些模块仅仅是为了架构清晰而提出的,实际上部分实现已经渗透到引擎的各个模块。接下来简要的说明各个模块的功能。

核心系统是整个引擎各个模块的公共部分,提供了调试、一些便利的工具类和宏以及数学库。其中数据库可以充分利用现代CPU的SIMD特性,更快对各种矢量、矩阵进行运算。

渲染系统与节点系统、UI系统是密切相关的,他们也是引擎的核心所在。渲染系统对下封装了DriectX11的功能,如着色器、纹理、渲染状态等;对上为节点系统、UI系统提供了一套渲染机制,使其可以不必太关心具体的渲染细节,而专注于做引擎的逻辑。

事件系统和任务调度系统是可以起到连接引擎与游戏的桥梁,游戏可以通过监听各种事件来获取引擎的状态。同时这两个模块也为游戏开发提供了极大的方便,事件机制可以解决游戏中复杂的对象关系之间的耦合,定时器则方便游戏进行多种时间相关的处理。

动画系统为引擎种可执行动画的元素实现了简单的动画(位移、帧动画等)

资源管理 包括游戏资源(纹理、声音等)管理与系统资源管理(句柄、内存等)。对于游戏资源采用缓存机制,在游戏加载时载入缓存,如果再次使用相同的资源则不必重新加载。对于系统资源采用基于父子节点树的管理方式和基于智能指针1的管理方式。

二、引擎目录

引擎目录如下图所示(以1.0.3版本为例)

  1. bin 目录存放引擎编译后产生的文件,如debug\SkyGameEngine2d_d.lib
  2. build 目录存放引擎的VS工程文件,如SkyGameEngine2d.sln
  3. doc 目录存放引擎的文档,可浏览器打开index.html 本地阅读文档
  4. empty_template 目录为游戏项目的一个空模板,一般不需要关心该目录,仅供引擎工具新建一个项目时使用
  5. include 目录包含引擎的头文件
  6. sample_game 目录存放引擎的示例游戏项目
  7. src 目录存放引擎的源码
  8. test 目录存放引擎的测试项目
  9. tool 存放一些工具相关的数据或者项目

2.1 src目录介绍

src目录如下(以1.0.3版本为例)

  1. action 包含了动画系统的实现
  2. audio 音频管理的实现
  3. base 引擎的公共基础库实现,比如事件系统、数学库、颜色等
  4. example 某些api的用法。仅供文档 对其进行引用 ,已说明某个API的示例用法,文件不会参与到引擎编译
  5. external 第三方库
  6. node 节点系统的实现
  7. ui UI系统的实现
  8. utility 一些工具类\函数\宏定义
  9. win32 与windows平台相关的代码
  10. render 实现渲染系统

三、项目目录

参看教程 2D游戏开发 - SkyGameEngine2d 创建一个游戏项目 创建一个新项目。
项目目录如下图:

  1. build 文件夹为游戏工程文件存放的目录
  2. res 文件夹为 游戏中的资源文件 (图片、声音等)存放的目录
  3. sky_game_engine2d 文件夹为引擎相关的文件(工程文件、源码等)
  4. src 文件夹为游戏源码存放的目录

重点说明src目录如下所示

  1. framework 引擎框架入口
  2. scene 游戏场景的实现

引擎入口实现文件如下所示

四、引擎框架入口点分析

4.1 main.cpp 分析

首先分析main文件

//main.cpp int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow
)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);std::unique_ptr<GameAppDelegate> app_delegate = std::make_unique<GameAppDelegate>();auto app=Application::getInstance();app->setAppDelegte(app_delegate.get());return app->run();
}

WinMain() 为win32应用程序的主函数【类似于 main() 】。在该函数中首先创建一个GameAppDelegate对象,然后获取程序实例并且设置代理对象。最后,程序实例对象app执行 run() 函数。run()函数为引擎工作的开始,它由初始化代码游戏循环退出清理代码 三部分组成。代码如下所示。

 // run 函数实现 int Application::run(){//1.初始化应用程序if (!initApp()){return -1;}//2.游戏循环this->loopApp();//3.退出游戏 清理this->clearApp();return 0;}

4.2 GameAppDelegate.cpp 分析

上一小节提到在主函数中首先创建GameAppDelegate对象,那么该对象在游戏中有何作用,这要从引擎基础架构的设计说起。

  1. IApplication提供了应用程序代理的设置以及Windows消息过滤器的设置。开发者可以通过消息过滤器来自定义的处理系统消息。
  2. IAppDelegate接口为开发者提供了定义引擎运行的各个阶段的能力。比如设置窗口的尺寸、调整游戏帧率、初始化场景等。开发者需要继承该接口,复写其接口 即可,引擎在适当的时候回调用这些接口。
  3. IApplicationView接口提供了与程序视图相关的数据,比如当前窗口的大小等。

总之,引擎通过上述3个接口来描述游戏程序,分别处理 程序的基础逻辑、开发者自定义程序逻辑、程序的视图三个部分。IApplicationIApplicationView 接口均由引擎本身实现,而IAppDelegate接口由游戏开发者实现,来控制程序运行各个阶段的逻辑。

引擎工具在创建项目时 默认提供了 GameAppDelegate 类来实现IAppDelegate 接口,该类的实现均为默认情况在的设置,开发者需要根据实际项目调整

下面以默认的实现来说明如何通过代理(GameAppDelegate)控制游戏程序。

bool GameAppDelegate::appInit()
{//设置帧率auto app = Application::getInstance();app->setPerFrameInterval(1 / 120.0f);#ifdef _DEBUGGameWorld::getInstance()->openDebugConsole();GameWorld::getInstance()->isDisplayRenderInfo(true);
#endif // _DEBUG//TODO 做自己想做的事情吧 。//开始场景 auto g = GameWorld::getInstance();g->pushScene(TestScene::create());g->start();return true;
}

appInit()为程序的初始化阶段,在该阶段可以对程序的初始化值进行设置,比如帧率(默认为60),亦可以加载一些游戏资源等等2。重要的是一定要在最后启动一个游戏场景,这样游戏才可以正常运行
注意:请勿在该函数中执行太多的耗时操作,这样会导致程序假死。

IAppDelegate接口作用如下表所示

接口名字 作用
appInit 引擎初始化后会调用,用来控制程序的初始信息
getWindowsSize 引擎通过该接口获取程序的窗口尺寸
appEnterBackground 当程序被最小化时调用该接口
appEnterForeground 程序从最小化进入正常窗口时调用该接口

更多文章见:SkyGameEngine2d 游戏引擎相关文章目录汇总

本节完
最后更新时间:2019年7月19日 21:27:40


  1. 这里指的智能指针包括 C++中的智能指针和WinRT中管理com组件的Com智能指针ComPtr ↩︎

  2. 该阶段引擎的基础组件其实已经初始化完毕,所以在该函数中几乎可以使用引擎中的全部API ↩︎

2D游戏开发 - SkyGameEngine2d 引擎架构 | 目录结构 | 引擎入口点相关推荐

  1. 2D游戏开发 - SkyGameEngine2d 游戏引擎相关文章目录汇总

    SkyGameEngine2d - 探索 简洁 易用 ,一款适合游戏入门学习的2d游戏引擎 项目地址 https://gitee.com/xfcode/SkyGameEngine2d QQ群号:498 ...

  2. 2D游戏开发 - SkyGameEngine2d 创建一个游戏项目

    2D游戏开发 - SkyGameEngine2d 创建一个游戏项目 一.前期准备 二.获取引擎工具 2.1 下载工具集 2.2 解压并且打开工具 三.使用工具 3.1 工具界面介绍 3.2 设置引擎路 ...

  3. 2D游戏开发 - SkyGameEngine2d坐标系

    2D游戏开发 - SkyGameEngine2d坐标系 一.DX11使用的坐标系 二.屏幕坐标系&窗口坐标系 三.SkyGameEngine2d 坐标系 四.世界坐标系&局部坐标系 五 ...

  4. 2D游戏开发 - 配置SkyGameEngine2d环境

    2D游戏开发 - 配置SkyGameEngine2d环境 一.本项目需要准备的环境 二.下载引擎源码 三.打开工程 四.编译项目 五.运行示例游戏 SkyGameEngine2d - 探索 简洁 易用 ...

  5. webGL、webGPU、封装、渲染引擎 three.js、游戏引擎,定位是游戏开发,在前面的渲染引擎基础上,还提供了骨骼动画、物理引擎、AI、GUI 等功能,以及可视化编辑器来设计关卡,支撑大型游戏

    https://zhuanlan.zhihu.com/p/162878354 如何选择 WebGL 框架和引擎? ​ 知道得越多,不知道的就更多了 数据可视化Sugar-百度智能云 ​cloud.ba ...

  6. Unity 2D游戏开发快速入门(内部资料)

    Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 前  言 Unity是一款综合的游戏开发工具 ...

  7. Unity简单2D游戏开发

    Unity简单2D游戏开发 前言: 近日比较无聊,在b站找了一个up主,跟着他的教程来做游戏--开发一个简单的2D游戏 用 Tilemap 绘制场景 新建一个2D项目,在Unity Asset Sto ...

  8. Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍

    Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介绍Unity的下 ...

  9. Unity 4.x 2D游戏开发基础教程大学霸第一更

    Unity 4.x 2D游戏开发基础教程 大学霸 第1章  Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介 ...

最新文章

  1. ZooKeeper客户端地址列表的随机原理
  2. jQuery获取元素内容
  3. 你所需要的java异常的处理和设计及深入理解,看这篇就差不多了
  4. 使用SAP OData服务创建销售订单
  5. 在webservice中传递Hashtable
  6. 使用java代码发送zip文件到邮箱_Azkaban安装与使用(下)
  7. centos 6.7 mysql 5.6_CentOS 6.7 安装 MySQL 5.6 思路整理
  8. 5 thinkpad 黑将评测_ThinkPad L380视频评测:全能型商务助手
  9. 使用C#代码实现增加用户帐号
  10. URL与URI的区别和联系
  11. 阿里云认证(ACA/ACP/ACE)的分类以及官网价格
  12. 2022年前端还好找工作吗?
  13. android 8.0 图标规范,Android 8.0自适应图标
  14. 基于zxing的彩色二维码生成与解析
  15. OSI七层模型和STP/IP协议模型(生动形象,简单易懂)
  16. web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}...
  17. 金弘同创怎么样:拼多多获取奖励金的办法
  18. 一个JavaScript实现的贷款计算器
  19. Mobius 莫比乌斯
  20. 基于低代码平台实现的内外OA协同办公系统

热门文章

  1. 声发射传感器的内部结构
  2. ON1 HDR 2020.1 14.1.1 (8985) 中文版 专业的HDR照片处理
  3. 什么是一代视频监控?闭路电视视频监控系统介绍
  4. 用python画星空-python3的turtle画模仿3d星空、运动的恒星小宇宙
  5. 如何拍背景虚化的照片_手机拍照,怎么拍出人物突出、背景虚化的照片?
  6. 编译原理实验入门-Cygwin-Flex-Bison-下载安装+基本操作
  7. 土狼向狮子的演进(z)
  8. 零基础学PS平面设计基础有哪些?
  9. 如何做好软件开发项目管理?
  10. Android中Notification设置setSmallIcon、setLargeIcon无效的问题,仍显示安卓自带的机器人图标(小米10手机)