检测用户何时点击SKSpriteNode

时间:2015-02-15 12:05:39

标签: ios swift sprite-kit touch skspritenode

我是快速编程的新手,我决定用SpriteKit开始一个简单的游戏。我有一个SpriteNode应该选择6个位置中的一个并在点击它时移动到那里,但是从我看到的方法我无法弄清楚如何实现它(再次我是新的)这里是我的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()。

2 个答案:

答案 0 :(得分:0)

首先,您必须设置name的{​​{1}}属性:

SKSpriteNodes

首先,我在您的代码中看到了一些错误。 greenTile.name = "greenTile" getRandomX的返回值永远不会被真正使用。因为您设置了getRandomYrandomX变量而没有实际调用randomY。所以你应该把它更新为:

getRandom

这样您只需致电func moveGreenTile(){ greenTile.position.x = greenTilePositionX[getRandomX()] greenTile.position.y = greenTilePositionY[getRandomY()] } ,它就会自行调用moveGreenTile方法。

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

greenTile

答案 1 :(得分:0)

此代码检测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")
            }
        }
    }
}