Ich stelle fest, dass UIButtons
das nicht sehr gut funktioniert SKScene
. Also versuche ich, eine Unterklasse SKNode
zu erstellen , um einen Button zu erstellen SpriteKit
.
Ich möchte, dass es funktioniert: Wenn ich eine Schaltfläche in initialisiere SKScene
und Berührungsereignisse aktiviere, ruft die Schaltfläche eine Methode in meinem auf, SKScene
wenn sie gedrückt wird.
Ich würde mich über jeden Rat freuen, der mich dazu führen würde, die Lösung für dieses Problem zu finden. Vielen Dank.
ios
objective-c
uibutton
sprite-kit
AlexHeuman
quelle
quelle
Antworten:
Sie können einen SKSpriteNode als Schaltfläche verwenden. Wenn der Benutzer ihn berührt, überprüfen Sie, ob dieser Knoten berührt wurde. Verwenden Sie die Namenseigenschaft von SKSpriteNode, um den Knoten zu identifizieren:
Fügen Sie Ihrer Szene einen Knoten hinzu:
Griffberührungen:
quelle
Ich habe meine eigene Button-Klasse gemacht, mit der ich arbeite. SKButton.h:
SKButton.m:
Ein Beispiel: Um eine Schaltfläche zu initialisieren, schreiben Sie die folgenden Zeilen:
Außerdem benötigen Sie die 'buttonAction'-Methode in Ihrer Klasse. * Keine Garantie, dass diese Klasse in jedem Fall richtig funktioniert. Ich bin noch ziemlich neu in Ziel-c. * *
Wenn Sie mit denken , dies zu tun ist ärgerlich und sinnlos Sie die Prüfung in den Build - Einstellungen deaktivieren und ‚Enable strenge Überprüfung der
objc_msgSend Calls'
auf‘No
'quelle
objc_msgSend
anstelle von verwenden[target performSelector:selector]
?self
am Ende wie folgt hinzufügen :objc_msgSend(_targetTouchUpInside, _actionTouchUpInside, self)
Für Leute, die ihre Spiele in Swift schreiben! Ich habe die wesentlichen Teile von Grafs Lösung in eine schnelle Klasse umgeschrieben. Ich hoffe es hilft:
quelle
Wenn Sie es wünschen, Sie können UIButton (oder einem anderen UIView) verwenden.
Wenn ein
SKScene
erstellt wird, existiert es noch nicht in einemSKView
. Sie solltendidMoveToView:
in IhrerSKScene
Unterklasse implementieren . Zu diesem Zeitpunkt haben Sie Zugriff auf dieSKView
Szene, in der sich die Szene befindet, und könnenUIKit
Objekte hinzufügen . Aus Gründen der Schönheit habe ich sie eingeblendet ...Sie müssen sie absichtlich aus der Szene entfernen, wenn Sie weggehen, es sei denn, es ist natürlich absolut sinnvoll, dass sie dort bleiben.
Für diejenigen, die nicht mit dem programmgesteuerten Erstellen eines vertraut sind
UIButton
, hier ein Beispiel (Sie könnten hier 100 Dinge anders machen)…Erinnerung:
UIView
Ursprung ist oben links,SKScene
Ursprung ist unten links.quelle
Ich habe die SKButton-Klasse von Graf verwendet .
Ich benutze den SKButton für die Szenennavigation. dh eine andere Szene präsentieren, wenn der Benutzer den SKButton drückt. Ich bekomme
EXC_BAD_ACCESS
Fehler beitouchesEnded->[self setIsSelected:NO]
. Dies passiert besonders häufig auf dem neuesten iPad mit schneller CPU.Nach Überprüfung und Fehlerbehebung wurde mir klar, dass das SKButton-Objekt bereits "freigegeben" ist, wenn das
setIsSelected
Funktion . Dies liegt daran, dass ich den SKButton verwende, um zur nächsten Szene zu navigieren, und dies bedeutet auch, dass die aktuelle Szene jederzeit freigegeben werden kann.Ich habe eine kleine Änderung vorgenommen, indem ich setIsSelected wie folgt in den Abschnitt "else" eingefügt habe.
Hoffe, dies hilft anderen Entwicklern, die den gleichen Fehler sehen.
quelle
Hier ist eine andere Version, die auf Filip's Swift-Code basiert. Ich habe es nur ein wenig vereinfacht und zugelassen, dass es Blöcke und nicht nur Selektoren enthält:
Verwenden Sie es so:
Hoffe das hilft.
quelle
Bearbeiten: Ich habe ein Github-Repo für meinen SKButtonNode erstellt, das ich hoffentlich auf dem neuesten Stand halten und aktualisieren werde, wenn sich schnell etwas entwickelt!
SKButtonNode
Leider kann ich Filip's schnelle Implementierung von SKButton in Swift noch nicht kommentieren. Super glücklich, dass er das in Swift gemacht hat! Ich bemerkte jedoch, dass er keine Funktion zum Hinzufügen von Text zur Schaltfläche enthielt. Dies ist eine große Funktion für mich, sodass Sie nicht für jede einzelne Schaltfläche separate Assets erstellen müssen, sondern nur den Hintergrund und dynamischen Text hinzufügen müssen.
Ich habe eine einfache Funktion hinzugefügt, um SKButton eine Textbezeichnung hinzuzufügen. Es ist wahrscheinlich nicht perfekt - ich bin neu bei Swift, genau wie alle anderen! Fühlen Sie sich frei zu kommentieren und helfen Sie mir, dies so gut wie möglich zu aktualisieren. Hoffe euch gefällt!
Beispiel für die Erstellung einer Schaltfläche:
Vollständige Klasse unten aufgeführt:
}}
quelle
Was für viele großartige Lösungen für dieses Problem! Für die Hardcore-Scroller, die es bis hierher schaffen, gibt es ein Vergnügen! Ich habe eine Unterklasse erstellt
SKScene
, und es ist EIN Funktionsaufruf erforderlich, um einen beliebigen Knoten zu registrieren, der sich wie einUIButton
! Hier ist die Klasse:}}
Es enthält viele Ideen, die ich noch nicht implementiert habe, und einige Erklärungen zum Code, aber kopieren Sie ihn einfach und fügen Sie ihn in Ihr Projekt ein, und Sie können ihn unverändert in Ihrer eigenen Szene verwenden. Hier ist ein vollständiges Beispiel für die Verwendung:
Die einzige Einschränkung ist , wenn Sie implementieren
touchesBegan
,touchesMoved
,touchesEnded
, und / odertouchesCancelled
Sie MÜSSEN SUPER AUFRUF! Sonst wird es nicht funktionieren.Und bitte beachten Sie, dass es in diesem Beispiel wirklich nur EINE CODE-LINIE gibt, die Sie benötigen, um JEDEN NODE-
UIButton
Eigenschaften zuzuweisen ! Es war diese Zeile:Ich bin immer offen für Ideen und Vorschläge. Lass sie in den Kommentaren und Happy Coding !!
Hoppla, ich habe vergessen zu erwähnen, dass ich diese raffinierte Erweiterung verwende. Sie können es aus einer Erweiterung herausnehmen (da Sie es wahrscheinlich nicht in jedem Knoten benötigen) und es in meine Klasse einfügen. Ich benutze es nur an einem Ort.
}}
quelle
class ConfusedScene : KCScene {
. DannConfusedScene
machen Sie einfach eine Funktion, um zu tun, was Sie wollen, wenn die Taste gedrückt wird. Ich habe das gemacht :func playButtonPushed() { /*do whatever happens when play button is pushed*/}
. Warum dies funktioniert, ist zu kompliziert, um es hier zu erklären, aber Sie können hier über Schließungen lesen .Meine Lösung zur Lösung dieses Problems wurde vollständig in SWIFT unter Verwendung von Verschlüssen geschrieben.
Es ist ziemlich einfach zu bedienen! https://github.com/txaidw/TWControls
quelle
Ich hatte vor einiger Zeit eine Klasse für die Verwendung von SKSpriteNode als Schaltfläche erstellt. Sie finden es auf GitHub hier.
AGSpriteButton
Die Implementierung basiert auf UIButton. Wenn Sie also bereits mit iOS vertraut sind, sollten Sie es einfach finden, damit zu arbeiten.
Es kann auch ein Block oder eine SKAction zugewiesen werden, die ausgeführt werden soll, wenn die Taste gedrückt wird.
Es enthält auch eine Methode zum Einrichten eines Etiketts.
Eine Schaltfläche wird normalerweise wie folgt deklariert:
Und das ist es. Du bist gut zu gehen.
quelle
Und da wir alle nicht auf iOS abzielen, ist hier der Beginn eines Codes, den ich geschrieben habe, um die Mausinteraktion auf dem Mac zu handhaben.
Frage an die Gurus: Bietet MacOS Touch-Events bei Verwendung eines Trackpads an? Oder werden diese als Mausereignisse an SpriteKit gesendet?
Eine andere Frage für die Gurus: Sollte diese Klasse nicht richtig SKButton Node heißen ?
Wie auch immer, versuchen Sie das ...
quelle
Ich habe untergeordnet
SKScene
Klasse und das Problem des Lösen von Tastenanschlägen in diesem Projekt erreicht.https://github.com/Prasad9/SpriteKitButton
Darin sollten alle Knoten benannt werden, die beim Tippen bekannt sein müssen.
In diesem Projekt können Sie nicht nur das Tippen auf eine Schaltfläche erkennen, sondern auch feststellen, ob die Berührung eines bestimmten Knotens begonnen oder beendet wurde.
Überschreiben Sie die folgende Methode in Ihrer Szenendatei, um eine Tap-Aktion zu erhalten.
Überschreiben Sie die folgende Methode in Ihrer Szenendatei, um den Beginn der Berührung eines bestimmten Körpers kennenzulernen.
Überschreiben Sie die folgende Methode in Ihrer Szenendatei, um das Ende der Berührung eines bestimmten Körpers kennenzulernen.
quelle
Grafs Lösung hat ein Problem. Beispielsweise:
_hudLayer ist ein SKNode, eine Eigenschaft meiner Szene. Sie erhalten also eine Ausnahme, da die Methode touchEnded in SKButton ausgeführt wird. Es wird [SKSpriteNode pauseButtonPressed] aufgerufen, nicht mit Szene.
Die Lösung, um self.parent zu ändern, um das Ziel zu berühren:
quelle
Eigentlich funktioniert das gut unter Swift 2.2 unter Xcode 7.3
Ich mag FTButtonNode ( richy486 / FTButtonNode.swift ), aber es ist nicht möglich, direkt während der Initialisierung eine andere Größe (statt der Standardtexturgröße) anzugeben. habe ich diese einfache Methode hinzugefügt:
Sie müssen dies unter der offiziellen benutzerdefinierten Init-Methode (ähnlich dieser) kopieren, damit Sie eine andere Init-Methode verwenden können:
Eine andere wichtige Sache ist die "Auswahlzeit", ich habe gesehen, dass in den neuen Geräten (iPhone 6) irgendwann die Zeit zwischen
touchesBegan
undtouchesEnded
zu schnell ist und Sie die Änderungen zwischendefaultTexture
und nicht sehenselectedTexture
.Mit dieser Funktion:
Sie können die
touchesEnded
Methode neu schreiben , um die Texturvariation korrekt anzuzeigen:quelle
Ich war von keiner der oben genannten Optionen überzeugt, daher habe ich basierend auf dem neuesten Swift4 meine eigene Lösung erstellt .
quelle
Leider hat SpriteKit keinen Schaltflächenknoten, ich weiß nicht warum, weil es eine sehr nützliche Steuerung ist. Also habe ich beschlossen, meine eigenen zu erstellen und über CocoaPods zu teilen, bitte benutze es OOButtonNode . Schaltflächen können Text / Hintergrund oder Bilder verwenden, die in Swift 4 geschrieben wurden.
quelle
Hier ist eine einfache Schaltfläche, die mit dem modernen Swift (4.1.2) geschrieben wurde.
Eigenschaften
touchBeganCallback
und festlegentouchEndedCallback
, um benutzerdefiniertes Verhalten hinzuzufügenCode
Wie man es benutzt
quelle