2014-01-21 14 views
10

Ich bin dabei, den besten Weg zu finden, Gegenstände mit meinem Helden in meinem SpriteKit-Spiel für iOs zu sammeln, und nachdem ich ein paar Wege versucht habe, ist mein Fazit, der beste Weg wäre, einen Gegenstand mit einer Physik zu haben Körper, der Kollisionen erkennen kann, aber nicht mit meinem Helden kollidiert. Ist es möglich, es zu tun? Kollisionen eines Physikkörpers zu deaktivieren, ohne seine Fähigkeiten zur Erkennung von Kollisionen zu deaktivieren? Klingt etwas widersprüchlich, ich weiß ... Weil der andere Weg wäre, nur einen SKSpriteNode ohne Physikkörper zu erstellen, dann würde es keine Kollisionen geben, aber die Art, Kollisionen zu "erkennen", wäre von Hand gemacht und viel schwieriger, weil ich eine Koordinatensystemerkennung in meinem Helden einstellen müsste, dass, wenn er in diesen spezifischen Koordinaten ist (über den Gegenstand), ich den Gegenstand verschwinden lasse. Irgendeine Idee, wie man eine der beiden Möglichkeiten einfacher macht?Ist es möglich, Kollisionen in Physikkörpern in SpriteKit zu deaktivieren?

+0

das ist, was Kategorie Bitmasken für – santhu

+0

ist, wenn Sie nicht über sie, zur Seite ** 96 von Sprite-Kit PG ** gelesen hatten, lesen. „Kollisions- und Kontakt Beispiel: Rockets im Raum“ – santhu

+0

es ist unglaublich dumm aber Apple schien nichts zu tun, um Physik auf PhysikBody einfach zu deaktivieren. Das bedeutet, dass die grundsätzliche Technik der gesamten Spielentwicklung mit einem "Modell", das du klonst, in iOS nicht möglich ist. Nett. – Fattie

Antwort

16

Auschecken collisionBitMask, categoryBitMask und contactTestBitMask in der SKPhysicsBody Klasse.

Im Wesentlichen "durchdringen" sich Physikkörper mit dem gleichen collisionBitMask Wert.

  • Korrektur: Wenn die Kategorie und Kollision Bits Spiel, werden sie in Wechselwirkung treten. Wenn sie nicht übereinstimmen, werden diese beiden nicht interagieren. Und wenn die Kollision Bits und Kategorie Bits sind beideNull, natürlich, dass Einzelteil wird mit nichts in Wechselwirkung treten auch immer.

Dann legen Sie die categoryBitMask und contactTestBitMask Werte ein SKPhysicsContact Objekt auf Kontakt zu erstellen. Schließlich sollte Ihre Klasse das Protokoll SKPhysicsContactDelegate übernehmen. Verwenden Sie die Methode - didBeginContact:, um das Objekt SKPhysicsContact zu erkennen und zu behandeln.

static const uint8_t heroCategory = 1; 
static const uint8_t foodCategory = 2; 
-- 
food.physicsBody.categoryBitMask = foodCategory; 
food.physicsBody.contactTestBitMask = heroCategory; 
food.physicsBody.collisionBitMask = 0; 
-- 
hero.physicsBody.categoryBitMask = heroCategory; 
hero.physicsBody.contactTestBitMask = foodCategory; 
hero.physicsBody.collisionBitMask = 0; 
-- 
-(void)didBeginContact:(SKPhysicsContact *)contact { 
    SKPhysicsBody *firstBody = contact.bodyA; 
    SKPhysicsBody *secondBody = contact.bodyB; 
} 
+0

Diese Antwort muss genauer geklärt werden. Der Grund, warum sich die beiden Objekte in diesem Beispiel gegenseitig passieren, ist "collisionBitMask = 0", was bedeutet: "Kollidiere nicht mit irgendetwas". Wenn Sie aus irgendeinem Grund 2 der gleichen Objekttypen mit allem Bit zusammenstoßen möchten, dann stellen Sie sicher, dass die collisionBitMask nicht das Flag enthält, das für die categoryBitMask verwendet wird – Knight0fDragon

3

Sie können dies tun, indem Sie die categoryBitMask und contactBitMasks des Spielers einstellen und die Elementobjekte, aber darauf achten, dass Sie nicht die collisionBitMask gesetzt entweder miteinander zu interagieren (siehe unten)

static const int playerCategory = 1; 
static const int worldCategory = 2; 
static const int objectCategory = 4;  

.... 

SKSpriteNode *player, *item; 

.... 

player.physicsBody.categoryBitMask = playerCategory; 
player.physicsBody.collisionBitMask = worldCategory; 
player.physicsBody.contactTestBitMask = worldCategory; 

.... 

item.physicsBody.categoryBitMask = objectCategory; 
item.physicsBody.contactTestBitMask = playerCategory | worldCategory; 
item.physicsBody.collisionBitMask = worldCategory; 

Auf diese Weise wird der Physikkörper Kollisionen zwischen den Spieler- und Weltobjekten, den Gegenstands- und Weltobjekten, aber nicht zwischen dem Spieler und den Gegenständen aufnehmen. Es wird einen Aufruf von didBeginContact auslösen, wo Sie Ihren Elementknoten löschen, Gesundheit hinzufügen können usw.

Hoffe, das hilft!

8

Kurze Antwort:

yourHero.physicsBody.collisionBitMask = 0; 

Der Standardwert von collisionBitMask ist 0xFFFFFFFF (alle Bits gesetzt), das ist, warum der Knoten mit anderen kollidiert

3

contactTestBitMask verwendet wird didBeginContact auszulösen. collisionBitMask wird verwendet, um die Physik auf Knoten zu aktivieren.

// add a physics body 
ship.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ship.size.width/2]; 

// set the category for ship 
ship.physicsBody.categoryBitMask = shipCategory; 

// detect collisions with asteroids and edges 
ship.physicsBody.contactTestBitMask = asteroidCategory | edgeCategory; 

// physically collide with asteroids 
ship.physicsBody.collisionBitMask = asteroidCategory; 
Verwandte Themen