1

好的,这是一个非常混乱的问题——我什至不完全知道要搜索什么。

我在这里问了一个问题,与游戏的实体处理系统有关:Initiating a derived class with specific variable values

到目前为止,这对我来说很好,但对于一件事。我想让小怪不只是相互碰撞,而是互动。

如何通过坐标查找派生类的特定实例?

例如,找到位于 22,22 的 baseObject:Enemy() 并从中获取“nType”的值

想到的是在数组中放置某种指向实例的指针,并在所述实体移动时移动它......但是如何让派生类将指向自身的指针添加到数组中?然后我如何从该实例的变量中提取一些东西?

唷。希望这是有道理的。

4

3 回答 3

1

好吧,我认为解决这个问题的方法是使用委托/事件传递。

假设您有一个暴民,正如之前有人所说,您可以有一个“暴民观察者”对象。这个想法是,当 GameEntity 是暴民的一部分时,该实体订阅“暴民观察者”。如果该实体离开了暴民,它将让“暴民观察者”知道它(取消订阅)。

因此,当您需要知道谁在组成暴民时,您可以向暴民观察者询问“暴民列表”,如果您需要按实体位置搜索,然后您可以自己通过组成暴民的实体列表,并且在“感兴趣的位置”中找到一个。

如果你的怪物很大,你可以为你的怪物观察器添加某种空间散列功能,这样你就可以轻松过滤并询问“位于 gameGrid[10][13] 中的怪物中的人”。

如果你使用事件传递,这很酷,因为如果你想在 mob 之间转发消息,可以使用向 mob watcher 发送事件,然后将上述事件转发给订阅的实体。

如果您使用委托,它以类似的方式工作。

观察者模式 委托模式

于 2011-03-21T19:27:23.743 回答
0

好吧,您要问的具体问题很容易回答:伪变量this在所有成员函数中都可用;它指向当前对象。

“按坐标查找”部分比较棘手;你可以考虑使用八叉树结构来组织你的对象(谷歌是你的朋友。)

于 2011-03-17T02:37:38.993 回答
0

您将需要创建一个新对象,其工作是跟踪“暴民”的位置。根据您的问题,这个新对象至少需要包含一个 std::vector ,其中包含指向世界上每个“暴民”的指针,以及一个成员函数,例如:

mob* findEnemy( int x, int y );

不幸的是,您在问题中要求的可能不是您想要的。你可能想让所有的“暴徒”靠近一个点:

std::vector<mob*> findEnemiesNearPoint( int x, int y );

...但是返回 std::vector 可能会非常慢,因此您可能想要一个数组,但必须仔细调整数组的大小,现在我们远远超出了您问题中提供的信息量。

于 2011-03-17T19:09:22.793 回答