首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“自我意识”课程?

“自我意识”课程?
EN

Stack Overflow用户
提问于 2011-11-01 00:43:33
回答 2查看 189关注 0票数 8

长时间的读者第一次海报。请温柔点。

我热衷于在VB.net中创建游戏。作为一个爱好程序员,我免费赠送我的游戏。由于我是一个没有正式培训的最喜欢的人,所以我确实尝试着对自己进行正确的编程原则的教育,并在编程时遵循这些原则,比如OOP。然而,有一些事情我显然错过了自学,也许我会知道,如果我是正式的教育。

曾经真正困扰我的问题是,不同的类(从现在起称为对象)如何在没有编程特定交互的情况下“了解”对方(请听我说……)请.)

好吧,想象一下,你有一个太空游戏和下面的物体

  • clsShip
  • clsMissile
  • clsAsteroid
  • clsSpaceJunk

现在,这些对象中的每一个都有一个Health、X、Y和Z私有成员和属性,这些成员和属性都是为参数起见从clsSpaceEntity继承的。现在,它们之间编程冲突的一种方法是在主游戏循环中编写以下逻辑

一份船舶清单中的每一艘船

检查列表中的每个clsMissile,看看它是否与其发生冲突,如果与之冲突,则降低健康。

检查每个clsAsteroidin列表,看看它是否与其发生冲突,如果是,则降低健康。

检查每个clsSpaceJunka列表,看看它是否与它发生冲突,如果是的话,降低健康

..。以此类推,以此类推,为接下来的每一个对象

等等..。

现在,如果您讨论上面的简单示例,这可能会很好,但是我的一些游戏中有几十个甚至数百个对象以这种基本方式进行交互。

现在我要问那些有经验的程序员。

在OOP中有什么方法可以做以下事情..。

对于从clsSpaceEntity继承的每一件东西

检查继承此类型的所有其他对象(除自身外),如果它们发生冲突,则降低健康。

下一首

这种类型的对象/类或其他任何类型的对象/类的能力,以及它们是如何相同/不同和相互作用的,将为我节省吨、吨和吨的编码。

如能对此提供任何协助/帮助或反馈意见,将不胜感激。谢谢你抽出时间,很抱歉我读了很长时间。

EN

回答 2

Stack Overflow用户

发布于 2011-11-01 00:47:20

与其为每个派生对象创建一个单独的List(Of T),不如创建一个包含所有实体的List(Of SpaceEntity)

然后,您可以创建一个嵌套的For Each循环,该循环遍历每一对实体并进行碰撞检查。(经过If x <> y检查后)

您可以通过赋予SpaceEntity一个MustOverride函数来处理与其他对象的冲突,从而进一步增强您的设计,而不会对每个实体使用单独的逻辑来污染您的冲突循环。

您可能应该使用visitor pattern来允许实体对与不同类型实体的冲突做出不同的反应。

请注意,每个冲突都将发送到两个分别碰撞的对象;您需要在逻辑中处理这一点。

票数 7
EN

Stack Overflow用户

发布于 2011-11-01 00:50:02

如果我写的逻辑处理的是一艘船,或者一枚导弹,小行星等等,那么这个逻辑显然应该属于不同的类别。

如果我正在编写处理多个对象的逻辑,或者更糟的是,处理不同类型的多个对象,我会倾向于将该逻辑放在一个代表更高层次概念的类中。

例如,您可能有一个包含SpaceEntity集合的Universe类,并且有一个返回碰撞对象集合的Universe.FindCollisions()。

代码语言:javascript
复制
public class Universe {
    private IEnumerable<SpaceEntity> _entities;

    public IEnumerable<Collision> FindCollisions() {
        foreach(var e1 in _entities) {
            foreach(var e2 in _entities) {
                if (e1.CollidesWith(e2)) {
                    yield return new Collision(e1, e2);
                }
            }
        }
    }
}

解决这个问题的另一种方法可能是有一个CollisionCalculator类,它在构造函数中接受SpaceEntity的集合,并且是这个特定逻辑存在的地方。

代码语言:javascript
复制
public class CollisionCalculator {
    public IEnumerable<Collision> Collisions {get; set;}

    public CollisionCalculator(IEnumerable<SpaceEntity> entities) {
        // logic to build the Collisions collection goes here
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7961353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档