任何簡單的方法來測試一個SKPhysicsBody 是否完全包含另一個?SKPhysicsBody遏制測試?
類似bodyA
包含bodyB
的每一點,左右。
只是想在你實現一些2D數學助手之前先問問你如何使用附加的「元」-CGPaths連接到給定節點或其他東西。
任何簡單的方法來測試一個SKPhysicsBody 是否完全包含另一個?SKPhysicsBody遏制測試?
類似bodyA
包含bodyB
的每一點,左右。
只是想在你實現一些2D數學助手之前先問問你如何使用附加的「元」-CGPaths連接到給定節點或其他東西。
爲此做了一個分類。
BOOL putInto = [bodyA containsBody:bodyB];
獲取類別SKPhysicsBody+Containment from GitHub
,現在僅適用於道路路徑的遏制,要完成它,很快爲界也是如此。
該解決方案有兩個。
第一部分是CGPath
作品。你會得到CGPathRef
代表bodyA
轉換後的狀態,然後迭代bodyB
的每個點,並測試是否包含。這適用於路徑路徑類型測試,但不適用於圓圈,甚至不適用於圓形路徑。
第二部分是將其包裝到SKPhysicsBody
類別中,以封裝所有的實現細節。這是令人驚訝的暫停。
當您從SKPhysicsBody
類請求SKPhysicsBody
實例時,您會期望返回一個SKPhysicsBody
對象。根據蘋果公司的一些設計決定,它會向你吐出一個PKPhysicsBody
實例(內部的PhysicsKit的一部分),這當然不會有你爲SKPhysicsBody
所做的類別提供實例方法。擴展該類只能通過方法/屬性調整來實現,所以這個問題會對這個遏制類別加以重視。
有沒有簡單的方法,但有一些你可能會覺得有用。如果你的身體是矩形,並配合他們的節點的框架,這可能是值得一試:
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。
我知道這個主題是超級老,但它是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");
}
}`
您可能會考慮對此[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
聯絡代表將讓你知道兩個物體是否接觸。您可以讓兩個主體通過類別等位掩碼生成接觸事件,而不會產生碰撞反饋。 – LearnCocos2D
的確如此,但我想知道一個**是否完全包含另一個**。必須有一個我不知道的數學術語。 bodyA包含bodyB的每個點,你知道的。 – Geri
測試兩個矩形或兩個圓形容器是很簡單的,但是任何其他形狀或其組合都不是微不足道的 - 您要尋找哪一種形狀,即您使用哪種形狀? – LearnCocos2D