2014-06-28 115 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