基于EasyX的游戏引擎的设计与实现

0.前言

毕业设计想做点有意思的东西,想来想去做点游戏相关的吧,毕竟以后的方向不是这个了,做点东西对这几年学习游戏开发的方面收个尾。也没想到做个什么游戏好,无意间看到EasyX这个C++图形库(安装使用参照),又联想到当时看到的《游戏引擎架构》一书,就打算仿照着cocos2d-x源码的形式写一个简单的2d引擎,姑且叫Genius引擎。

1.效果

先来看看效果吧,毕竟单纯的引擎也没效果,然后就做了几个小demo作为测试
(1)这是以前初学cocos2d-x学着写的,现在用自己的引擎实现一遍,效果还可以。

(2)用EasyX的官网上的图片资源,稍微模仿了一点英雄联盟的操作,做了简单的demo。

2.整体思路

2.1 游戏引擎大体框架

游戏是一个死循环,因此游戏引擎必须对这个循环的各个生命周期具体划分,这一点使用《我所理解的Cocos2d-x》这本书中的配图加以说明,总结出大体的流程如下:
基于EasyX的游戏引擎的设计与实现_第1张图片

2.2 详细模块划分

引擎的各个模块划分虽然看似比较简单,在实际的使用过程中各个模块往往相互联系,很难简单的单独分割,本次简单游戏引擎的划分如下(虽然划分很多但模块的实现难度不同,有些部分只是简单实现):
基于EasyX的游戏引擎的设计与实现_第2张图片

3.具体实现

3.1 代码结构

由于时间有限,又加上要给她做毕设,因此花了一周时间仓促完工,代码不多,总体大概七八千行。
基于EasyX的游戏引擎的设计与实现_第3张图片

3.2 游戏对象模型

采用面向对象的思想,游戏对象模型分为下面两种:
基于EasyX的游戏引擎的设计与实现_第4张图片
不难理解,cocos2d-x就是使用第一种,unity3d使用的是第二种,本次设计也是采用最为简单的根基类的方式,实现的游戏对象不多,只是为了满足基本demo开发,如下图:
基于EasyX的游戏引擎的设计与实现_第5张图片

3.3 关键技术

3.3.1 内存管理

这里仿照cocos2d-x的思路,使用引用计数的方式,将所有游戏对象继承自Ref类,最后统一的内存管理操作,如下图:
基于EasyX的游戏引擎的设计与实现_第6张图片

3.3.2 UI对象的组织

对于添加孩子节点addChild操作,这里使用多个优先级的链表这种数据结构来组织,这样插入删除操作的代码比较复杂,数据结构如下:
基于EasyX的游戏引擎的设计与实现_第7张图片

3.3.3 事件管理

该部分是整个引擎能使用的核心,cocos2d-x中有实现每帧调用update函数或者自定义函数,同时有事件的监听以及回调,该部分是用于实现游戏逻辑的核心部分。本次只考虑了键盘鼠标以及自定义事件,以及相应的监听者,其主要使用队列存储各个对象,遍历处理。其中花费最多时间解决的是实现回调问题,可参照我这篇《C++实现函数回调》,事件管理形式如下:
基于EasyX的游戏引擎的设计与实现_第8张图片

4.总结

(1)能力有限,本质上而言,实现该引擎并没有的实用价值,只是进一步加深对游戏开发的理解,只有学习的作用,游戏开发中必然要使用完整的商用引擎。
(2)科研方面,做一个东西确实应该考虑它的价值,考虑创新性。这一点必须建立在读过大量论文以及阅读了很多引擎的源码之后,切忌闭门造车。
(3)但从技术实现而言,本次设计首先是由于本身对计算机图形学不了解,使用EasyX库导致对实现透明背景的图片相当麻烦,很大程度限制了能够实现游戏的效果,这一点也很遗憾;其次功能并不完善,物理模块只提供了基础图形的碰撞检测,内存的优化不够,会出现卡顿。
最后留下代码,假装有人会看–》Genius引擎源码

你可能感兴趣的:(c++,cocos2d-x)