【问题标题】:C++ game, class design and responsibilitiesC++ 游戏、类设计和职责
【发布时间】:2009-08-26 03:04:40
【问题描述】:

我刚刚阅读了一些在我输入主题时出现的相关问题,所以我会尽量不重复这些问题。

我最近开始重新审视我大约两三年前开始的一个学习项目 - 洛克人引擎的 C++ 端口。是的,我使用了撕裂的精灵。我还在使用游戏引擎库来进行绘图、音乐和输入。

我的原始代码很糟糕。虽然它可以(但几乎不能)被称为 OO,但它完全没有抓住重点。我已经开始添加接口之类的东西,并删除了很多重复的代码。有些事情我不确定,因为游戏设计有时会变得非常复杂。

代表我的游戏库的对象目前是全局的(我知道全局变量通常很糟糕),因为许多对象可能会到处依赖它来加载它们的艺术或音乐。将对象拉出全局范围的最佳方法是什么,而不必将 50 个参数传递给原本会直接使用它的所有对象?

下一个问题:众所周知,洛克人会发射许多白色的小弹丸。目前,Player 对象负责他发射的 Projectile 对象,更新它们的位置等(字面意思是,在 Player::Update() 方法中为每次射击调用一次 Projectile::Update() 方法)。这是错误的方法吗?我的第一个改进是让所有这些对象都实现 DrawnObject 接口,这样我的游戏就可以绘制所有内容。对 Updates 做同样的事情意味着我从 Player 手中夺走射弹的控制权,并将其交给一些更广泛的 Game 对象。我对此犹豫不决的原因是它感觉像是上帝对象反模式。还是我误解了所说的反模式?仍然涉及到额外的复杂性 - 如果射弹离开可见屏幕,它们就会死亡,因此任何更新射弹的调用都需要调用者访问屏幕对象。

暂时就这些了,等我遇到更多问题再回来。第一篇文章结束!

【问题讨论】:

    标签: c++ oop


    【解决方案1】:

    至于使类成为全局类,我将使用单例,然后只需调用 Game::GetInstance() 即可返回指向全局类的指针。

    就粒子而言,我一直以来处理游戏的方式是创建一个管理所有对象的类。在我的游戏主循环中,我将调用该类 UpdateObjects 函数,该函数将遍历它存储的项目列表并调用其中的每个更新函数。渲染和碰撞也是如此。

    【讨论】:

      【解决方案2】:

      我过去曾修补过游戏设计,但我不能自称是专家。

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

      对于移动对象,我建议将所有内容都设为了解屏幕位置并具有更新方法的父类。每当创建新对象时,将其添加到包含所有对象的向量中,每帧一次,您逐步遍历向量并对所有对象运行更新。

      【讨论】:

        【解决方案3】:

        代表我的游戏的对象 图书馆目前是全球性的(我知道 全局变量通常不好)因为很多 对象可能在这里和那里依赖它 诸如加载他们的艺术或 音乐。最好的方法是什么 将该对象拉出全局 范围,无需通过五十 一切的参数 不然直接用?

        我同意前面提到的单例解决方案。

        下一个问题:众所周知,Mega 男人射了很多小白 弹丸。目前,播放器 对象负责 他发射的投射物,更新 他们的位置等等(字面意思是, 调用 Projectile::Update() 每次拍摄方法一次,在 Player::Update() 方法)。

        有一个代码构建的敏捷设计原则叫做:“单一职责原则”。根据它“永远不应该有一个以上的理由 要更改的类。”所以我想我会从将 Player 类的职责分离到不同的类开始:例如,一个用于定位,一个用于射击。

        查看有关主题SRP的示例和更多信息

        【讨论】:

        • 那篇 SRP 文章是谁写的?我一直在努力寻找那本书,因为它是我真正关心的主题,你能指出我吗?
        • 我在阅读《敏捷软件开发:原则、模式和实践》一书时第一次遇到了这个术语。罗伯特 C. 马丁 (2002)。 Martin 是 Object Mentor(文章发布的网站)的创始人兼总裁。
        猜你喜欢
        • 1970-01-01
        • 2011-02-10
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多