我正在尝试检测两个精灵之间的碰撞,但是我无法用子精灵来做这件事。
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)
我可以检测到与主体的碰撞。如何对另一个精灵的孩子进行碰撞检测?
答案 0 :(得分:2)
子节点的position
和frame
属性与parent
相关,您需要在代码中考虑这些属性。
SKNode
有两种方法可以帮助您将给定position
的{{1}}转换为另一个节点的坐标空间:
SKNode
您可以使用它们将convertPoint:fromNode:
convertPoint:toNode:
的{{1}}属性转换为另一个坐标空间。你想要做的是将SKNode
的位置转换为敌人的坐标空间,反之亦然,然后使用临时的position
和_object
检查新的位置。< / p>
以下是一个例子:
CGRect
此代码假设您的敌人和您的玩家处于相同的坐标空间。 (拥有相同的父母)
答案 1 :(得分:1)
这是因为_object
是self.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