检测Sprite是否在Rect中?

时间:2014-06-28 10:21:38

标签: sprite-kit

我有一座塔和一个怪物。塔的周围有一个SkShapeNode,作为它的范围。我想检查怪物是否仍然在塔的范围内(即在skshape节点内)每一帧。

我有这种方法,我认为检查塔的范围内是否还有任何东西:

-(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方法中的枚举体有关,但我不确定。

提前致谢

2 个答案:

答案 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循环中以检查多个敌人。

相关问题