Sprite mit userInteractionEnabled, das auf YES gesetzt ist, erhält keine Berührungen, wenn es von normalen Sprites abgedeckt wird

8

Ich habe ein Sprite A (subclassed, um Treffer (userInteractionEnabled zu YES) zu erhalten), und dann ein normales Sprite B, das keine Treffer darüber hat (userInteractionEnabled default NO), das Sprite A vollständig überdeckt.

Wenn ich auf Sprite B tippe, nehme ich an, dass Sprite A die Berührung bekommt, aber nichts passiert. Der Teil von Dokumenten über die Angelegenheit ist unten.

Ich fühle, dass hier etwas unklar ist, weil es immer noch scheint, dass Sprite B die Berührung empfängt, sie aber wegwirft. ODER, spriteA wird von einem möglichen Berührungsempfänger entfernt, weil es nicht sichtbar ist.

Aus der Dokumentation: Ссылка

  

Damit ein Knoten während des Treffertests berücksichtigt werden kann, ist sein   Die Eigenschaft userInteractionEnabled muss auf YES gesetzt sein. Der Standardwert   ist NEIN für jeden Knoten außer einem Szenenknoten. Ein Knoten, der empfangen möchte   Ereignisse müssen die entsprechenden Responder-Methoden implementieren   Elternklasse (UIResponder auf iOS und NSResponder auf OS X). Dies ist einer   von den wenigen Stellen, an denen Sie plattformspezifischen Code implementieren müssen   Sprite Kit

Wie auch immer, um das zu beheben? Solange etwas userInteractionEnabled NEIN ist, sollte es andere Touch-Empfänger nicht stören.

Update: Selbst wenn Sprite B Alpha auf 0.2 gesetzt wird und Sprite A sehr gut sichtbar ist, wird Sprite A nicht berührbar. Sprite B "schluckt" einfach die Berührung, obwohl er nicht für die Interaktion aktiviert ist.

    
Jonny 22.10.2013, 07:10
quelle

5 Antworten

10

Hier ist meine Lösung, bis Apple SpriteKit mit korrektem Verhalten aktualisiert, oder jemand findet heraus, wie man es benutzt, wie wir es wollen.

Ссылка

Fügen Sie die Datei Ihrem Projekt hinzu und importieren Sie sie in Ihren Präfix-Header. Jetzt sollten Berührungen wie vorgesehen funktionieren.

    
bobmoff 22.10.2013 23:38
quelle
2

Meine Lösung erfordert keine isKindOfClass Art von Dingen ...

In Ihrer SKScene-Oberfläche:

%Vor%

In Ihrer SKScene-Implementierung

%Vor%

Sie müssen das CSTouchableNode-Protokoll definieren ... nennen Sie es, was Sie wollen:)

%Vor%

Für Ihre SKNodes, die Sie erreichen möchten, müssen sie dem CSTouchableNode-Protokoll entsprechen. Sie müssen Ihren Klassen wie folgt etwas wie folgt hinzufügen.

%Vor%

Damit funktioniert das Tippen auf Knoten so, wie ich es erwarten würde. Und es sollte nicht brechen, wenn Apple den Fehler "userInteractionEnabled" behebt. Und ja, es ist ein Fehler. Ein dummer Käfer. Dummer Apfel.

Aktualisiert

Es gibt einen weiteren Fehler in SpriteKit ... die z-Reihenfolge von Knoten ist seltsam. Ich habe seltsame Anordnungen von Knoten gesehen ... daher tendiere ich dazu, eine zPosition für Knoten / Szenen zu erzwingen, die es brauchen.

Ich habe meine SKScene-Implementierung aktualisiert, um die Knoten basierend auf zPosition zu sortieren.

%Vor%     
AutomatonTec 09.11.2013 08:10
quelle
1

Hier ist ein Beispiel für Berührungen usw ..

Die Szene

%Vor%

Das unterklassierte Sprite / Hero

%Vor%

Hat viele Dinge versucht, aber die Berührung geht nicht durch das überlappende Sprite. Ich denke, Sie können die Szene-Klasse verwenden, um die Berührung durch Schleifen durch die Knoten zu erkennen und dann direkt diesen Knoten aufzurufen.

Ich hatte dieses Problem, als ein Partikelemitter einen Knopf überdeckte ...

    
DogCoffee 22.10.2013 08:15
quelle
1

Ich denke, das könnte eine Design-Entscheidung sein, aber sicherlich nicht sehr flexibel. Am liebsten handle ich mit Objekten, die sich im Sprite Kit auf Scene-Ebene überlappen lassen (wie Spielobjekte), mit nodeAtPoint: kombiniert mit isKindOfClass: methods. Für Objekte wie Schaltflächen, die normalerweise nicht überlappen und in einer anderen Ebene platziert sind (wie Überlagerungen und Schaltflächen), behandle ich deren Benutzerinteraktion in ihren Klassen. Ich möchte, dass meine Berührungsereignisse den Knotenbaum "aufblähen", wie es in Sparrow Framework passiert, aber ich fürchte, es ist mehr eine Feature-Anfrage als ein Fehlerbericht.

P.S .: Durch Berührungen auf Szenenebene können Sie Knoten leicht berühren und verschieben, selbst wenn sie vollständig von nicht beweglichen und nicht berührbaren Knoten bedeckt sind!

    
membersheep 23.10.2013 14:42
quelle
0

Lösung mit weniger Codezeilen. Denken Sie daran, userInteractionEnabled in jedem Knoten zu setzen, den Sie berühren möchten.

%Vor%     
Rodrigo Pedroso 03.03.2014 20:42
quelle

Tags und Links