我有这种方法,我认为检查塔的范围内是否还有任何东西:
-(void)update
{
[self.currentScene.physicsWorld enumerateBodiesInRect:self.towerRangeNode.frame usingBlock:^(SKPhysicsBody *body, BOOL *stop) {
if (body == nil) {
[self lostSightOfMonster];
}
}];
}
但是,[self lostSightOfMonster]方法永远不会运行。
为了进一步理解,我在场景的更新方法中调用了这个方法:
[self enumerateChildNodesWithName:@"Tower" usingBlock:^(SKNode *node, BOOL *stop) {
Tower *tower = (Tower *) node;
[tower update];
if (tower.hasChosenEnemy) {
[tower updateRotation];
}
}];
}
我怀疑它与rect方法中的枚举体有关,但我不确定。
提前致谢
答案 0 :(得分:0)
使用此代码检查2个节点的帧交叉:
if(CGRectIntersectsRect(towerNode.frame, enemyNode.frame))
{
// do your thing
}
如果您有多个塔和一个敌人,您将使用此代码:
for(SKNode *towerNode in towerNodeArray)
{
for(SKNode *enemyNode in enemyNodeArray)
{
if(CGRectIntersectsRect(towerNode.frame, enemyNode.frame))
{
// do your thing
}
}
}
以上假设您正在使用塔的物理主体来检查范围。或者,您也可以使用一些简单的x和y坐标检查:
if(((towerNode.position.y <= enemyNode.position.y+100) && (towerNode.position.y >= enemyNode.position.y-100)) &&
((towerNode.position.x <= enemyNode.position.x+100) && (towerNode.position.x > enemyNode.position.x+100)))
{
// do your thing
}
答案 1 :(得分:0)
我建议采用不同的方法。我不会检查它是否与精灵接触,而是使用毕达哥拉斯定理检查它与塔的原点的距离。我认为代码会更简单,并且会有额外的好处,就是不要让范围精灵始终可见。
这里有一些概念代码来表明我的意思:
double distance;
distance = pow(enemySprite.position.x-towerSprite.position.x, 2);
distance += pow(enemySprite.position.y-towerSprite.position.y, 2);
distance = sqrt(distance);
if (distance < towerRange) {
//shoot at ememy
}
您可以假设将其置于for循环中以检查多个敌人。