2009-08-26 103 views
5

我刚刚阅读了一些当我输入主题时出现的相关问题,所以我会尽量不要重复这些问题。C++游戏,课堂设计和责任

我最近开始重新研究一个大约两三年前开始的学习项目 - 一个Mega Man引擎的C++端口。是的,我使用了撕裂的精灵。我也正在使用一个游戏引擎库进行绘图,音乐和输入。

我原来的代码非常残酷。尽管它可以(但几乎)被称为面向对象,但它完全错过了这一点。我已经开始添加诸如接口之类的东西,并且删除了很多重复的代码。有些事情我不确定,因为有时游戏设计变得非常复杂。

代表我的游戏库的对象目前是全局的(我知道全局变量通常是不好的),因为许多对象可能会依赖它来加载它们的艺术或音乐。将对象拉出全局范围的最佳方式是什么,而不必将五十个参数传递给一切直接使用它的东西?

下一个问题:众所周知,洛克人射出许多小白色射弹。目前,Player对象负责他发射的子弹对象,更新它们的位置等等(字面上,在Player :: Update()方法内,每次击球时都调用一次Projectile :: Update()方法)。这是做错了吗?我的第一个改进是所有这些对象都实现了一个DrawnObject接口,这样我的游戏就可以绘制一切。为更新做同样的事情意味着我可以控制远离玩家的投射物并将其投放到更广泛的游戏对象。我对此犹豫不决的原因是感觉上帝反对反模式。或者我误解了这个反模式?还有额外的复杂性 - 抛射物如果离开可见屏幕就会死亡,所以任何更新炮弹的调用都需要调用者访问屏幕对象。

这就是现在,当我到达他们时我会回来更多的问题。第一篇文章结束!

回答

7

就制作全局类而言,我会使用一个单例,然后调用Game :: GetInstance(),它将返回一个指向全局类的指针。

就粒子而言,我一直处理游戏的方式是创建一个管理所有对象的类。在我的游戏主循环中,我会调用该类的UpdateObjects函数,它会通过它存储的项目列表并调用每个Update函数。与渲染和碰撞一样的东西。

2

我过去曾经玩过游戏设计,但我不能声称自己是专家。

对于全局访问一个对象,我建议使用一个singleton

于移动物体,我建议使一切能够理解的屏幕位置,并且具有更新方法的父类。无论何时创建新对象,都将其添加到包含所有对象的矢量中,每帧一次,您将遍历矢量并在所有对象上运行更新。

2

代表我的游戏 库中的对象是目前全球(我知道 全局通常是不好的),因为许多 对象可能对于像装载他们的艺术或音乐 这里依靠它有 。 将全局 范围内的对象拉出的最佳方式是什么,而不必将50个参数设置为 直接使用 ?

我同意上述的单身解决方案。

下一个问题:我们都知道,兆丰 人拍摄大量的白色小 弹。目前,玩家 对象负责,他将触发 弹对象,更新 自己的位置,这样(从字面上看, 调用炮弹::更新() 方法每进行一次投篮不中, 球员::更新中()方法)。

代码构建有一个敏捷的设计原则:“单一职责原则”。据它说:“对于 等级改变,绝不应该超过一个原因。”所以我想我会先把Player类的职责分开来分类:一个用于定位,另一个用于射击。

看到一个例子,更多关于这个问题SRP

+0

谁写了SRP文章?我一直在努力寻找那本书,因为它是我真正关心的主题,你能指出我的意思吗? – Goles 2009-09-21 01:11:22

+0

我在阅读“敏捷软件开发:原则,模式和实践”一书时第一次遇到这个词。由罗伯特C.马丁(2002年)。 Martin是Object Mentor(发布文章的网站)的创始人和总裁。 – Harry 2009-09-22 17:16:03