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平台,在平台之上使用了 DriectX11
、MIC
库。并且引入了一些第三方的库(Tinyxml2、WICTextureLoader)。
引擎中大量的使用了C++11
的特性以及其标准库,其中最为重要的内存管理机制依赖于C++中的智能指针
。并且引擎在处理回调方面抛弃了过去的函数指针的形式,而是采用更加安全方便的仿函数
。
引擎包含的模块有:
引擎种各个模块并非完全独立的,有些模块之间存在依赖关系,有些模块仅仅是为了架构清晰而提出的,实际上部分实现已经渗透到引擎的各个模块。接下来简要的说明各个模块的功能。
核心系统是整个引擎各个模块的公共部分,提供了调试、一些便利的工具类和宏以及数学库。其中数据库可以充分利用现代CPU的SIMD特性,更快对各种矢量、矩阵进行运算。
渲染系统与节点系统、UI系统是密切相关的,他们也是引擎的核心所在。渲染系统对下封装了DriectX11的功能,如着色器、纹理、渲染状态等;对上为节点系统、UI系统提供了一套渲染机制,使其可以不必太关心具体的渲染细节,而专注于做引擎的逻辑。
事件系统和任务调度系统是可以起到连接引擎与游戏的桥梁,游戏可以通过监听各种事件来获取引擎的状态。同时这两个模块也为游戏开发提供了极大的方便,事件机制可以解决游戏中复杂的对象关系之间的耦合,定时器则方便游戏进行多种时间相关的处理。
动画系统为引擎种可执行动画的元素实现了简单的动画(位移、帧动画等)
资源管理 包括游戏资源(纹理、声音等)管理与系统资源管理(句柄、内存等)。对于游戏资源采用缓存机制,在游戏加载时载入缓存,如果再次使用相同的资源则不必重新加载。对于系统资源采用基于父子节点树的管理方式和基于智能指针1的管理方式。
debug\SkyGameEngine2d_d.lib
SkyGameEngine2d.sln
index.html
本地阅读文档仅供引擎工具新建一个项目时使用
。仅供文档 对其进行引用 ,已说明某个API的示例用法,文件不会参与到引擎编译
参看教程 2D游戏开发 - SkyGameEngine2d 创建一个游戏项目 创建一个新项目。
项目目录如下图:
首先分析main文件
//main.cpp
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
std::unique_ptr app_delegate = std::make_unique();
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;
}
上一小节提到在主函数中首先创建GameAppDelegate对象,那么该对象在游戏中有何作用,这要从引擎基础架构的设计说起。
IApplication
提供了应用程序代理的设置以及Windows消息过滤器的设置。开发者可以通过消息过滤器来自定义的处理系统消息。IAppDelegate
接口为开发者提供了定义引擎运行的各个阶段的能力。比如设置窗口的尺寸、调整游戏帧率、初始化场景等。开发者需要继承该接口,复写其接口 即可,引擎在适当的时候回调用这些接口。IApplicationView
接口提供了与程序视图相关的数据,比如当前窗口的大小等。总之,引擎通过上述3个接口来描述游戏程序,分别处理 程序的基础逻辑、开发者自定义程序逻辑、程序的视图三个部分。IApplication
、IApplicationView
接口均由引擎本身实现,而IAppDelegate
接口由游戏开发者实现,来控制程序运行各个阶段的逻辑。
引擎工具在创建项目时 默认提供了 GameAppDelegate
类来实现IAppDelegate
接口,该类的实现均为默认情况在的设置,开发者需要根据实际项目调整。
下面以默认的实现来说明如何通过代理(GameAppDelegate)
控制游戏程序。
bool GameAppDelegate::appInit()
{
//设置帧率
auto app = Application::getInstance();
app->setPerFrameInterval(1 / 120.0f);
#ifdef _DEBUG
GameWorld::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
这里指的智能指针包括 C++中的智能指针和WinRT中管理com组件的Com智能指针ComPtr
↩︎
该阶段引擎的基础组件其实已经初始化完毕,所以在该函数中几乎可以使用引擎中的全部API ↩︎