当前位置: 首页 > 面试题库 >

如何检测已触摸哪个SKSpriteNode

狄令
2023-03-14
问题内容

我发现了一个类似的问题,但是我试图检测并识别用户触摸哪个Sprite,但我不知道该怎么做。这是我的变量:

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

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


问题答案:

您正在尝试执行的操作(即使我没有看到这样做的原因)也可以使用委派模式来完成。基本上,您将告诉您的代表(场景或您设置为代表的任何对象)为您做某事,然后您将直接在按钮的touchesBegan方法内执行该操作。另外,您还将按钮的名称传递给场景。

为此,首先必须定义一个名为的协议ButtonDelegate。该协议定义了一个要求,该要求指出任何符合条件的类都必须实现一种称为的方法printButtonsName(_:)

protocol ButtonDelegate:class {

   func printButtonsName(name:String?)
}

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

接下来是按钮类本身。Button可能看起来像这样:

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财产。如前所述,按钮将场景设置为其委托。当我们创建一些按钮时,将场景设置为按钮的代表将在稍后完成…为了使您更轻松,请考虑将代表视为为老板工作的工人:)老板(一个按钮)告诉他的工人(一个场景)为他做某事(打印他的名字)。

好的,因此请确保场景符合ButtonDelegate协议……为什么这很重要?这很重要,因为工人(场景)必须遵循老板的命令(按钮)。通过遵守此协议,工人正在与老板签定合同,在合同中确认他知道自己的工作方式并将遵守他的命令:)

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按钮本身将被调用,然后该按钮将告诉其委托使用场景类内部定义的方法打印其名称。



 类似资料:
  • 问题内容: 我试图检测我的sprite节点是否已被触摸并且我不知道从哪里开始。 问题答案: 首先将的属性设置为字符串。 然后在功能上 这是一种方法。 您也可以继承并覆盖其中的内部。 然后做

  • 本文向大家介绍sprite-kit 检测触摸,包括了sprite-kit 检测触摸的使用技巧和注意事项,需要的朋友参考一下 示例 您可以覆盖4种SKScene检测用户触摸的方法 请注意,每种方法都接收一个touches参数(在特定情况下),该参数可以包含一个以上的单个触摸事件。

  • 在过去的几天里,我一直在将我的游戏(Apopalypse)移植到Android Mobile平台。我在Google上快速搜索了精灵触摸检测,但没有找到任何有用的东西。每个气球触摸一次就会弹出,我只需要检测它是否被触摸。这是我的气球生成代码: 渲染(x、y、宽度和高度随机): 在主游戏类中产卵:

  • 问题内容: 在Javascript / jQuery中,如何检测客户端设备是否有鼠标? 我有一个网站,当用户将鼠标悬停在某个项目上时,该网站会在信息面板上向上滑动。我正在使用jQuery.hoverIntent来检测悬停,但这显然不适用于iPhone/ iPad / Android等触摸屏设备。因此,在这些设备上,我想还原为点按以显示信息面板。 问题答案: +1,两者兼而有之。另一种方法是使用CS

  • 问题内容: 我正在尝试获取所选项目,然后开始一些活动。不幸的是,我发现的大多数解决方案都在Objective-C或不起作用。 方法不打印标签。 有人可以帮我吗? 经过几次尝试,我将代码更改为与我发现的教程不同的代码。而且它也不起作用。现在我认为这是iOS模拟器的问题… 问题答案: 如果您想从单元格中获取值,则无需在 任务如下: 您还必须检查您必须设置的标识符。 希望能帮助到你。

  • 我有一个主页按钮图标,它只是一个普通的精灵,里面有一个图像。我想在触摸这个按钮时执行一些操作。如何将触摸式监听器添加到此按钮,或者有其他更简单的方法来实现此目的吗?