2013-12-13 12 views
12

Sto provando a creare un gioco semplice con il kit sprite. L'idea di base è che c'è un giocatore che può saltare per evitare i blocchi. Ma ho un problema, non so come farlo quando il giocatore colpisce il blocco il giocatore scompare e inizia l'animazione del sangue. Prima di tutto non capisco cosa faccia questo codice che ho trovato sul sito di mele.Rilevamento di collisioni nel kit sprite

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

di me chiamando la funzione didBeginContact e mettere un NSLog ("chiamata di funzione ha fatto") in esso. Ma non ho mai ricevuto l'output nel mio debugger.

Ecco il mio _player e _block codice: - (SKSpriteNode *) carattere {

_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]; 

Il mio codice _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; 
} 

Anche io non capisco quello che il categoryBitMask e collisionBitMask fare. Dopo aver lavorato, vorrei far sparire il personaggio dallo schermo e avviare l'animazione del sangue, ma non ho idea di come farlo accadere. Penso che devi fare qualcosa come: if (_player & & _block didcollide) { } Ma non so come farlo esattamente.

+0

Vedere questa risposta http://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

risposta

18

La categoriaBitMask imposta la categoria a cui appartiene lo sprite, mentre collisionBitMask imposta la categoria con cui lo sprite può scontrarsi e non passarlo.

Per il rilevamento delle collisioni, è necessario impostare contactTestBitMask. Qui, impostate le categorie di sprite con le quali volete che i delegati di contatto siano chiamati al contatto.

Quello che hai già fatto è corretto. Qui ci sono alcune aggiunte che devi fare:

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

Successivamente, implementare il delegato di contatto come segue:

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

} 

Per una buona spiegazione per l'attuazione rilevamento delle collisioni, guarda this tutorial.

4

La gestione delle collisioni è un po 'caotica. :) Ci sono diversi approcci, ma un posto da cui iniziare è this un esempio abbastanza semplice di Apple. Il readme fornisce una buona introduzione e quindi puoi iniziare a dare un'occhiata al codice.

Un altro approccio (che Apple menziona nella loro guida) consiste nell'utilizzare il doppio dispacciamento (vedere wikipedia per una lunga descrizione). Non inizierei comunque cercando di aggirare questo approccio. È un approccio piuttosto avanzato dato che dipende da selettori dinamici e tecniche simili per consentire alla magia di avere luogo. Tuttavia, anche con questo avvertimento, puoi trovare un semplice esempio di qualcuno messo insieme su come farlo, insieme a molte descrizioni di supporto here.