向ColorSprites添加点按功能

时间:2018-05-10 16:55:08

标签: swift sprite-kit

制作Texas Hold'Em应用程序。这是我第一次使用sprite-kit。我目前的问题是我将卡片作为Color Sprite对象。

enter image description here

这是GameScene的卡片。忽略顶部的五张牌。我只希望底部两个具有翻转功能。

我的目标是让用户能够点击其中一张卡片,它将从卡片的背面翻转到手中的卡片,反之亦然。我目前的策略是使用此override func touchesBegan

数组playerOne是playerOne的牌。 cardOne和cardTwo是playerOne的牌。 FlippedOne和flippedTwo正在跟踪当前翻转的卡片。这样卡片就会单独翻转。 如果有多个玩家,则会重复相同的概念。

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

    if (playerCount == 0 && turn == 0) {
        let cardOne = playerOne[0].getNum()
        let cardTwo = playerOne[1].getNum()
        var flippedOne = 0
        var flippedTwo = 0
        for touch in touches {
            let location = touch.location(in: self)
            if (playerCardOne.frame.contains(location) && flippedOne == 0) {
                playerCardOne.texture = cardTextures[cardOne]
                flippedOne = 1
            }
            if (playerCardOne.frame.contains(location) && flippedTwo == 1) {
                playerCardOne.texture = back
                flippedOne = 0
            }
            if (playerCardTwo.frame.contains(location) && flippedTwo == 0) {
                playerCardTwo.texture = cardTextures[cardTwo]
                flippedTwo = 1
            }
            if (playerCardTwo.frame.contains(location) && flippedTwo == 0) {
                playerCardTwo.texture = back
                flippedTwo = 0
            }
        }
    }
}

如果有一种更好的方式让卡片翻转,我对这些想法持开放态度。 我想为什么这不起作用是因为它是一个覆盖功能。 目前发生的是我可以让其中一张牌从背面翻转到实际的牌面。之后,我无法让任何一张卡翻转。

1 个答案:

答案 0 :(得分:0)

为什么你不能重复运行代码的问题是因为你每次触摸开始时都要重置flippedOne和flippedTwo变量

将变量移到场景中,它将正常工作。

我还建议将它们转换为Bool以简化

在检查spriteNode是否包含位置

时,您也不需要frame属性

在Swift中也不需要围绕if语句的括号(你必须使用与Swift不同的语言)

private var flippedOne = false
private var flippedTwo = false

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

    let touch = touches.first
    let location = touch!.location(in: self)

    if card1.contains(location) {
        if flippedOne {
            card1.texture = back
            flippedOne = false
        }
        else {
            card1.texture = cardTextures[cardOne]
            flippedOne = true
        }
    }

    if card2.contains(location) {
        if flippedTwo {
            card2.texture = back
            flippedTwo = false
        }
        else {
            card2.texture = cardTextures[cardTwo]
            flippedTwo = true
        }
    }
}

触摸开始func中的if语句可以进一步简化为......

if card1.contains(location) {
    card1.texture = flippedOne ? back : cardTextures[cardOne]
    flippedOne = !flippedOne
}

if card2.contains(location) {
    card2.texture = flippedTwo ? back : cardTextures[cardTwo]
    flippedTwo = !flippedTwo
}