2015-09-26 99 views
0

我想檢測一個正方形SkShapeNode和一個圓圈SkShapeNode之間的碰撞。它基本上可以工作,但似乎hitbox /物理實體並不真正與節點形狀對齊。它似乎是隨機的10-20分。與SKShapeNode(SpriteKit)奇怪的碰撞檢測

這是我的代碼:

SKShapeNode* circle= [SKShapeNode shapeNodeWithCircleOfRadius:7.0]; 
circle.physicsBody= [SKPhysicsBody bodyWithCircleOfRadius:7.0]; 
circle.physicsBody.usesPreciseCollisionDetection= YES; 
circle.physicsBody.categoryBitMask= catCircle; 
circle.physicsBody.contactTestBitMask= catSquare; 

circle.position= CGPointMake(x, y); 
[self addChild:circle]; 

SKShapeNode* square= [SKShapeNode shapeNodeWithRect:rect]; 
square.position= position; 
square.physicsBody= [SKPhysicsBody bodyWithRectangleOfSize:rect.size]; 
square.physicsBody.categoryBitMask= catSquare; 
square.physicsBody.contactTestBitMask= catCircle; 
square.physicsBody.dynamic= YES; 
square.physicsBody.usesPreciseCollisionDetection= YES; 

[self addChild:square]; 

我通過移動正方形形狀(圓形保持位置)觸發碰撞:

[square runAction:[SKAction moveTo:somePoint duration:2]]; 

我在didBeginContact通過removeAllActions取消行動一旦檢測到碰撞。

這是它的樣子:

enter image description here

正如你可以看到,廣場上確實停止一旦倒是圈,但在此之前/之後的幾個問題。

我在做什麼錯?

回答

0

我不確定CD如何與IOS一起工作,但這可能是正常行爲,通常在碰撞檢測時發現碰撞發生時,您的對象將位於另一個對象內,如上所示。一旦發生碰撞,您需要將對象移回框架,直到碰撞未發生。

您可以通過每次存儲前一幀的位置並在發生碰撞時將對象設回原來的位置來完成此操作。

+0

其實,這不是問題。例如,正如你在上面看到的那樣,在觸及圓圈之前(上方廣場),擊球也會發生,並且廣場停止。 然後,我想要做的是用方塊「拍」圓,但在某些情況下,方塊在視覺上擊中圓圈,但只是通過它而沒有碰撞檢測。 – user826955

+0

所以我認爲這取決於你接近圓的地方,你會得到不同的行爲,就好像圓圈的邊界不是以它自己的對象爲中心,或者更可能是廣場不是中心。這可能指向你如何更新方塊的位置 – Rob85

+0

我同意,它看起來像物理體* *不*代表節點形狀。但是,我似乎無法在節點或物理主體類中找到適當的方法來調整它。 另外,我發現的碰撞檢測教程都沒有做任何事情,除了我所做的。 – user826955

0

我有完全相同的問題(Xcode 7,iOS 9),但在我的情況下,問題似乎只隔離到模擬器。當我在設備上運行相同的代碼時,它按預期工作。

UPDATE

看來,我是遇到的問題是從你的不同。但是,我明白了爲什麼你正在經歷物理學中的偏移。爲了更好地瞭解在你的代碼,添加以下行(最好是在視圖控制器某處):

skView.showsPhysics = YES; 

上面的代碼會顯示你的物理身體的輪廓,這是你會看到(藍色輪廓代表着物理學)。

enter image description here

您選擇來實例方類方法是造成這種副作用,即:

SKShapeNode* square= [SKShapeNode shapeNodeWithRect:rect]; 

創建一個具有矩形路徑的形狀節點。(根據蘋果的文檔)

參數 矩形
矩形,相對節點原點

而是使用這種方法來創建你的平方和的東西會像預期的那樣:

SKShapeNode* square= [SKShapeNode shapeNodeWithRectOfSize:rect.size]; 

創建一個帶有矩形pa的形狀節點以節點的原點爲中心。

如果你仍然想用:

 SKShapeNode* square= [SKShapeNode shapeNodeWithRect:rect]; 

,那麼你就必須確保你設置「矩形」根據以下幾點:

rect = CGRectMake(-someWidth/2, -someHeight/2, someWidth, someHeight) 

以上將確保該物理體與該形狀節點的路徑對齊。

對於理解爲什麼會這樣......當您使用的方形節點:

SKShapeNode *平方= [SKShapeNode shapeNodeWithRect:RECT]。

如果RECT = CGRectMake(50.0,50.0,100.0,100.0),那麼要創建一個SKShapeNode並給予它的矩形形狀,其具有定位在點(50.0,50.0)其左下角,相對到SKShapeNode。

當使用以後創建physicsBody:

square.physicsBody= [SKPhysicsBody bodyWithRectangleOfSize:rect.size]; 

的physicsBody的位置是由相對於默認設置爲它的節點的原點(SKShapeNode)和NOT的形狀(這是一個CGPathRef)。我知道這聽起來有點令人困惑,但我希望它能說明一些問題。

節點的位置是相對於其父節點(在你的情況下,它是場景),而屬於SKShapeNode的形狀的位置是相對於其節點。通過實例化您的方形節點使用:

SKShapeNode* square= [SKShapeNode shapeNodeWithRectOfSize:rect.size] 

您確保您的形狀與您的節點排成一列。

+0

不幸的是,在設備上的行爲是完全一樣的:( 你可以給你一些最基本的代碼示例,你怎麼做? – user826955