在SpriteKit中检测对象子节点的触摸

11

我有一个自定义类,它是SKNode类型,其中又包含多个SKSpriteNode。有没有办法在我的游戏场景中检测到对这些子节点SKSpriteNode的触摸?

我正在使用Swift语言。

4个回答

10
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {

   let touch = touches.anyObject() as UITouch

   let touchLocation = touch.locationInNode(self)

    if([yourSprite containsPoint: touchLocation])
    {
         //sprite contains touch
    }
}

来源: http://www.raywenderlich.com/84434/sprite-kit-swift-tutorial-beginners

这篇教程介绍了如何使用SpriteKit框架和Swift编程语言创建2D游戏。SpriteKit是一个由苹果公司开发的游戏引擎,可以帮助开发人员轻松地创建动画、物理效果等游戏元素。
在这个教程中,你将学习如何创建场景、添加节点、处理用户输入以及实现碰撞检测等功能。通过跟随本教程,你将建立起对SpriteKit框架和Swift编程语言的基础认识,并能够开始自己的游戏开发之旅。

2
查看苹果的SceneKitVehicle演示。有人友好地将其移植到了Swift中。
您想要的代码在GameView.swift文件中。在GameView中,您会看到touchesBegan重写。以下是我针对Swift 2.1的版本:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    guard let scene = self.overlaySKScene else {
        return
    }

    let touch = touches.first!
    let viewTouchLocation = touch.locationInView(self)
    let sceneTouchPoint = scene .convertPointFromView(viewTouchLocation)
    let touchedNode = scene.nodeAtPoint(sceneTouchPoint)

    if (touchedNode.name == "Play") {
        print("play")
    }
}

如果不清楚的话,GameView 是通过故事板设置为应用程序的视图类。

1

Swift 5+

如果您希望将触摸逻辑封装在节点中并在本地处理它,只需在相应的节点中将交互设置为true即可。

isUserInteractionEnabled = true

然后,当然,根据您的需要覆盖touchesBegan方法。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {}

如果您仍希望在子节点内发生触摸时接收场景中的触摸,则可以例如为子节点的delegate定义协议和属性,并将场景设置为其代理。

e.g:

final class GameScene: SKScene {
    private let childNode = ChildNode()

    override func didMove(to view: SKView) {
        addChild(childNode)
        childNode.delegate = self
    }
}

extension GameScene: TouchDelegate {}

protocol TouchDelegate {
    func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
}

final class ChildNode: SKSpriteNode {
    var delegate: TouchDelegate?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        delegate?.touchesBegan(touches, with: event)
    }
}

0
你需要比较你的触摸位置和SKNode的位置。
你可以通过以下方法之一使用locationInNode()获取触摸位置:
  • touchesBegan()
  • touchesMoved()
  • touchesEnded()

1
请提供更多细节。 - user3138007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接