touchesBegan Swift 2 自定义 SpriteKit 节点

Posted

技术标签:

【中文标题】touchesBegan Swift 2 自定义 SpriteKit 节点【英文标题】:touchesBegan Swift 2 custom SKSpriteKit Nodes 【发布时间】:2016-01-05 23:08:40 【问题描述】:

我是创建游戏的新手,因此作为一种练习,我目前正在制作一个愚蠢的游戏。这个游戏有一个包含按钮 (0-9) 的公文包 我想将按下的数字的值保存在一个数组中。如果按下特定类型,我不确定如何使用触摸开始执行特定操作。 按钮输入:

class ButtonInput: SKSpriteNode

var value: Int = 0

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



加载视图():

let briefcase = ButtonInput(imageNamed: "briefcase")
    let Button0 = ButtonInput(imageNamed: "Button0")
    let Button1 = ButtonInput(imageNamed: "Button1")
    let Button2 = ButtonInput(imageNamed: "Button2")
    let Button3 = ButtonInput(imageNamed: "Button3")
    let Button4 = ButtonInput(imageNamed: "Button4")
    let Button5 = ButtonInput(imageNamed: "Button5")
    let Button6 = ButtonInput(imageNamed: "Button6")
    let Button7 = ButtonInput(imageNamed: "Button7")
    let Button8 = ButtonInput(imageNamed: "Button8")
    let Button9 = ButtonInput(imageNamed: "Button9")


    Button0.value = 0
    Button1.value = 1
    Button2.value = 2
    Button3.value = 3
    Button4.value = 4
    Button5.value = 5
    Button6.value = 6
    Button7.value = 7
    Button8.value = 8
    Button9.value = 9

更新:

经过数小时的研究后,我开始尝试进行接触,我想出了这个:

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


    for touch: AnyObject! in touches 
        let touchLocation = touch.locationInNode(self)
        let touchedNode = self.nodeAtPoint(touchLocation)
        let name = touchedNode.name

            if name == "Button0"
            
                userSequence.append(Button0.value)
                print("Button0 pressed")
            
            if name == "Button1"
            
                userSequence.append(Button1.getValue())
                print("Button1 pressed")
            
            if name == "Button2"
            
                userSequence.append(Button2.value)
            
            if name == "Button3"
            
                userSequence.append(Button3.value)
            
            if name == "Button4"
            
                userSequence.append(Button4.value)
            
            if name == "Button5"
            
                userSequence.append(Button5.value)
            
            if name == "Button6"
            
                userSequence.append(Button6.value)
            
            if name == "Button7"
            
                userSequence.append(Button7.value)
            
            if name == "Button8"
            
                userSequence.append(Button8.value)
            
            if name == "Button9"
            
                userSequence.append(Button9.value)
            
            if name == "ButtonEnter"
            
                compareSequences()
            
    



【问题讨论】:

【参考方案1】:

如果你使用 SpriteKit,我会这样做:

import SpriteKit

var _button = [SKSpriteNode]()

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

    for touch in touches 
        let location = touch.locationInNode(self)

        if(self.nodeAtPoint(location).name != nil && self.nodeAtPoint().name != "enter") 
            _array.append(self.nodeAtPoint(location).name)
        
    


func loadView() 

    for(var i = 0; i < 10; i++) 
        let tempButton = SKSpriteNode(imageNamed: "Button\(i)")
        tempButton.position = CGPoint(x: yourValue, y: yourValue)
        tempButton.size = CGSize(width: yourValue, height: yourValue)
        tempButton.name = "\(i)"
        temButton.zPosition = 2
        _button.append(tempButton)
        self.addChild(_button.last!)
    


如果您在游戏中没有其他 SKSpriteNode,这将起作用,因为在开始触摸时,我假设触摸的精灵有一个数字 (0-9)。为了解决这个问题,您可以添加一个 if 语句来验证名称是否在 0-9 之间。

希望对您有所帮助!

【讨论】:

感谢您的建议,但我最终将拥有另一个 SKSpriteNode(输入按钮),以便用户必须点击它以确认他们已选择序列。我也根据我的发现对帖子进行了更新。 例如,为您的输入按钮命名为“输入”,并在触摸开始功能中添加代码 if(self.nodeAtPoint(location).name != nil && self.nodeAtPoint().name ! = "enter") 我已经编辑了我的答案... 感谢您的帮助!我希望 _array 来存储 self.nodeAtPoint(location).name 的整数值。任何想法如何?另外,如果我可能会问,您是如何教授编码和游戏开发的?我是我大学计算机工程专业的二年级学生,我刚刚从 C 语言中学习了基本的编码,从 Java 课程中学习了基本的 OPP。我想知道是否有任何教科书或可以阅读的东西来帮助我更好地理解一切。再次感谢您 要插入 self.nodeAtPoint(location).name,只需将字符串转换为 int。举个例子: var _array = [Int]() do: _array.append(Int(self.nodeAtPoint(location).name!)!) -我建议你阅读苹果书关于 Swift 的内容:apple.co/1DgqEVo -另外你可以在 UDemy.com 网站上搜索 SpriteKit 和 Swift 开发,你会发现一些有趣的课程并且堆栈溢出是找到问题答案的好地方:) 谢谢。最后,我希望在运行程序时按钮的位置消失。请到这里正确查看代码:gyazo.com/ace1957ad664e7e75d7721e8995c47d0 当我运行这个时,我的按钮不再在同一个地方(它们甚至不在屏幕上)【参考方案2】:

您应该在主故事板上制作按钮,并将它们连接到视图控制器。然后你可以为连接的动作中的每个按钮编写 func

希望对你有帮助

【讨论】:

以上是关于touchesBegan Swift 2 自定义 SpriteKit 节点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?

如何将 touchesBegan 和 touchesEnded 限制为仅一次触摸?

无法触摸在 Swift 中移动的 UIImageView

Obj-C - touchesBegan:在定义的区域

Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan

静态 tableView 中的 touchesBegan 未被调用