2014-06-28 78 views
0

我有一座塔和一个怪物。该塔周围有一个SkShapeNode,充当其范围。而且我想检查一下怪物是否仍然在塔的范围内(即在skshape节点内)。检测Sprites是否正确?

我有这个方法,我想检查是否有什么仍然是塔范围之内:

-(void)update 
{ 
    [self.currentScene.physicsWorld enumerateBodiesInRect:self.towerRangeNode.frame usingBlock:^(SKPhysicsBody *body, BOOL *stop) { 
    if (body == nil) { 
     [self lostSightOfMonster]; 
    } 
}]; 

}

然而,[自lostSightOfMonster]方法不会运行。

更多的了解,我称之为场景的更新方法,这个方法:

[self enumerateChildNodesWithName:@"Tower" usingBlock:^(SKNode *node, BOOL *stop) { 
    Tower *tower = (Tower *) node; 
    [tower update]; 

    if (tower.hasChosenEnemy) { 
     [tower updateRotation]; 
    } 
}]; 

}

我怀疑它是与在矩形法列举的身体,但我不当然。

在此先感谢

回答

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循环来检查多个敌人为好。

+0

感谢您的回答,@JDodle – user3785077

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 
     } 
+0

哪一个我应该做的检测,如果它在一个SkShapeNode rect? – user3785077

+0

@ user3785077 - Rect是帧,所以使用第一或第二。 – sangony