2015-10-16 12 views
6

Sto iniziando a imparare Swift2 per lo sviluppo su iOS utilizzando SpriteKit e non riesco a rilevare se ho toccato una parte visibile del mio Sprite.Rilevamento del tocco all'interno del riquadro di delimitazione (maschera alfa) di Sprite utilizzando SpriteKit

posso trovare quale nodo è stato toccato in questo modo:

let touchedNode = self.nodeAtPoint(location) 

Ma questo rileva il tocco sul sprite. Vorrei rilevare il tocco solo sulla parte "non trasparente" dello sprite.

Ho cercato di creare un PhysicsBody con un riquadro di delimitazione maschera alfa e testare se il riquadro di delimitazione del nodo selezionato contiene la posizione del tocco simili:

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

Ma non ha aiutato. Se clicco su una parte trasparente del mio sprite, l'evento si attiva ancora.

La documentazione dice "Viene creato un nuovo corpo fisico che include tutti i texel nella trama che hanno un valore alfa diverso da zero.", Quindi non dovrebbe funzionare?

Grazie per il vostro tempo.

PS: Ho anche cercato di essere più generoso sulla mia soglia alpha, ma anche questo non ha funzionato (nel caso in cui la trasparenza non fosse perfetta).


UPDATE:

Per aggiungere un po 'più particolari, sto costruendo un editor di livelli. Ciò significa che creerò molti nodi, a seconda di ciò che l'utente sceglie, e ho bisogno di essere in grado di selezionare/spostare/ruotare/etc quei nodi. In realtà sto usando SKSpriteNodes poiché le mie immagini PNG vengono automaticamente aggiunte in xcassette in questo modo. Ho deciso di utilizzare il riquadro di delimitazione della maschera alfa di PhysicsBody, poiché questo valore viene mostrato nell'editor delle scene (Xcode) quando si seleziona un nodo e, quando selezionato, la maschera alfa evidenzia esattamente la parte del mio sprite che voglio essere in grado di rilevare un tocco all'interno.

Se sto usando le idee/tecniche sbagliate, per favore dimmi. Questo è possibile poiché sto solo iniziando a usare Swift e SpriteKit.


UPDATE 2

ho chiesto il physicsWord (come consigliato) per ottenere il physicsBody destra e ha ottenuto il nome del nodo attaccato in questo modo:

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

ma questo è ancora la stampa del nome del nodo anche se tocco al di fuori del riquadro di delimitazione, il che non ha senso per me.

Grazie comunque per il vostro aiuto.

+0

Hai trovato un buon modo per farlo? – Confused

risposta

2

Il SKPhysicsBody non definisce i limiti dello SKNode. Puoi eseguire il controllo dei risultati interrogando lo SKPhysicsWorld della scena chiamando bodyAtPoint. Ciò restituirà il SKPhysicsBody che ti interessa.

+0

Mi sembra che questo eviterebbe l'elefante nella stanza. Lo sto facendo nel modo sbagliato? Qual è la buona pratica per rilevare il tocco sugli oggetti della scena, dal loro riquadro di delimitazione (maschera alfa)?Voglio dire, quella soluzione è chiaramente un trucco su un problema più fondamentale che ho, non è vero? Grazie comunque per la tua pazienza. –

+0

La mia risposta modificata è migliore e sembra essere il modo "giusto" per rilevare i tocchi su SKSpriteNodes –

+0

Hum, ho provato a fare "self.physicsWorld.bodyAtPoint (posizione)" e questo restituisce esattamente il mio sprite allo stesso modo, senza preoccuparsi del bounding box, anche se il mio bounding box è corretto (posso testarlo spostando l'oggetto, collide correttamente con altri oggetti usando il bounding box alfa mascherato che sto cercando di rilevare touch). –

Problemi correlati