web-dev-qa-db-ja.com

SKSpriteNodeがタッチされたかどうかを検出する方法

Spriteノードがタッチされたかどうかを検出しようとしていますが、どこから始めればいいのかわかりません。

let Pineapple = SKSpriteNode(imageNamed: "Pineappleimg")
Pineapple.userInteractionEnabled = true
Pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(Pineapple)
40
James Brennan

最初に、nameSKSpriteNodeプロパティを文字列に設定します。

pineapple.name = "pineapple"
pineapple.userInteractionEnabled = false

touchesBeganScene関数で

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")
        }
    }

}

これはそれを行う1つの方法です。
サブクラスSKSpriteNodeを使用して、その内部のtouchesBeganをオーバーライドすることもできます。

class TouchableSpriteNode : SKSpriteNode
{
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        print("touched")
    }
}

それから

let pineapple = TouchableSpriteNode(imageNamed: "Pineappleimg")
pineapple.userInteractionEnabled = true
pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(pineapple)
63
rakeshbs

タッチできる少数のノード(たとえば、ゲームUIの「続行」または「終了」ラベル)のみを探している場合、これは代替手段ですが、非常に単純なソリューションかもしれません。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let touch = touches.first!
    if myNode.containsPoint(touch.locationInNode(self)) {
        print("touched")
    }
}
16

Swift Swiftバージョン.0.2(swiftlang-800.0.63 clang-800.0.42.1)およびXCodeバージョン- 8.2.1(8C1002):

タイプ 'Set'の値にはメンバー 'anyObject'がありません

'locationInNode'は 'location(in :)'に名前が変更されました

'nodeAtPoint'は '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")
        }
    }
}
12

これはXcode 9.2 Swift 4.でタッチを検出します

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")
        }
    }

}
7
uplearnedu.com

SwiftSKSpriteNodeのサブクラスにタッチ機能を埋め込む回答:

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!")
    }

}
6
Crashalot

タッチの開始時に呼び出されるtouchesBeganメソッドを実装します。または、touchesEndedでこれを行うこともできます。

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
        }
    }
}
5
RaffAl

このコードを使用して、SKSpriteNodeのタッチを検出します

if(nodeAtPoint(location) == node){



}
4
zbz.lvlv

Swift 3.0およびXCode 7.3.1の更新。新しいクラスに派生してシーンに挿入したSKShapeNodeがあります。このオブジェクトを検出したい場合は、次のように確認します。

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
            }
        }
    }
}
1
Richard Bown

SKSpriteNodeをサブクラス化してもなおSpriteが動作しない場合は、_node.isUserInteractionEnabled = true_を初期化するときに追加するのを忘れている可能性があります。

これで、ノードと対話できるようになったため、touchesBegan(_:with:)を呼び出すことができます。


例:

_node = MySprite(texture: texture, size: size)
node.isUserInteractionEnabled = true
_
0
George_E

これは、Swift 4で特定のタイプのノードにタッチがあるかどうかを調べるために使用する方法です。

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!
        }
    }
}
0
abanet