我正在尝试使用精灵套件制作一个简单的游戏。
基本思想是,有一名玩家可以跳跃以避免阻挡。
但我有一个问题,我不知道如何做到当玩家击中方块时玩家消失并且血液动画开始。
首先,我不明白我在苹果网站上找到的这段代码的作用。
static const uint32_t blockCategory = 0x1 <<0;
static const uint32_t playerCategory = 0x1 <<1;
比我调用 didBeginContact 函数并在其中放入 NSLOG("did call function") 。
但我从未在调试器中收到输出。
这是我的 _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 && _block 发生碰撞) {
}
但我不知道具体该怎么做。
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教程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)