2014-02-19 53 views
4

我想知道爲什麼下面的東西不能正常工作。相交節點---- Objective-C - Swift - iOS - SpriteKit節點

節點繪製之前,我分析瞭如果兩個特定節點交叉使用:

[[self playerSpriteNode] intersectsNode: [self pSKLabelNode]] 

當pSKLabelNode觸摸desiredSpriteNode它的作品完美! (通過返回true或false時,它不相交)

但是,當它「通過」幾個像素遠離SKLabel它仍然相交併返回true。

是否有一些設置建議您修復節點的幀大小,或者您認爲可以解決問題的解決方案?

+0

旋轉的對象之一? –

+0

您可以嘗試繼承SKLabelNode並覆蓋「calculateAccumulatedFrame」方法。 –

回答

3

當我嘗試將靜態節點(位於左側)與具有旋轉(並從右側飛行)的節點相交時,我遇到同樣的問題。我修復它這樣

if ([ninja intersectsNode:node] && 
    CGRectGetMinX(node.frame) <= CGRectGetMaxX(ninja.frame) && 
    CGRectGetMaxX(node.frame) >= CGRectGetMinX(ninja.frame)) 
{ 
    //and here I have intersects 
} 

因此,我通過添加額外的參數

1

的intersectNode方法是用於對有很多每秒迭代設備快速運行優化修復它。由於這個原因,它實際上是基於數學「估計」了碰撞,有時在幾個像素的邊緣出現錯誤,特別是當我們談論PNG的方角時。

我也有過這個問題,因爲我用圓圈計算了圓圈之間的距離作爲第二次驗證。

所以,你可以做的是自定義驗證INSIDE intersectsNode,如果情況。假設你處理正方形,你可以驗證交叉節點之後的x或y碰撞。它可能是這樣的:

if([[self playerSpriteNode] intersectsNode: [self pSKLabelNode]]){ 
     if(distance between x1 and x2 < size1.width/2 + size2.width/2 || distance between y1 y2 < size1.height/2 + size2.height/2){ 
      //Your code goes here 
     } 
    } 

請注意,我們比較中央x距離和每個寬度總和的一半。這只是一個適用於廣場和大多數通用小精靈的例子。

我想指出的是,雖然intersectsNode稍微不準確,但爲了快速運行您的遊戲,需要這樣做,因爲每次更新的完美且精確的計算可能對您的設備非常詳盡。 因此,如果您進行自定義驗證,請在intersectsNode返回true之後始終調用它作爲第二次驗證,而不是唯一的驗證。

上面羅馬提供的答案几乎不代表我說的,代碼更短;我只想留下解釋爲什麼。

0

雨燕2.1:

爲了提高成績做你的update(_:)循環檢查,是那裏的東西之前發生在下圖中:

override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 

     if goodDude.intersectsNode(badDude){ 

      print("bad dude v.s. Ninja") 

     }else{ 

      print("not dude at all") 
     } 

    } 
相關問題