2016-02-29 21 views
1

我一直在開發,將有工作得很好,如果精靈套件沒有這個打我的跟蹤算法......尋路隨着SKNode不工作

我試圖確定CGPoint是否位於內在我的場景中給定SKNodeSKPhysicsBody。我遇到的問題是我似乎無法讓SpriteKit準確地告訴我,物理體是否確實包含了這一點。

下面是可能包含點的機構之一的樣本,以及如何正在測試,看看它:

 SKSpriteNode *innerMap1 = [SKSpriteNode spriteNodeWithImageNamed:@"test"]; 
     // FYI - "test" is exactly 363x452. Did that to make sure scaling was not an issue 
     innerMap1.physicsBody = [SKPhysicsBody bodyWithTexture:[SKTexture textureWithImageNamed:@"test"] size:CGSizeMake(363, 452)]; 
     innerMap1.position = CGPointMake(200, 100); 
     innerMap1.physicsBody.dynamic = NO; 
     innerMap1.name = @"testNode"; 

然後我嘗試兩種不同的方式,看看是否節點包含以下點:

方法1

CGPoint controlPoint = CGPointMake(<xf>, <yf>); 
    if ([innerMap1 containsPoint:controlPoint]) . . . 

方法2

SKPhysicsBody *body = [self.physicsWorld bodyAtPoint:controlPoint]; 
    if ([body.node.name isEqualTo:@"testNode"]) . . . 

無論出於何種原因,這兩種方法都沒有幫助。方法1將告訴我該點是否位於節點的框架框內,這違背了從紋理創建獨特節點形狀的目的....方法2出於某種奇怪的原因往往會非常糟糕且不準確。我讀了大約15.5px的超尺度,但我得到的結果是沒有接近這個最小值。

我也只是手動創建一個CGMutablePathRef並使用以下命令:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 

    if (CGPathContainsPoint(pathRef, nil, touchLocation, NO)) { 
     // If we are here it means user did touche physic body. 
    } 
} 

但同樣,我想這不要求獨立路徑邊界建立自定義形狀。

SO,我的問題是我做錯了什麼?我很確定,方法2本來是最好的解決方案,或者至少是工作,但我似乎無法理解爲什麼它行爲如此奇怪。也許我錯過了一些解決我的問題的方法之一。我希望有一種方法可以返回BOOL積分在SKTexture內,但當然沒有。這就是爲什麼使用物理機構應該是關鍵 - 因爲它代表了確切的圖像尺寸和點。任何建議將不勝感激。謝謝!

+0

也許嘗試物理身體youre設法檢測中創建一個1px的物理身體。然後嘗試將它向每個方向移動一個像素,並查看是否檢測到任何碰撞。 – hamobi

+0

我可以嘗試,我猜 - 這可能工作。我想通過這個問題是什麼,如果你可以請看看這裏http://stackoverflow.com/questions/35705597/prevent-location-offset-with-spritekit-camera-node –

+0

很難讓我跟隨正在發生的事情。我已經完成了gameplaykit尋路,但只有當它是一個網格地圖。沒有用物理對象完成它。對不起 – hamobi

回答

1

很多時候我發現CGPathContainsPoint輸出有奇怪的問題。 所以,我決定寫這個解決方法:

P.S. (該解決方案在斯威夫特2.X工作)

let path: UIBezierPath = UIBezierPath.init(CGPath: myPath) 
let copyPath = CGPathCreateCopyByStrokingPath(myPath, nil, path.lineWidth, path.lineCapStyle, path.lineJoinStyle, path.miterLimit) 
if CGPathContainsPoint(copyPath, nil, myPoint, false) { 
    // ok path contain this point 
} 
+1

我喜歡這個。我已經找到了一個圍繞自己的工作,但這很有趣。感謝幫助隊友! –