J'essaie de détecter si mon noeud Sprite a été touché et je ne sais pas par où commencer.
let Pineapple = SKSpriteNode(imageNamed: "Pineappleimg")
Pineapple.userInteractionEnabled = true
Pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(Pineapple)
Définissez d'abord la propriété name
de la SKSpriteNode
sur une chaîne.
pineapple.name = "pineapple"
pineapple.userInteractionEnabled = false
puis dans la fonction touchesBegan
dans la Scene
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touch:UITouch = touches.anyObject()! as UITouch
let positionInScene = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(positionInScene)
if let name = touchedNode.name
{
if name == "pineapple"
{
print("Touched")
}
}
}
C'est une façon de le faire.
Vous pouvez également sous-classe SKSpriteNode
et remplacer la touchesBegan
à l'intérieur.
class TouchableSpriteNode : SKSpriteNode
{
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
print("touched")
}
}
Alors fais
let pineapple = TouchableSpriteNode(imageNamed: "Pineappleimg")
pineapple.userInteractionEnabled = true
pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(pineapple)
Si vous ne recherchez que quelques nœuds pouvant être touchés (par exemple, les étiquettes "Continuer" ou "Quitter" dans une interface de jeu), cette solution peut être simple mais très simple:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch = touches.first!
if myNode.containsPoint(touch.locationInNode(self)) {
print("touched")
}
}
Mise à jour pour Swift Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1) et XCode version 8.2.1 (8C1002):
La valeur du type 'Set' n'a pas de membre ' anyObject '
' locationInNode ' a été renommé 'emplacement (en :)'
' nodeAtPoint ' a été renommé 'atPoint (_ :)'
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
let node : SKNode = self.atPoint(location)
if node.name == "myNodeName" {
print("Hello")
}
}
}
Cela détectera les contacts dans Xcode 9.2 Swift 4.0
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
let touch:UITouch = touches.first!
let positionInScene = touch.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if let name = touchedNode.name
{
if name == "playLbl"
{
print("playLbl Touched")
}
}
}
Swift 3 answer qui intègre la fonctionnalité tactile dans la sous-classe de SKSpriteNode
:
class SpriteSub: SKSpriteNode {
init() {
super.init(texture: nil, color: UIColor.red, size: CGSize(width: 50, height: 50))
isUserInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
...
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touch!")
}
}
Implémentez la méthode touchesBegan
qui est appelée au début d'un contact. Vous pouvez également le faire dans touchesEnded
également.
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
let touch = touches.anyObject() as UITouch
let location = touch.locationInNode(self)
let nodes = self.nodesAtPoint(location)
for node in nodes
{
if node.name == "youNodeName"
{
// Node tapped
// Do something
break
}
}
}
Utilisez ce morceau de code pour détecter le contact sur SKSpriteNode
if(nodeAtPoint(location) == node){
}
Mise à jour pour Swift 3.0 et XCode 7.3.1. J'ai un SKShapeNode que j'ai dérivé dans une nouvelle classe et que je l'ai inséré dans la scène. Quand je veux détecter cet objet, je vérifie comme suit:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)
let nodes = self.nodesAtPoint(location)
for node in nodes
{
if node is SKNodeDerivedNode
{
NSLog("Touch a SKNodeDerivedNode")
break
}
}
}
}
Voici comment j'utilise dans Swift 4 pour rechercher une touche dans un type de nœud spécifique:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {
return
}
let touchPosition = touch.location(in: self)
let touchedNodes = nodes(at: touchPosition)
for node in touchedNodes {
if let nodoTouched = node as? YourNodeType {
// touched!
}
}
}