2013-12-13 18 views
12

Próbuję zrobić prostą grę z zestawem sprite. Podstawową ideą jest to, że istnieje jeden gracz, który może skakać, aby uniknąć bloków. Ale mam problem Nie wiem jak to zrobić, że gdy gracz trafi blok, odtwarzacz znika i zaczyna się animacja krwi. Przede wszystkim nie rozumiem, co ten kod robi, że znalazłem na stronie internetowej jabłka.Wykrywanie kolizji w sprite kit

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

Następnie wywołuję funkcję didBeginContact i umieszczam w niej NSLOG ("did call function"). Ale nigdy nie otrzymuję danych wyjściowych w moim debugerze.

Oto moja _player i _block Kod: - znak (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]; 

Mój kod _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; 
} 

Także ja naprawdę nie rozumiem co categoryBitMask i collisionBitMask zrobić. Po wykonaniu tego zadania chciałbym, aby postać zniknęła z ekranu i uruchomił animację krwi, ale nie mam pojęcia, jak to zrobić. Myślę, że musisz zrobić coś takiego: jeśli (_player & & _block didcollide) { } Ale nie wiem jak to zrobić dokładnie.

+0

Zobacz tę odpowiedź http://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

Odpowiedz

18

KategoriaBitMask określa kategorię, do której należy duszek, podczas gdy collisionBitMask ustawia kategorię, z którą duszek może się zderzać, a nie przechodzić.

Aby wykryć kolizje, musisz ustawić contactTestBitMask. Tutaj ustawiasz kategorie ikonek, z którymi chcesz kontaktować się z delegatami kontaktów.

To, co już zrobiłeś, jest poprawne. Oto kilka dodatków, które trzeba zrobić:

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

Następnie wdrożyć delegata kontaktów następująco:

-(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. 

} 

Dla dobrego wyjaśnienia w sprawie wprowadzenia wykrywania kolizji, spojrzeć na this tutoriala.

4

Manipulowanie zderzeniami jest trochę nieporządne. :) Istnieje wiele podejść, ale jednym z miejsc, od których powinieneś zacząć, jest prosty przykład z Apple. Plik readme zapewnia dobre intro, a następnie możesz zacząć pisać z kodem.

Innym podejściem (które Apple wspomina w swoim przewodniku) jest użycie podwójnej wysyłki (zobacz wikipedia dla długiego opisu). Nie zacznę od próby odegrania tego podejścia od razu. Jest to nieco zaawansowane podejście, ponieważ zależy od dynamicznych selektorów i podobnych technik umożliwiających magię. Jednak nawet z tym zastrzeżeniem można znaleźć prosty przykład, jak ktoś to zestawił, a także wiele opisów uzupełniających: here.