gpt4 book ai didi

swift - 如何检测触摸了哪个 SKSpriteNode

转载 作者:搜寻专家 更新时间:2023-10-31 08:15:23 25 4
gpt4 key购买 nike

我找到一个 similar question ,但我正在尝试检测和识别用户触摸了哪个 Sprite,但我不知道该怎么做。这是我的变量:

var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]]

想法是识别 spriteNode,然后将其替换为其他 sprite 或更改颜色,但我不知道如何使用这个 spriteNodes 矩阵来实现,我想第一步是识别 sprite。

最佳答案

可以使用 delegation 来完成您正在尝试做的事情(即使我没有看到这样做的原因)图案。基本上,您将告诉您的代理(场景,或您设置为代理的任何内容)为您做某事,您将直接从按钮的 touchesBegan 方法中执行此操作。此外,您会将按钮的名称传递给场景。

要做到这一点,首先您必须定义一个名为 ButtonDelegate 的协议(protocol)。该协议(protocol)定义了一项要求,规定任何符合标准的类都必须实现一个名为 printButtonsName(_:) 的方法:

protocol ButtonDelegate:class {

func printButtonsName(name:String?)
}

这是将在您的 GameScene 类中实现的方法,但从按钮的 touchesBegan 中调用。此外,此方法将用于将按钮的名称传递给它的委托(delegate)(场景),因此您将始终知道点击了哪个按钮。

接下来是按钮类本身。 按钮 可能如下所示:

class Button : SKSpriteNode{

weak var delegate:ButtonDelegate?

init(name:String){
super.init(texture: nil, color: .purpleColor(), size: CGSize(width: 50, height: 50))
self.name = name
self.userInteractionEnabled = true
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}


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

delegate?.printButtonsName(self.name)
}
}

这里重要的是 userInteractionEnabled = true,这意味着按钮将接受触摸。另一个重要的事情是 delegate 属性。如前所述,按钮会将场景设置为它们的代表。将场景设置为按钮的代表将在稍后创建一些按钮时完成......为了让您更容易,将代表视为为其老板工作的 worker :)老板(一个按钮)告诉他的 worker (一个场景)为他做点什么(打印他的名字)。

好的,让我们确保场景符合 ButtonDelegate 协议(protocol)...为什么这很重要?这很重要,因为 worker (场景)必须服从老板(一个按钮)的命令。通过遵守此协议(protocol), worker 正在与他的老板签订契约(Contract),确认他知道如何完成工作并将服从他的命令:)

class GameScene: SKScene, ButtonDelegate {


override func didMoveToView(view: SKView) {

let play = Button(name:"play")
play.delegate = self
let stop = Button(name:"stop")
stop.delegate = self

play.position = CGPoint(x: frame.midX - 50.0, y: frame.midY)
stop.position = CGPoint(x: frame.midX + 50.0, y: frame.midY)

addChild(play)
addChild(stop)
}

func printButtonsName(name: String?) {

if let buttonName = name {
print("Pressed button : \(buttonName) ")
}

//Use switch here to take appropriate actions based on button's name (if you like)
}
}

就是这样。当您点击播放按钮时,按钮本身的 touchesBegan 将被调用,然后该按钮将告诉其委托(delegate)使用场景类内部定义的方法打印其名称。

关于swift - 如何检测触摸了哪个 SKSpriteNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com