2013-12-13 7 views
12

Ich versuche ein einfaches Spiel mit Sprite-Kit zu machen. Die Grundidee ist, dass es einen Spieler gibt, der springen kann, um Blöcke zu vermeiden. Aber ich habe ein Problem, ich weiß nicht, wie man es macht, dass, wenn der Spieler den Block trifft, der Spieler verschwindet und die Blutanimation beginnt. Zuerst verstehe ich nicht, was dieser Code tut, den ich auf der Apfelwebsite fand.Erkennen von Kollisionen im Sprite-Kit

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

als ich die didBeginContact Funktion nenne und legte ein NSLog ("did Call-Funktion") darin. Aber ich erhalte nie die Ausgabe in meinem Debugger.

Hier ist meine _player und _block Code: - (SKSpriteNode *) Zeichen {

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

Mein _player Code:

[_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; 
} 

verstehe ich auch nicht wirklich, was die categoryBitMask und collisionBitMask machen. Nachdem ich diese Arbeit habe, möchte ich den Charakter vom Bildschirm verschwinden lassen und die Blutanimation starten, aber ich habe keine Ahnung, wie ich das zulassen soll. Ich denke, du musst etwas tun wie: if (_player & & _block didcollide) { } Aber ich weiß nicht, wie es genau geht.

+0

Siehe diese Antwort http://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

Antwort

18

Die categoryBitMask legt die Kategorie fest, zu der das Sprite gehört, während die collisionBitMask die Kategorie festlegt, mit der das Sprite kollidieren und nicht durch sie hindurchgehen kann.

Für die Kollisionserkennung müssen Sie die contactTestBitMask festlegen. Hier legen Sie die Kategorien von Sprites fest, mit denen die Kontaktdelegaten beim Kontakt aufgerufen werden sollen.

Was Sie bereits getan haben, ist korrekt. Hier sind ein paar Ergänzungen Sie tun müssen:

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

Danach den Kontakt Delegierten wie folgt implementieren:

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

} 

Für eine gute Erklärung zur Umsetzung Kollisionserkennung, Blick auf this Tutorial.

4

Umgang mit Kollisionen ist ein bisschen unordentlich. :) Es gibt eine Reihe von Ansätzen, aber ein Ort, mit dem Sie beginnen sollten, ist this ziemlich einfaches Beispiel von Apple. Die Readme-Datei bietet eine gute Einführung und Sie können dann mit dem Code herumstöbern.

Ein anderer Ansatz (den Apple in ihrem Handbuch erwähnt) ist die Verwendung von Double Dispatching (siehe Wikipedia für eine lange Beschreibung). Ich würde jedoch nicht damit beginnen, diesen Ansatz zu verfolgen. Es ist ein etwas fortgeschrittener Ansatz, da es auf dynamischen Selektoren und ähnlichen Techniken beruht, um die Magie zu ermöglichen. Aber selbst mit dieser Einschränkung, können Sie ein einfaches Beispiel finden, jemand zusammen, wie es zu tun ist, zusammen mit vielen unterstützenden Beschreibung here.