精灵套件与儿童精灵的碰撞检测

时间:2014-02-19 03:48:13

标签: ios iphone sprite-kit

我正在尝试检测两个精灵之间的碰撞,但是我无法用子精灵来做这件事。

self.player = [[Player alloc] initWithImageNamed:@"player"];
self.player.position = CGPointMake(150, 75);
[self addChild:self.player];

      _object = [SKSpriteNode spriteNodeWithImageNamed:@"object"];
      _object.position = CGPointMake(-40, 27);
       [self.player addChild:_object];

然后我就像这样进行碰撞检测

- (void)checkCollisions {
[self.map enumerateChildNodesWithName:@"enemy"
usingBlock:^(SKNode *node, BOOL *stop){SKSpriteNode *enemy = (SKSpriteNode *)node;
if (CGRectIntersectsRect(enemy.frame, _object.frame)) {
[enemy removeFromParent];
}
}]; }

*这不起作用!!!但如果我使用:

CGRectIntersectsRect(enemy.frame, self.player.frame)  

我可以检测到与主体的碰撞。如何对另一个精灵的孩子进行碰撞检测?

2 个答案:

答案 0 :(得分:2)

子节点的positionframe属性与parent相关,您需要在代码中考虑这些属性。

SKNode有两种方法可以帮助您将给定position的{​​{1}}转换为另一个节点的坐标空间:

SKNode

您可以使用它们将convertPoint:fromNode: convertPoint:toNode: 的{​​{1}}属性转换为另一个坐标空间。你想要做的是将SKNode的位置转换为敌人的坐标空间,反之亦然,然后使用临时的position_object检查新的位置。< / p>

以下是一个例子:

CGRect

此代码假设您的敌人和您的玩家处于相同的坐标空间。 (拥有相同的父母)

答案 1 :(得分:1)

这是因为_objectself.player的子节点,enemy节点是self.map节点的子节点。如果要比较它们的帧,两个节点应该具有相同的父节点。

我建议你使用Sprite Kit的内置碰撞处理机制:

// Object:
_object = [SKSpriteNode spriteNodeWithImageNamed:@"object"];
_object.position = CGPointMake(-40, 27);
_object.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_object.frame.size;
_object.physicsBody.categoryBitMask = OBJECT_CATEGORY;
_object.physicsBody.contactTestBitMask = ENEMY_CATEGORY;
_object.physicsBody.collisionBitMask = 0;
[self.player addChild:_object];

// Enemy:
// init enemy: SKSpriteNode *enemy = [SKSpriteNode spriteNodeWithImageNamed:@"enemy"];
enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemy.frame.size;
enemy.physicsBody.categoryBitMask = ENEMY_CATEGORY;
enemy.physicsBody.contactTestBitMask = OBJECT_CATEGORY;
enemy.physicsBody.collisionBitMask = 0;
// add enemy to the scene: [self addChild:enemy];

// Define that your SKScene conforms to SKPhysicsContactDelegate protocol:
.....
@interface MyScene : SKScene <SKPhysicsContactDelegate>
....


// SKScene.m:
static uint32_t const OBJECT_CATEGORY = 0x1 << 0;
static uint32_t const ENEMY_CATEGORY = 0x1 << 1;

@implementation MyScene

- (id)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
        .......
        self.physicsWorld.contactDelegate = self;
        ........
    }
    return self;
}

.......

- (void)didBeginContact:(SKPhysicsContact *)contact{
    SKPhysicsBody *firstBody, *secondBody;
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }

    if (((firstBody.categoryBitMask & OBJECT_CATEGORY) != 0) &&
             (secondBody.categoryBitMask & ENEMY_CATEGORY) != 0) {
        NSLog(@"Collision detected!");
    }

@end