长期的读者第一次海报。请保持温柔。

我在VB.net中狂热地创建游戏。作为一个业余程序员,我免费提供我的游戏。由于我是最不熟悉正规培训的人,因此我会尝试对自己的编程原则进行自我教育,并在进行OOP等编程时遵循这些原则。但是,有些事情我显然会错过自学的机会,也许我会知道我是否接受过正规教育。

曾经真正使我烦恼的问题是,不同的类(从现在开始称为对象)如何彼此了解,而无需进行编程特定的交互(请在这里呆着……)。

好吧,想象一下,您有一个太空游戏和以下物体

  • clsShip
  • clsMissile
  • clsAsteroid
  • clsSpaceJunk

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

    对于船舶 list 中的每艘船舶
    检查列表中的每个clsMissile以查看是否与它碰撞,如果存在,请减少健康
    检查列表中的每个clsAsteroid,以查看是否与之碰撞,如果这样会降低健康
    检查每个clsSpaceJunka列表以查看是否与之冲突,如果存在,请减少健康
    ...依此类推,针对每个对象
    下一个

    ect ect ...

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

    现在,我要向经验丰富的程序员提出问题。

    OOP中有没有一种方法可以执行以下操作...

    对于从clsSpaceEntity继承的每件事
    检查继承此类型的所有其他对象(自身除外),如果它们发生冲突,则会降低运行状况
    下一个



    对于一种类型的对象/类或任何要“感知”另一个对象的类,以及它们如何相同/不同以及如何交互的这种能力将为我节省大量的代码。

    任何帮助/帮助或对此的反馈将不胜感激。谢谢您的宝贵时间,对您的长时间阅读深表歉意。

    最佳答案

    而不是为每个派生对象使用单独的List(Of T),而应制作一个包含所有实体的List(Of SpaceEntity)

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

    您可以通过给SpaceEntity一个MustOverride函数来处理与其他对象的冲突,而不会为每个实体使用单独的逻辑来污染您的冲突循环,从而进一步增强您的设计。
    您可能应该使用visitor pattern允许实体对与其他不同种类实体的碰撞做出不同 react 。

    请注意,每次碰撞都将发送到分别碰撞的两个对象。您需要按照自己的逻辑进行处理。

    09-30 14:24
    查看更多