Bug - hit-test non funziona come previsto quando i fratelli si sovrappongono:Bug: hit-test con i nodi di pari livello e la proprietà userInteractionEnabled in Sprite Kit
Ci sono 2 nodi sovrapposti in una scena che hanno la stesso genitore (cioè fratelli)
Il nodo più in alto ha
userInteractionEnabled = NO
mentre l'altro nodo hauserInteractionEnabled = YES
.Se la sovrapposizione viene sfiorata, dopo che il nodo più in alto è stato colpito al test e fallisce (perché
userInteractionEnabled = NO
), anziché il nodo inferiore è il prossimo ad essere testato, viene saltato e il genitore dei 2 fratelli è hit-test.Quello che dovrebbe accadere è che il fratello successivo (il nodo in basso) viene colpito dal problema piuttosto che il test per colpire il genitore.
Secondo la documentazione Sprite Kit:
"In una scena, quando Kit Sprite elabora gli eventi di tocco o del mouse, cammina la scena per trovare il nodo più vicino che vuole accettare l'evento Se quel nodo non vuole l'evento, Sprite Kit controlla il prossimo nodo più vicino e quindi su. L'ordine in cui viene elaborato hit-testing è essenzialmente il contrario dell'ordine di disegno. Per un nodo da considerare durante il colpo -testing, la proprietà userInteractionEnabled deve essere impostata su YES. Il valore predefinito i s NO per qualsiasi nodo tranne un nodo di scena. "
Si tratta di un bug come fratelli di un nodo vengono resi prima che i loro genitori - un fratello dovrebbe essere il prossimo ad essere testato, e non il suo genitore. Inoltre, se un nodo ha userInteractionEnabled = NO
, allora sicuramente dovrebbe essere "trasparente" per quanto riguarda il hit-testing - ma qui non è come si traduce in un cambiamento di comportamento come un nodo viene saltato nel test.
Ho cercato online, ma non riesco a trovare nessuno che abbia segnalato o pubblicato su questo bug. Quindi dovrei segnalarlo?
E poi il motivo per cui ho postato questo qui è perché vorrei un suggerimento per una 'correzione' di questo bug (cioè. Un suggerimento per l'implementazione di un codice da qualche parte in modo che lavora a SpriteKit alla maniera 'destinato' per hit-testing)
per replicare il bug:
Utilizzare il modello "Ciao mondo" previsto quando si avvia un nuovo progetto "Game" in Xcode (che ha "Hello World" e aggiunge sprite di razzi quando fai clic).
Opzionale: [Ho anche cancellato l'immagine razzo sprite dal progetto come il rettangolo con il
X
che si verifica quando l'immagine non si trova è più facile lavorare con per il debugging, visivamente]Aggiungi un SKSpriteNode alla scena con
userInteractionEnabled = YES
(Mi riferirò come nodo A da ora in poi).Eseguire il codice.
Noterai che quando fai clic sul nodo A, non vengono generati gli sprite del razzo. (comportamento atteso dal momento in cui il hit-test dovrebbe fermarsi dopo che ha avuto successo - si ferma come succede sul nodo A.)
Tuttavia, se si generano alcuni razzi che si trovano accanto al nodo A, quindi fare clic su un luogo dove il Nodo A e un razzo si sovrappongono, è quindi possibile generare un altro razzo sopra il Nodo A - ma questo non dovrebbe essere possibile. Ciò significa che dopo che il hit-test fallisce sul nodo più in alto (il razzo che ha
userInteractionEnabled = NO
per impostazione predefinita), invece di testare il nodo A successivo, verifica invece il genitore del razzo, che è la scena.
Nota: io sto usando Xcode 7.3.1, Swift, iOS - non ho ancora testato per vedere se questo bug è universale, ancora.
dettaglio Extra: Ho fatto qualche debug aggiuntivo (piccola complicazione per la replica sopra) e determinato che l'hit-test viene inviato al genitore successivamente e quindi non necessariamente alla scena.
Apprezzerei ogni e qualsiasi aiuto con questo problema che ho - non oso iniziare il mio nuovo progetto fino a quando questo viene risolto come tutti i tipi di insetti possono verificarsi grazie ad essa quando i nodi si sovrappongono. Sicuramente altri hanno notato/sperimentato questo bug quando realizzano dei progetti perché è piuttosto fondamentale? – Shuri2060
Non sono sicuro se considererei questo un bug ... dipende molto dal contesto di gioco in quale direzione preferibilmente. Potrei facilmente immaginare un gioco in cui se uno sprite blocca l'altro ha senso che quello sotto non venga chiamato, ma invece viene controllata un'azione generica di scena. – GOR
@GOR No, deve essere un bug. Il comportamento va contro ciò che dice la documentazione, il che significa che non è intenzionale. Inoltre, non ha alcun senso logico perché la proprietà 'userInteractionEnabled' è intesa a rappresentare la trasparenza per quanto riguarda il hit-testing, che fallisce a causa di questo comportamento. – Shuri2060