In meinem Spiel benutze ich SKSprite. Einige Kollisionen werden nicht erkannt. Ich habe 10 Versuche gemacht, Kollisionen funktionieren gut, aber etwa 25% der Kollisionen, die erkannt werden sollen, werden nicht erkannt. Ich habe keine Ahnung warum, ich habe viele Dinge ausprobiert. Kollisionen sind nur mit Knoten der gleichen Kategorie.Swift - Zufällige Kollisionen werden nicht erkannt
Ich habe keine Ahnung, warum zufällig einige Kollisionen nicht gemacht werden, wenn ich sie offensichtlich sehen kann, haben Sie eine Idee? Danke für Ihre Hilfe. Hier
ist der Code von didBeginContact:
func didBeginContact(contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody = contact.bodyA
var secondBody: SKPhysicsBody = contact.bodyB
if firstBody.categoryBitMask == secondBody.categoryBitMask {
listContacts.append([firstBody.node!,secondBody.node!])
}
}
}
Hier ist der Code von didEndContact:
func didEndContact(contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody = contact.bodyA
var secondBody: SKPhysicsBody = contact.bodyB
if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask {
for i in listContacts{
if (i.contains(firstBody.node!) && i.contains(secondBody.node!)){
let findIndex = listContacts.indexOf { $0 == i }
listContacts.removeFirst(findIndex!)
}
}
}
Schließlich, wenn ich ein neues SKSpriteNode erkläre ich diesen Satz:
rectangle.physicsBody = SKPhysicsBody(rectangleOfSize: rectangle.size)
rectangle.physicsBody?.dynamic = true
rectangle.physicsBody?.collisionBitMask = PhysicsCategory.None
usesPreciseCollisionDetection = true ändert nichts, daher verwende ich usePrecisionCollisionDetection nicht
Jeder SKSpriteNode hat seine KategorieBitmask und contactTestBitmask gleich, weil nur dieselben SKSpriteNodes kollidieren sollen.
auch:
physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self
Schließlich ist hier ein kurzes Video von meinem Spiel, wenn Sie leicht verstehen wollen, was passiert (Problem der Kollisionen zwischen Rechtecke) https://www.youtube.com/watch?v=-pbmKwQiE9U
Können Sie bitte Ihre Touchfunktionen posten? Es sieht so aus, als würdest du in dein Video tippen, um die Blöcke zu entfernen, richtig? – Siriss
@Siriss du hast Recht, aber es ist eine riesige Funktion und ich habe viele Tests, ich weiß, es kommt von der Kollisionserkennung, weil listContacts nicht die Verbindungen, so dass ich glaube nicht, es wird leider helfen. Grundsätzlich überprüft die Touch-Funktion, welche Rechtecke mit Hilfe von listContacts daneben liegen. Wenn mindestens 3 nebeneinander die gleiche Farbe haben, verschwinden sie. – Oscar