Spritekit 使子节点不可触摸



我有一个菜单按钮(skSpriteNode(和这个精灵中的小游戏图标

mainButton.addChild (playIcon)
mainButton.name = "xyz"
addchild (mainButton)

好的,我给按钮起了名字,以检查是否触摸了具有此名称的精灵。

当我触摸按钮内的图标子时,touchedNode.name 为零。我为图标子项设置了 isUserInteractionEnabled = false。我想将触摸传递给父母。我该怎么做。

for touch in touches {
let location = touch.location(in: self)
let touchedNode  = self.atPoint(location)
if (touchedNode.name != nil) {
print ("node (touchedNode.name!)")
} else {
continue
}
}

您必须在SKSpriteNode的子类中实现touchesBegan并设置其isUserInteractionEnabled = true,以便接受和处理该特定节点(按钮(的触摸。

import SpriteKit
protocol ButtonDelegate:class {
func printButtonsName(name:String?)
}
class Button : SKSpriteNode{
weak var delegate:ButtonDelegate?
init(name:String){
super.init(texture: nil, color: .purple, size: CGSize(width: 250, height: 250))
self.name = name
self.isUserInteractionEnabled = true
let icon = SKSpriteNode(color: .white, size: CGSize(width:100, height:100))
addChild(icon)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

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

delegate?.printButtonsName(name: self.name)
}  
}
class GameScene: SKScene, ButtonDelegate {
override func didMove(to view: SKView) {
let button = Button(name:"xyz")
button.delegate = self

button.position = CGPoint(x: frame.midX - 50.0, y: frame.midY)

addChild(button)
}
func printButtonsName(name: String?) {
if let buttonName = name {
print("Pressed button : (buttonName) ")
}
}
}

现在,此按钮将吞下触摸,图标子画面将被忽略。

我刚刚修改了我的一个答案中的代码,以制作一个特定于您需求的示例,但是如果有兴趣,您可以在该链接中更详细地阅读整个事情。

我实现了按钮 Touchbegind,并尝试为带有背景的滑块和滑块内的子拇指实现一个子类。我在我的游戏场景中添加了滑块委托协议。向下触摸还可以,但我没有搬进来

import Foundation
import SpriteKit

protocol SliderDelegate:class {
func touchesBeganSKSpriteNodeSlider(name:String?, location: CGPoint?)
func touchesMovedSKSpriteNodeSlider(name:String?, location: CGPoint?)
func touchesEndedSKSpriteNodeSlider(name:String?, location: CGPoint?)
}

class SKSpriteNodeSlider : SKSpriteNode{
weak var delegate:SliderDelegate?
init(imageNamed: String){
// super.init(imageNamed: imageNamed)
let texture = SKTexture(imageNamed: imageNamed)
super.init(texture: texture, color: .white, size: texture.size())
// self.name = name
self.isUserInteractionEnabled = true
// let icon = SKSpriteNode(color: .white, size: CGSize(width:100, height:100))
// addChild(icon)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// for touch in touches {
if let touch = touches.first {
let loc = touch.location(in: self)
delegate?.touchesBeganSKSpriteNodeSlider(name: self.name, location: loc)
}
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
print ("touchesMoved")
// for touch in touches {
if let touch = touches.first {
let loc = touch.location(in: self)
delegate?.touchesMovedSKSpriteNodeSlider(name: self.name, location: loc)
}
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let loc = touch.location(in: self)
delegate?.touchesEndedSKSpriteNodeSlider(name: self.name, location: loc)
}
}
}

最新更新