代码之家  ›  专栏  ›  技术社区  ›  Yann

精灵套件:带有两个精灵的彩色异或逻辑。黑+黑=白

  •  0
  • Yann  · 技术社区  · 7 年前

    你知道拼图游戏voi吗?这是一个使用颜色异或逻辑的游戏。这意味着:黑+黑=白。

    https://www.youtube.com/watch?v=Aw5BdVcAtII

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   user8606263 user8606263    7 年前

    当然,在雪碧套件中也可以做到这一点。

    问题:

    squareA squareB . 用户可以将这两个正方形拖动到任何他想要的地方。他一次只能拖动一个正方形。每当两个正方形相交时,您希望将相交区域着色为白色。

    private var squareA: SKSpriteNode?
    private var squareB: SKSpriteNode?
    private var squares = [SKSpriteNode]()
    private var selectedShape: SKSpriteNode?
    private var intersectionSquare: SKShapeNode?
    
    • 正方形 方块B
    • squares 是一个数组,它将存储屏幕上显示的所有方块。
    • selectedShape 将帮助我们跟踪当前正在拖动的正方形。
    • intersectionSquare

    正方形 方块B ,并将其添加到 方块

        squareA = SKSpriteNode(color: .black, size: CGSize(width: 190.0, height: 190.0))
    
        if let squareA = self.squareA {
            squareA.position = CGPoint(x: -200, y: 200)
            squareA.name = "Square A"
            squares.append(squareA)
            self.addChild(squareA)
        }
    
        // Do the same for squareB or any other squares that you have on screen..
    

    注意:正如你所看到的,我在这里给它起了个名字,只是为了在测试阶段更容易区分它们。

    当用户拖动正方形时检测:

    现在,您需要检测用户何时拖动正方形。为此,您可以使用:

        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            for t in touches { self.touchDown(atPoint: t.location(in: self)) }
        }
    
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            for t in touches { self.touchMoved(toPoint: t.location(in: self)) }
        }
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            for t in touches { self.touchUp(atPoint: t.location(in: self)) }
        }
    
        override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
            for t in touches { self.touchUp(atPoint: t.location(in: self)) }
        }
    

    然后,您需要设置 touchDown touchMoved touchUp 方法:

     func touchDown(atPoint pos : CGPoint) {
    
            let touchedNode = self.nodes(at: pos)
    
            guard let selectedSquare = touchedNode.first as? SKSpriteNode else {
                return
            }
    
            selectedShape = selectedSquare
        }
    
        func touchMoved(toPoint pos : CGPoint) {
    
            guard let selectedSquare = self.selectedShape else {
                return
            }
    
            selectedSquare.position = pos
    
            checkIntersectionsWith(selectedSquare)
        }
    
        func touchUp(atPoint pos : CGPoint) {
            selectedShape = nil
        }
    

    • 触地得分

    嗯,我们需要用户一次只能拖动一个正方形。使用 nodes(at:) 方法,很容易知道触摸了哪个方块,我们可以知道我们的集合 选定形状 变量等于被触摸的平方。

    • 触摸已移动 方法:

    用户移动手指的位置。我们也称之为 checkIntersectionsWith() 方法,我们将在一秒钟内设置。

    • 修补 方法:

    用户将手指从屏幕上松开,因此我们可以设置 选定形状 到零。

    更改相交帧的颜色:

    private func checkIntersectionsWith(_ selectedSquare: SKSpriteNode) {
    
        for square in squares {
    
            if selectedSquare != square && square.intersects(selectedSquare) {
    
                let intersectionFrame = square.frame.intersection(selectedSquare.frame)
    
                intersectionSquare?.removeFromParent()
                intersectionSquare = nil
    
                intersectionSquare = SKShapeNode(rect: intersectionFrame)
    
                guard let interSquare = self.intersectionSquare else {
                    return
                }
    
                interSquare.fillColor = .white
                interSquare.strokeColor = .clear
                self.addChild(interSquare)
    
            }  else if selectedSquare != square {
    
                intersectionSquare?.removeFromParent()
                intersectionSquare = nil
            }
        }
    }
    

    每次 方法时,我们将迭代位于 intersection() 方法,如果选定的正方形与其中任何一个相交(自身除外)。如果有,那么我们创建一个白色正方形,名为 相交正方形

    为了节省内存使用量,可以从场景中删除正方形并设置 相交正方形 nil 如果根本没有十字路口。

    最终结果如下:

    enter image description here