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?
Antwort
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;
}
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
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!
Kurze Antwort:
yourHero.physicsBody.collisionBitMask = 0;
Der Standardwert von collisionBitMask
ist 0xFFFFFFFF (alle Bits gesetzt), das ist, warum der Knoten mit anderen kollidiert
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;
- 1. Kollisionen in SpriteKit
- 2. Ist es möglich, eine Linie mit SpriteKit animiert zu zeichnen?
- 3. Ist es möglich, stderr in C++ zu deaktivieren?
- 4. Ist es möglich, Drag & Drop in vscode zu deaktivieren?
- 5. Ist es möglich, eine Umgebungsvariable in einem Makefile "zu deaktivieren"?
- 6. Ist es möglich, Blueprint in Segeln zu deaktivieren
- 7. Ist es möglich, die Rahmenbegrenzung in libGDX zu deaktivieren?
- 8. Ist es möglich, Stack-Traceback in Lua zu deaktivieren?
- 9. Ist es möglich, editierbare Tabellenspalten in JavaFX8 hintereinander zu deaktivieren?
- 10. Ist es möglich den Ladebalken in zkoss zu deaktivieren?
- 11. Ist es möglich, die Wählhilfe in iOS programmgesteuert zu deaktivieren?
- 12. Ist es möglich, 'Schritt' in Eingangstypnummer zu deaktivieren
- 13. Ist es möglich, Hot Deployment in TomCat zu deaktivieren?
- 14. Ist es möglich, die browserCaps-Funktionalität in ASP.NET zu deaktivieren?
- 15. Ist es möglich, die automatischen Hyperlinks des iPhone zu deaktivieren?
- 16. Ist es möglich, IE8 "Beschleuniger" auf meiner Website zu deaktivieren?
- 17. Ist es möglich, 'Minification' mit Minify zu deaktivieren?
- 18. SpriteKit - Einige SpriteNodes NICHT kollidieren, ohne ihre Physikkörper zu deaktivieren
- 19. Ist es möglich, Jquery-Datatable-Exporte für Geräte zu deaktivieren?
- 20. Ist es möglich, die Befehlseingabe im Toolbar-Suchfeld zu deaktivieren?
- 21. Ist es möglich, die manuelle Aktualisierung auf PowerBI zu deaktivieren?
- 22. ist es möglich, den impliziten Aufruf von ToString() zu deaktivieren?
- 23. wso2is - Ist es möglich, den grundlegenden Authentifikator zu deaktivieren?
- 24. Ist es möglich, scroll auf einer listView zu deaktivieren?
- 25. Android - Ist es möglich, bestimmte Funktionen programmatisch zu deaktivieren?
- 26. Ist es möglich, die Feststelltaste unter Windows programmgesteuert zu deaktivieren?
- 27. Ist es möglich, die mehrzeilige Option von textarea zu deaktivieren?
- 28. Ist es möglich, IIS-Komprimierung von der Anwendung zu deaktivieren?
- 29. Ist es möglich, setlocale() innerhalb eines Prozesses zu deaktivieren?
- 30. Ist es möglich, die RCS-Schlüsselworterweiterung ($ Id $) zu deaktivieren?
das ist, was Kategorie Bitmasken für – santhu
ist, wenn Sie nicht über sie, zur Seite ** 96 von Sprite-Kit PG ** gelesen hatten, lesen. „Kollisions- und Kontakt Beispiel: Rockets im Raum“ – santhu
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