2014-02-19 91 views
0

任何簡單的方法來測試一個SKPhysicsBody 是否完全包含另一個SKPhysicsBody遏制測試?

類似bodyA包含bodyB的每一點,左右。

只是想在你實現一些2D數學助手之前先問問你如何使用附加的「元」-CGPaths連接到給定節點或其他東西。

+0

聯絡代表將讓你知道兩個物體是否接觸。您可以讓兩個主體通過類別等位掩碼生成接觸事件,而不會產生碰撞反饋。 – LearnCocos2D

+0

的確如此,但我想知道一個**是否完全包含另一個**。必須有一個我不知道的數學術語。 bodyA包含bodyB的每個點,你知道的。 – Geri

+0

測試兩個矩形或兩個圓形容器是很簡單的,但是任何其他形狀或其組合都不是微不足道的 - 您要尋找哪一種形狀,即您使用哪種形狀? – LearnCocos2D

回答

0

爲此做了一個分類。

BOOL putInto = [bodyA containsBody:bodyB]; 

獲取類別SKPhysicsBody+Containment from GitHub,現在僅適用於道路路徑的遏制,要完成它,很快爲界也是如此。

該解決方案有兩個。

第一部分是CGPath作品。你會得到CGPathRef代表bodyA轉換後的狀態,然後迭代bodyB的每個點,並測試是否包含。這適用於路徑路徑類型測試,但不適用於圓圈,甚至不適用於圓形路徑。

第二部分是將其包裝到SKPhysicsBody類別中,以封裝所有的實現細節。這是令人驚訝的暫停。

當您從SKPhysicsBody類請求SKPhysicsBody實例時,您會期望返回一個SKPhysicsBody對象。根據蘋果公司的一些設計決定,它會向你吐出一個PKPhysicsBody實例(內部的PhysicsKit的一部分),這當然不會有你爲SKPhysicsBody所做的類別提供實例方法。擴展該類只能通過方法/屬性調整來實現,所以這個問題會對這個遏制類別加以重視。

1

有沒有簡單的方法,但有一些你可能會覺得有用。如果你的身體是矩形,並配合他們的節點的框架,這可能是值得一試:

BOOL isContained = CGRectContainsRect(bodyA.node.frame, bodyB.node.frame); // bodyA is the container, bodyB is examined for being contained 

如果你的身體是具有完全任意路徑創建的多邊形,然後找到它們的包容將是一項複雜的任務。這是一個很長的一步,但是你可以使用上述方法和CGPathGetBoundingBox結合起來得到一些初步的近似值 - 這將返回矩形圍繞你的多邊形,然後你可以檢查重疊(根據需要使用CGRectInset)。

還有一個接近的SKPhysicsWorld方法:-(SKPhysicsBody *)bodyInRect:(CGRect)rect,但它只返回與矩形相交的SKPhysicsBody。

+0

對於這個水平邊界框是相當不準確的,我真的只能約這些。 – Geri

+0

我將爲每個正文創建元路徑描述,需要進行旋轉,並在包含該路徑時檢查每個點。我只是想簡單地做。 – Geri

1

我知道這個主題是超級老,但它是2017年,我正在尋找答案,並最終找到我自己的修補程序與我的代碼。希望這可以幫助別人!它適用於圓形和橢圓形。

-(void)didBeginContact:(SKPhysicsContact *)contact { 

// get the path of the physics body (contact bodyA) 
CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(contact.bodyA.node.position.x - contact.bodyA.node.frame.size.width/2, contact.bodyA.node.position.y - contact.bodyA.node.frame.size.height/2, contact.bodyA.node.frame.size.width, contact.bodyA.node.frame.size.height), nil); 

// check if that path contains the physics body point of BodyB 
if (CGPathContainsPoint(path, NULL, contact.bodyB.node.position, FALSE)) { 

    NSLog(@"CONTAINS POINT player body B"); 

} 

}`

+0

您可能會考慮對此[SKPhysicsBody + Containment](https://github.com/eppz/iOS.Labs.physicsBody)類別做出貢獻。您可以擴展此[containsBody:](https://github.com/eppz/iOS.Labs.physicsBody/blob/master/PhysicsBody/SKPhysicsBody%2BContainment.m#L206)方法。 – Geri