所以我有一个World对象中存在的Agent对象集合。
这些特工需要检查他们的兄弟姐妹,并根据他们的接近程度采取某些行动。
目前我做以下事情。
世界决定是时候更新状态,它会这样做然后循环并将此消息传递给每个代理,以便它也更新状态。
然后每个Agent依次向World询问代理数组并继续循环检查每个代理的接近程度,看看它是否需要作用于哪个。
有更好的方法吗?我可以看到一个明显的低效率,即每次接近计算两次,每次接近一次。
答案 0 :(得分:3)
根据代理的数量,您可能会发现,只要每个代理通过NSNotificationCenter
进行更改,就可以更好地广播其位置。然后,每个代理将订阅此通知,并且每个代理都将在 实时 中了解每个代理的每个位置更改并相应地执行操作。这种方法可以在以后为您开辟一些可能性,例如,如果您想检查是否有任何代理执行某些操作,例如:“Agent抛出球;代理接收通知并决定接球”。
因此,您的代理实现可能如下所示:
-(id)init
{
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(agentLocationDidChange:) name:NOTIF_AGENT_LOCATION_DID_CHANGE object:nil];
return self;
}
-(void)agentLocationDidChange:(NSNotification *)notif
{
Agent *agent = [notif object];
if ([agent isEqual:self])
return; //We don't care about our own actions
if ([self isAgentCloseProximity:agent])
{
//Do something
}
}
-(BOOL)isAgentCloseProximity:(Agent *)agent
{
CGFloat xDistance = agent.location.x - self.location.x;
CGFloat yDistance = agent.location.y - self.location.y;
CGFloat distance = sqrt((xDistance*xDistance)+(yDistance*yDistance));
CGFloat threshold = ...; //<- this could be some constant that you define
BOOL isClose = distance < threshold;
return isClose;
}
-(void)changeLocation:(CGPoint)location
{
//some logic to change my location
...
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIF_AGENT_LOCATION_DID_CHANGE object:self];
}