前言
如之前博客中所说,最近一直忙于业余游戏开发项目中。我一直是个比较懒散的家伙,可这次猫窝的管理员(我们组唯一一名策划)却不愿意让我闲着,几乎每日都会QQ联系,再三叮咛询问我项目的事情。突然有些日本某些连载漫画作家被杂志社催稿的味道了。不过,拖他的福,项目进展比我预料的迅速。虽然被我狠心砍掉了一大模块下去,仍然比我原计划快出很多,感谢他。希望项目快点出来吧。
因为我们做的是2D的SLG(战棋策略类游戏)的缘故,而我又主观的偏好一些AVG(恋爱养成游戏),所以本文重点会考虑这两类游戏的场景管理,对于3D且不基于地图格的场景管理设计恐怕您就需要进一步考虑了。
引子
场景管理以及场景对象管理,我想应当是游戏逻辑的核心模块也不为过了,实际上复杂度还是非常高的,本文仅从一些部分简单的叙述了其中一些内容。随兴而谈,仅供参考。
场景对象
熟悉Com机制的朋友会知道,Com的最基类通常都是IUnknown类,这个类通常包括下面四个函数:
/** 构造函数 */
IUnknown() : m_nRefCount(1) { }
/** 增加计数 */
void AddRef(){++m_nRefCount;}
/** 假释放 */
bool Release()
{
assert(m_nRefCount > 0);
-- m_nRefCount;
if(m_nRefCount)
{delete this; return true;}
return false;
}
/** 接口查询 */
void QueryInterface(const IID& Guid) = NULL;
首先来解释一下这个类。
1:这个类内有一个成员m_nRefCount引用计数,在我们每次New一个继承此类的类成员时,该引用计数自动加一。在Release它时,不是真正的释放掉,而是减少一个引用计数,在引用计数为0时,也就意味着的确没有类再引用此类对象时,该类对象才真正的释放。
这样有很大的好处,假设一个SLG游戏,一个关卡中有多个弓箭手敌人A,B,C,他们属性行为完全一致,那么自然都是一个类的对象。在一个敌人A死亡后,这个对象将被从场景中delete掉,但此时另一个敌人B依旧使用着这个类对象,若直接delete掉该类对象,则只要我们对其他敌人进行任何处理都被判为空指针调用,甚至连桢绘制都无法进行(我们必然会每桢对地图上可见的敌人进行绘制)&#x