2014-03-31 68 views
0

這是我試圖完成的:SpriteKit在檢測到觸點開始後檢測觸點的末端

場景中的兩個sprite節點,self是邊緣循環。

如果nodeA觸及nobeB,並停止。 >>贏

如果nodeA觸及自我。 >>丟失

如果nodeA觸及nobeB但沒有停止觸及自己。 >>失去

所以我需要的東西是這樣的:

typedef NS_OPTIONS(aero, SpriteNodeCategory) 
{ 
    SpriteNodeCategoryA = 1 << 0, 
    SpriteNodeCategoryB = 1 << 1, 
}; 

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    aero collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 
    if (collision == (SpriteNodeCategoryA|SpriteNodeCategoryB)) { 
     //something here I don't know... 
    } 
    if (collision == (SpriteNodeCategoryA|SpriteNodeCategoryB)) { 
     NSLog(@"FAIL"); 
    } 
} 

回答

1

好了,所以這是會有點困難。

,你可以使用「didSimulatePhysics」讓你的模擬更新

-(void)didSimulatePhysics 
{ 
    if (_yourNode.physicsBody.angularVelocity == 0 && newGame) { 
     if (_yourNode.userData[@"winningCondition"]) { 
      [self win]; 
     }; 
    } 
} 

這樣做是這次更新的,看看你是否有中獎條件首先 - 這是從碰撞得到(認爲:逆向工程)

PS _yourNode.physicsBody.angularVelocity == 0意味着您的節點是完全靜止

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 
    if (collision == (CNPhysicsCategoryNodeA|CNPhysicsCategoryNodeB)) { 
     _yourNode.userData = [@{@"winningCondition":@(YES)} mutableCopy]; 
    } 
    if (collision == (CNPhysicsCategoryNodeA|CNPhysicsCategoryEdge)) { 
     [self lose]; 
    } 
} 

-(void)didEndContact:(SKPhysicsContact *)contact 
{ 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 
    if (collision == (CNPhysicsCategoryNodeA|CNPhysicsCategoryNodeB)) { 
     _yourNode.userData = [@{@"winningCondition":@(NO)} mutableCopy]; 
    } 
} 

所以基本上,當A觸及B,它可以讓你通過添加「用戶數據」到你節點的中獎條件。

其餘的很簡單。我想你明白了。

2

你有另一種方法委託(SKPhysicsContactDelegate),這你問的是工作:

- (void)didEndContact:(SKPhysicsContact *)contact 
+0

你如何把它放入 - (void)didBeginContact:方法? –

+0

您不會將其放入didBeginContact :,您需要添加兩個方法:didBeginContact:在聯繫人開始時處理操作,didEndContact:在聯繫人結束時處理操作。 – Greg

+0

對,我如何將if語句傳遞給didEndContact? –