游戏场景管理设计

本文探讨了2D SLG和AVG游戏的场景管理,强调了场景对象和引用计数的重要性。通过介绍一个基本的COM类IUnknown,阐述了如何处理对象的生命周期。文章还讨论了场景对象的分类,如RenderObject、LogicObject、Entity等,并提出了组件模式来解决特定设计挑战。此外,文章提到了资源管理器、对象容器和场景层级关系,特别是格子管理在降低处理复杂度中的作用。
摘要由CSDN通过智能技术生成

前言

如之前博客中所说,最近一直忙于业余游戏开发项目中。我一直是个比较懒散的家伙,可这次猫窝的管理员(我们组唯一一名策划)却不愿意让我闲着,几乎每日都会QQ联系,再三叮咛询问我项目的事情。突然有些日本某些连载漫画作家被杂志社催稿的味道了。不过,拖他的福,项目进展比我预料的迅速。虽然被我狠心砍掉了一大模块下去,仍然比我原计划快出很多,感谢他。希望项目快点出来吧。

因为我们做的是2DSLG(战棋策略类游戏)的缘故,而我又主观的偏好一些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游戏,一个关卡中有多个弓箭手敌人ABC,他们属性行为完全一致,那么自然都是一个类的对象。在一个敌人A死亡后,这个对象将被从场景中delete掉,但此时另一个敌人B依旧使用着这个类对象,若直接delete掉该类对象,则只要我们对其他敌人进行任何处理都被判为空指针调用,甚至连桢绘制都无法进行(我们必然会每桢对地图上可见的敌人进行绘制)&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值