【问题标题】:Detecting when a user taps a SKSpriteNode检测用户何时点击 SKSpriteNode
【发布时间】:2015-02-15 12:05:39
【问题描述】:

我是 Swift 编程的新手,我决定从 SpriteKit 开始制作一个简单的游戏。我有一个 SpriteNode,它应该选择 6 个位置中的 1 个并在被点击时移动到那里,但是从我所看到的方法中我无法弄清楚如何实现它(我还是新手)这里是我来自 GameScene.swift 文件的代码:

import SpriteKit

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {

    let screenSize: CGRect = UIScreen.mainScreen().bounds
    let greenTileWidth = screenSize.width * 0.5
    let greenTileHeight = screenSize.height * 0.33
    let greenTilePositionY = [greenTileHeight / 2, greenTileHeight / 2 + greenTileHeight, greenTileHeight / 2 + greenTileHeight * 2 ]
    let greenTilePositionX = [greenTileWidth / 2, greenTileWidth / 2 + greenTileWidth]

    let backgroundTile = SKSpriteNode(imageNamed: "whiteTile")
    backgroundTile.size.width = screenSize.width * 100
    backgroundTile.size.height = screenSize.height * 100
    addChild(backgroundTile)

    let greenTile = SKSpriteNode(imageNamed: "greenTile")
    greenTile.size.width = greenTileWidth
    greenTile.size.height = greenTileHeight
    greenTile.position.y = greenTilePositionY[0]
    greenTile.position.x = greenTilePositionX[0]
    greenTile.userInteractionEnabled = true
    addChild(greenTile)

    var randomX:Int = 0
    var randomY:Int = 0


    func getRandomY() -> Int{
        randomY = Int(arc4random_uniform(26))%3
        return randomY
    }

    func getRandomX() -> Int{
        randomX = Int(arc4random_uniform(26))%2
        return randomX
    }

    func moveGreenTile(){
        greenTile.position.x = greenTilePositionX[randomX]
        greenTile.position.y = greenTilePositionY[randomY]

    }

    getRandomX()
    getRandomY()
    moveGreenTile()

}

当 SpriteNode greenTile 被点击时,getRandomY() getRandomX() 和 moveGreenTile() 应该被调用。

【问题讨论】:

    标签: ios swift sprite-kit touch skspritenode


    【解决方案1】:

    首先您必须设置SKSpriteNodesname 属性:

    greenTile.name = "greenTile"
    

    首先我看到您的代码中有一些错误。 getRandomXgetRandomY 的返回值永远不会被真正使用。因为您设置了randomXrandomY 变量而没有实际调用getRandom。因此,您应该将其更新为:

    func moveGreenTile(){
        greenTile.position.x = greenTilePositionX[getRandomX()]
        greenTile.position.y = greenTilePositionY[getRandomY()]
    
    }
    

    这样你只需要调用moveGreenTile,它就会自己调用getRandom方法。

    然后你必须使用touchesBegan 方法来检查用户是否触摸了屏幕。因此,使用名称,您可以通过检查您之前设置的名称来检查用户是否触摸了greenTile

     override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        for touch in touches{
    
            let location = touch.locationInNode(self)
            let node:SKNode = self.nodeAtPoint(location)
    
            if(node.name == "greenTile"){
               moveGreenTile()
            }
    
        }
    
    }
    

    【讨论】:

    • 我添加了您的代码,但它给出了错误“只能在类成员上指定覆盖”,并且 if 语句中的 moveGreenTile() 给出了错误“无法引用具有来自另一个本地捕获的本地函数函数”
    • 这个答案似乎检测到 SKSpriteNode 是否被触摸,而不是按照请求的问题被点击?
    【解决方案2】:

    此代码检测 SKSpriteNode 上的点击事件,而不仅仅是触摸。

    您可以通过修改TapMaxDelta来更改轻击手势的敏感程度。

    class TapNode : SKSpriteNode {
    
        // Tap Vars
        var firstPoint : CGPoint?
        var TapMaxDelta = CGFloat(10)
    
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    
        init() {
            let texture = SKTexture(imageNamed: "Test.png")
            super.init(texture: texture, color: UIColor.clear, size: texture.size())
    
            isUserInteractionEnabled = true
        }
    
    
        // ================================================================================================
        // Touch Functions
        // ================================================================================================
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let firstTouch = touches.first {
                firstPoint = firstTouch.location(in: self)
            }
        }
    
    
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {}
    
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            if let firstTouch = touches.first, let firstPoint = firstPoint {
                let curPoint = firstTouch.location(in: self)
    
                if abs(curPoint.x - firstPoint.x) <= TapMaxDelta && abs(curPoint.y - firstPoint.y) <= TapMaxDelta {
                    print("tap yo")
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多