检测sprite套件中的冲突
我试图用sprite套件做一个简单的游戏。 基本的想法是,有一个玩家可以跳跃,以避免块。 但是我有一个问题,我不知道怎么做,当玩家击中区块,玩家消失,血液animation开始。 首先,我不明白这个代码是在苹果网站上find的。
static const uint32_t blockCategory = 0x1 <<0; static const uint32_t playerCategory = 0x1 <<1;
比我打电话didBeginContact函数,并把一个NSLOG(“没有调用函数”)。 但是我从来没有收到我的debugging器的输出。
这是我的_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做的。 我有这个工作后,我想使angular色从屏幕上消失,血液animation开始,但我不知道如何让这种情况发生。 我认为你必须这样做:if(_player && _block didcollide){}但我不知道如何去做。
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. }
有关实现碰撞检测的一个很好的解释,请看本教程。
处理碰撞有点麻烦。 :)有很多方法,但是你应该从一个地方开始,就是苹果这个相当简单的例子。 自述文件提供了一个很好的介绍,然后您可以开始编写代码。
另一种方法(苹果在他们的指南中提到)是使用Double Dispatching(请参阅维基百科,了解更多信息)。 然而,我不会试图直接采取这种做法。 这是一个有点高级的方法,因为它取决于dynamicselect器和类似的技术,使魔法发生。 然而,即使有这样的警告,你可以find一个简单的例子,有人把它放在一起,如何做到这一点,以及在这里大量的支持描述。