检测sprite工具包中的碰撞

时间:2013-12-13 17:19:25

标签: ios objective-c sprite-kit collision

我正在尝试用精灵套件制作一个简单的游戏。 基本的想法是有一个玩家可以跳跃以避免阻挡。 但我有一个问题我不知道怎么做,当玩家击中阻止时,玩家消失并且血液动画开始。 首先,我不明白我在苹果网站上找到的代码是什么。

static const uint32_t blockCategory = 0x1 <<0;
static const uint32_t  playerCategory = 0x1 <<1;

我正在调用didBeginContact函数并在其中放入一个NSLOG(“确实调用函数”)。 但我从未在调试器中收到输出。

这是我的_player和_block代码:      - (SKSpriteNode *)字符{

_player = [SKSpriteNode spriteNodeWithImageNamed:@"soldier_run1"];
_player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_player.size.width /2 -5];
_player.physicsBody.dynamic = YES;
_player.physicsBody.usesPreciseCollisionDetection = YES;
_player.physicsBody.friction = 0;
_player.physicsBody.categoryBitMask = playerCategory;
_player.physicsBody.collisionBitMask = blokCategory;
_player.name = @"player";
SKAction *animAction = [SKAction animateWithTextures:playerTextures timePerFrame:0.1      resize:YES restore:YES];

我的_player代码:

[_player runAction:[SKAction repeatActionForever:animAction]];

return _player;
}
-(SKSpriteNode *)block {
_blok = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor] size:CGSizeMake(15, 40)];

//physics
_blok.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_blok.size];
_blok.physicsBody.dynamic = NO;
_blok.name = @"block";
_blok.physicsBody.categoryBitMask = blokCategory;
_blok.physicsBody.collisionBitMask = playerCategory;
SKAction *moveBlock = [SKAction sequence:@[
                                          [SKAction moveToX:-20 duration:2] ]];
[_blok runAction:moveBlock ];
return _blok;
}

另外,我真的不明白categoryBitMask和collisionBitMask的作用。 在我工作之后我想让角色从屏幕和血液动画中消失开始,但我不知道如何让这种情况发生。我想你必须这样做:        if(_player&amp;&amp; _block didcollide){        } 但我不知道该怎么做。

2 个答案:

答案 0 :(得分:22)

categoryBitMask设置精灵所属的类别,而collisionBitMask设置精灵可以与之碰撞的类别,而不是传递它们。

对于碰撞检测,您需要设置contactTestBitMask。在这里,您可以设置要在联系时调用联系人委托的精灵类别。

你已经做的是正确的。以下是您需要做的一些补充:

_player.physicsBody.contactTestBitMask = blockCategory;
_blok.physicsBody.contactTestBitMask = playerCategory;

然后,按如下方式实施联系代表:

-(void)didBeginContact:(SKPhysicsContact *)contact`
{
NSLog(@"contact detected");

SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
    firstBody = contact.bodyA;
    secondBody = contact.bodyB;
}
else
{
    firstBody = contact.bodyB;
    secondBody = contact.bodyA;
}

//Your first body is the block, secondbody is the player.
//Implement relevant code here.

}

有关实施碰撞检测的详细说明,请查看this教程。

答案 1 :(得分:6)

处理碰撞有点乱。 :)有很多方法,但你应该从一开始就是this来自Apple的相当简单的例子。自述文件提供了一个很好的介绍,然后你可以开始探索代码。

另一种方法(Apple在他们的指南中提到)是使用Double Dispatching(请参阅维基百科以获取详细信息)。然而,我不会试图直接尝试这种方法。这是一种有点高级的方法,因为它依赖于动态选择器和类似技术来实现魔术。然而,即使有了这个警告,你也可以找到一个简单的例子,一个人如何做到这一点,以及许多支持性描述here