2014-08-25 2 views
0

У меня есть простая игра для прыжков, где герой прыгает через мяч, катящийся к нему.SpriteKit только обнаруживает частичное столкновение по физическому телу

нет установки силы тяжести на сцене

героя прыгать прямо вверх, а затем вниз. если герой остается в состоянии «didBeginContact», и я могу обнаружить столкновение. Если фронт героя попадает в катящийся мяч, когда он вскакивает или спускается, «didBeginContact» уволен. Однако, если задняя половина героя приземляется на мяч, когда он идет под ним, он не обнаруживает столкновения.

Кто-нибудь есть идеи, почему он только ловит столкновение спереди? Это больше похоже на обнаружение границ и обнаружение объектов! это возможно?

collision error

static const uint32_t groundCategory = 0x1 << 1; 
static const uint32_t obstacleCategory = 0x1 << 2; 
static const uint32_t heroCategory  = 0x1 << 3; 


SKSpriteNode *hero = [[SKSpriteNode alloc] initWithColor:[SKColor redColor] size:CGSizeMake(100, 115)]; 

[hero setPosition:CGPointMake(HERO_UP_POSITION_X, HEIGHT_GAME/2 + hero.size.height/2 + 10)]; 

hero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hero.size]; 
[hero.physicsBody setAffectedByGravity:NO]; 
hero.physicsBody.usesPreciseCollisionDetection = YES; 
hero.physicsBody.allowsRotation = NO; 
hero.physicsBody.categoryBitMask = heroCategory; 
hero.physicsBody.contactTestBitMask = obstacleCategory | groundCategory; 
hero.physicsBody.collisionBitMask = 0; 
hero.zPosition = 0; 
hero.name = kHeroUpName; 
[self addChild:hero]; 





obstacle = [[SKSpriteNode alloc] initWithImageNamed:kImgObstacleDown]; 
obstacle.name = @"obstacle"; 
[obstacle setPosition:CGPointMake(WIDTH_GAME + x, HEIGHT_GAME/2 + y)]; 
obstacle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:obstacle.size.width/2]; 
obstacle.physicsBody.usesPreciseCollisionDetection = YES; 
[obstacle.physicsBody setAffectedByGravity:NO]; 
obstacle.physicsBody.categoryBitMask = obstacleCategory; 
obstacle.physicsBody.contactTestBitMask = heroCategory; 
obstacle.physicsBody.collisionBitMask = 0; 
obstacle.zPosition = 1; 

ответ

0

Есть два тестовых примеров, что должно быть в вашем didBeginContact: 1) если contact.bodyA герой и contact.bodyB является препятствием и 2) если contact.bodyA является препятствие и контакт.bodyB является героем. Вероятно, вы работаете только с одним случаем. Вот пример того, как это сделать:

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    if ((contact.bodyA.categoryBitMask == heroCategory && contact.bodyB.categoryBitMask obstacleCategory) 
      || (contact.bodyA.categoryBitMask == obstacleCategory && contact.bodyB.categoryBitMask == heroCategory)) { 

     // Do something here 
    } 
} 
+0

спасибо, я ценю вас помочь, но у меня есть что. // прикосновение для героя вверх если ([objectAName isEqualToString: kHeroUpName] || [objectBName isEqualToString: kHeroUpName]) { // другой объект наш герой вверх прикоснулся SKPhysicsBody * другой = (contact.bodyA. categoryBitMask == heroCategory? contact.bodyB: contact.bodyA); if ([other.node.name isEqualToString: @ "препятствие"]) { –

+0

У меня есть точка останова сразу внутри doBeginContact и она никогда не попадает в третий сценарий –

1

Я понял, проблема.

Я проверял, прошел ли объект мимо героя, чтобы отследить зачет, если он прошел мимо центра героя, я переименовал его, чтобы он не получил проверку и снова забил.

Спасибо @ 0x141E ваш сниппет заставил меня понять, что я проверял имена inDidBeginContact (который не удается) против проверки categoryBitMask

Смежные вопросы