如何使用该节点的自定义类检测在单独场景中创建的 skspritenode 上的触摸
Posted
技术标签:
【中文标题】如何使用该节点的自定义类检测在单独场景中创建的 skspritenode 上的触摸【英文标题】:How to detect touches on a skspritenode created in a separate scene using a custom class of that node 【发布时间】:2017-01-14 02:09:48 【问题描述】:所以基本上我有一个名为 tree 的节点,我在 .sks 文件中设计了它。
我为 skspritenode 添加了一个自定义类,但自定义类似乎不会影响该节点。
我正在尝试检测节点及其子节点上的触摸。
该节点正在使用removefromparent()
和addchild()
函数转移到多个场景,因此我没有在每个场景上编写重复的代码来检测触摸,而是尝试使用自定义节点类来执行它...任何帮助将不胜感激。
注意我有 super.init 函数和纹理,因为它是必要的,但我想使用已经在场景中创建的节点。
我的班级代码
import SpriteKit
class tree: SKSpriteNode
init()
let texture = SKTexture(imageNamed: "tree")
super.init(texture: texture, color: SKColor.clear, size: texture.size())
self.isUserInteractionEnabled = true
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
for touch in touches
print("touched!")
【问题讨论】:
【参考方案1】:this 回答中有一个很好的解释,应该清楚您对 SKS 文件和子类化的想法。
关于您的代码,使用大写字母作为类名是一个好习惯,在您的情况下,我更喜欢使用 class Tree
而不是类树。
关于您的第二个问题,您可以使用userData 将您的对象从一个场景转移到另一个场景,如下面我的示例所述:
import SpriteKit
class GameScene: SKScene
private var label : SKLabelNode?
var tree : Tree!
override func didMove(to view: SKView)
self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode
if let label = self.label
label.alpha = 0.0
label.run(SKAction.fadeIn(withDuration: 2.0))
self.isUserInteractionEnabled = true
tree = Tree()
tree.name = "tree"
addChild(tree)
tree.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
for touch: AnyObject in touches
let pointOfTouch = touch.location(in: self)
let nodeUserTapped = atPoint(pointOfTouch)
if nodeUserTapped.name == "tree"
tree.removeFromParent()
let sceneToMoveTo = Scene2.init(size: self.size)
sceneToMoveTo.userData = NSMutableDictionary()
sceneToMoveTo.userData?.setObject(tree, forKey: "tree" as NSCopying)
let gameTransition = SKTransition.fade(withDuration: 0.5)
self.view!.presentScene(sceneToMoveTo, transition: gameTransition)
class Scene2: SKScene
var tree:Tree!
override func didMove(to view: SKView)
print("This is the scene: \(type(of:self))")
guard let previousValue = self.userData?.value(forKey: "tree") else return
if previousValue is Tree
tree = previousValue as! Tree
addChild(tree)
tree.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
for touch: AnyObject in touches
let pointOfTouch = touch.location(in: self)
let nodeUserTapped = atPoint(pointOfTouch)
if nodeUserTapped.name == "tree"
tree.removeFromParent()
if let sceneToMoveTo = SKScene(fileNamed: "GameScene")
sceneToMoveTo.scaleMode = .aspectFill
sceneToMoveTo.userData = NSMutableDictionary()
sceneToMoveTo.userData?.setObject(tree, forKey: "tree" as NSCopying)
let gameTransition = SKTransition.fade(withDuration: 0.5)
self.view!.presentScene(sceneToMoveTo, transition: gameTransition)
如您所见,我在父类和节点中都可以控制触摸,这可以通过将自定义 SKSpriteNode
的 touchesBegan
方法更改为:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
for touch in touches
print("touched!")
guard let parent = self.parent else return
parent.touchesBegan(touches, with: event)
请记住,如果您想使用其他触摸方法,也应该将此方法扩展到其他触摸方法。
【讨论】:
谢谢!这绝对有帮助。以上是关于如何使用该节点的自定义类检测在单独场景中创建的 skspritenode 上的触摸的主要内容,如果未能解决你的问题,请参考以下文章
如何本地化在 Hybris 的 trainingcore-items.xml 中创建的自定义类型?
带有在 IB 中创建的自定义视图的 InputAccessoryView