2014-02-13 5 views
2

У меня есть два Sprite Узлов:Sprite Kit - Detect контакт

-(void)createPlayer { 
    SKSpriteNode *player = [SKSpriteNode node]; 

    player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemy.size]; 
    player.physicsBody.categoryBitMask = playerCategory; 
    player.physicsBody.contactTestBitMask = enemyCategory; 

    player.position = CGPointMake(100, 160); 
    player.name = @"player"; 
    player.zPosition = 100; 

    [self addChild:player]; 
} 

-(void)createEnemy { 
    SKSpriteNode *enemy = [SKSpriteNode node]; 

    enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemy.size]; 
    enemy.physicsBody.categoryBitMask = enemyCategory; 
    enemy.physicsBody.contactTestBitMask = playerCategory; 

    enemy.position = CGPointMake(300, 160); 
    enemy.name = @"player"; 
    enemy.zPosition = 100; 

    [self addChild:enemy]; 
} 

И следующее MyScene.h

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

Как я могу определить, если они делают контакт, так что я могу добавить действие в результате их контакта?

+0

И в чем проблема? Где у вас есть трудности? –

+0

Как я уже говорил в сообщении выше. Как определить, если они вступают в контакт, поэтому я могу добавить действие в результате их контакта? Итак, если игрок вступает в контакт с врагом, сделайте все возможное. – user2255273

+1

назначьте делегата-контакта на свой SKPhysicsWorld https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsWorld_Ref/Introduction/Introduction.html#//apple_ref/occ/instp/SKPhysicsWorld/contactDelegate затем прослушивать сообщения делегатов-партнеров: https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsContactDelegate_Ref/Reference/Reference.html#//apple_ref/occ/intf/SKPhysicsContactDelegate – LearnCocos2D

ответ

8

Способы делегирования обнаружения конфликтов.

в вашем MyScene.h ваш код должен выглядеть следующим образом:

@interface MyScene : SKScene <SKPhysicsContactDelegate> 

В вашем MyScene.m добавить это внутри initWithSize:

self.physicsWorld.contactDelegate = self; 

Теперь вам нужно для осуществления делегированного метода сделалBeginContact:

- (void)didBeginContact:(SKPhysicsContact *)contact { 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (collision == (playerCategory | enemyCategory)) { 
     // Do your stuff 
    } 
} 
+0

Я получаю сообщение об ошибке self.physicsWorld.contactDelegate = YES; И когда я меняю ДА на себя. Объект игрока выталкивает противника из экрана. Так что это столкновение вместо простого контакта, я полагаю. – user2255273

+0

моей ошибкой для исправления синтаксиса является контактDelegate = self, если вы не хотите, чтобы столбец устанавливал значение physicalBody.collisionBitMask равным 0, и если вам нужно, вы можете изменить метод делегирования на didEndContact –

+0

Это работает! Спасибо огромное! Все, с чем я все еще борюсь, - это правильный размер физического тела для узла спрайта. Но я это выясню. Еще раз спасибо! – user2255273