SpriteKit在检测到接触开始后检测到接触结束

时间:2014-03-31 07:08:20

标签: objective-c xcode sprite-kit

这是我试图完成的事情:

场景中有两个精灵节点,而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");
    }
}

2 个答案:

答案 0 :(得分:2)

你有另一个方法委托(SKPhysicsContactDelegate)来完成你所要求的工作:

- (void)didEndContact:(SKPhysicsContact *)contact

答案 1 :(得分:1)

好的,这将有点困难。

首先,您可以使用“didSimulatePhysics”来更新模拟

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

这就是它更新并查看你是否有获胜条件 - 这是从碰撞中获得的(想想:逆向工程)

P.S。 _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时,它通过向你的节点添加“userData”来为你提供胜利条件。

其余的很直接。我想你明白了。