好的,这是一个真正混乱的问题 - 我甚至不知道该搜索什么。
我在这里问了一个与游戏实体处理系统有关的问题:Initiating a derived class with specific variable values
到目前为止,这对我很有帮助,但有一件事。我希望小怪不仅可以互相碰撞,而且可以互动。
如何通过坐标查找派生类的特定实例?
例如,找到位于22,22的baseObject:Enemy()并从中获取“nType”的值
我想到的是将某种指针放在数组中的某个实例,并在所述实体移动时移动它......但我如何使派生类向数组添加指向自身的指针< / STRONG>?然后我如何从该实例的变量中提取一些东西?
呼。希望这是有道理的。
答案 0 :(得分:1)
嗯,我认为解决这个问题的方法是使用委托/事件传递。
假设你有一群暴徒,正如有人先前所说,你可以拥有一个“暴民观察者”对象。这个想法是,当GameEntity是暴民的一部分时,该实体订阅“暴民观察者”。如果该实体离开了暴徒,它将让“暴民观察者”了解它(取消订阅)。
所以,当你需要知道,谁在组成一个暴徒时,你可以向暴民观察者询问“暴徒名单”,如果你需要按实体位置搜索,那么你可以自己通过构成暴徒,找到一个处于“感兴趣的位置”的人。
如果你的怪物是巨大的,你可以为你的暴徒观察者添加某种空间哈希特征,这样你就可以轻松过滤并要求“暴徒中的人物位于gameGrid [10] [13]中”。
如果你使用事件传递,这很酷,因为如果你想在暴徒之间转发消息,可以使用向暴徒观察者发送事件然后将上述事件转发给订阅的实体。
如果您使用委托,它的工作方式类似。
答案 1 :(得分:0)
嗯,您要问的具体问题很容易回答:伪变量 this 在所有成员函数中都可用;它指向当前的对象。
“按坐标查找”部分比较棘手;您可以考虑使用八叉树结构来组织对象(Google是您的朋友。)
答案 2 :(得分:0)
您需要制作一个新对象,其工作是跟踪“怪物”的位置。根据你的问题,这个新对象至少需要包含一个std :: vector,它包含一个指向世界上每个“mob”的指针,还有一个成员函数,如:
mob* findEnemy( int x, int y );
不幸的是,你在问题中要求的可能不是你想要的。你可能想让所有的“怪物”接近一点:
std::vector<mob*> findEnemiesNearPoint( int x, int y );
...但是返回一个std :: vector可能会非常慢,所以你可能想要一个数组,但是数组必须小心,现在我们远远超出你问题中提供的信息量到目前为止。