2015-10-16 16 views
6

Ich beginne zu lernen, wie Swift2 auf iOS mit SpriteKit funktioniert und ich kann nicht erkennen, ob ich einen sichtbaren Teil meines Sprites berührte.Erkennen der Berührung innerhalb der Begrenzungsbox (Alphamaske) von Sprite mit SpriteKit

Ich kann feststellen, welcher Knoten wurde wie folgt berührt:

let touchedNode = self.nodeAtPoint(location) 

Aber die Berührung auf dem Sprite erkennen. Ich möchte die Berührung nur auf dem "nicht transparenten" Teil des Sprites erkennen.

Ich versuchte, einen PhysicsBody mit einem Alpha-Maske Begrenzungsrahmen Erstellen und Testen, ob der Begrenzungsrahmen des Knotens ich den Ort der Berührung wie diese enthält, ausgewählt:

sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size) 
sprite.physicsBody?.affectedByGravity = false 
if (touchedNode.containsPoint(location)){ 

Aber es half nicht. Wenn ich in einen transparenten Teil meines Sprites klicke, wird das Ereignis immer noch ausgelöst.

Die Dokumentation sagt "Ein neuer Physikkörper wird erstellt, der alle Texel in der Textur enthält, die einen Alpha-Wert ungleich Null haben.", Sollte es nicht funktionieren?

Danke für Ihre Zeit.

PS: Ich habe auch versucht, auf meiner Alpha-Schwelle großzügiger zu sein, aber das hat auch nicht funktioniert (falls meine Transparenz nicht perfekt war).


UPDATE:

ein wenig mehr Details hinzuzufügen, ich einen Level-Editor bin Gebäude. Das bedeutet, dass ich viele Knoten erstellen werde, je nachdem, was der Benutzer wählt, und ich muss diese Knoten auswählen/verschieben/rotieren können. Ich verwende tatsächlich SKSpriteNodes, da meine PNG-Bilder automatisch in xcassette hinzugefügt werden. Ich entschied mich für die Alpha Mask-Box von PhysicsBody, da dieser Wert im Szeneneditor (Xcode) angezeigt wird, wenn Sie einen Knoten auswählen, und wenn ausgewählt, markiert die Alpha-Maske genau den Teil meines Sprites, den ich haben möchte entdecke eine Berührung im Inneren.

Wenn ich die falschen Ideen/Techniken verwende, bitte sag es mir. Dies ist möglich, da ich erst Swift und SpriteKit benutze.


UPDATE 2

ich die physicsWord abgefragt (wie empfohlen) das Recht physicsBody zu bekommen und bekam den Namen des angeschlossenen Knoten wie folgt aus:

let body = self.physicsWorld.bodyAtPoint(location) 
print(body?.node?.name) 

Aber das ist immer noch Druck der Name des Knotens, auch wenn ich außerhalb der Bounding Box berühre, was für mich keinen Sinn ergibt.

Danke trotzdem für Ihre Hilfe.

+0

Haben Sie einen guten Weg gefunden, dies zu tun? – Confused

Antwort

2

Die SKPhysicsBody definiert nicht die Grenzen der SKNode. Sie können die Trefferprüfung durchführen, indem Sie die SKPhysicsWorld Ihrer Szene abfragen, indem Sie bodyAtPoint darauf aufrufen. Das wird die SKPhysicsBody zurückgeben, die Sie interessiert.

+0

Es scheint mir, dass ich den Elefanten im Raum meiden würde. Tue ich es falsch? Was ist die gute Übung, um Berührung von Objekten der Szene aus ihrer Begrenzungsbox (Alphamaske) zu erkennen?Ich meine, diese Lösung ist eindeutig ein Hack um ein fundamentaleres Problem, das ich habe, nicht wahr? Vielen Dank für Ihre Geduld. –

+0

Meine bearbeitete Antwort ist besser und scheint die "richtige" Art zu sein, Berührungen auf SKSpriteNodes zu erkennen –

+0

Hum, ich habe versucht, "self.physicsWorld.bodyAtPoint (location)" zu machen und das gibt mein Sprite genauso zurück, ohne sich um das zu kümmern Bounding Box, auch wenn meine Bounding Box korrekt ist (Ich kann es testen, indem ich das Objekt verschiebe, es kollidiert korrekt mit anderen Objekten, indem ich die Alpha Maskierte Box benutze, die ich versuche Touch zu erkennen). –