当然,在雪碧套件中也可以做到这一点。
问题:
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
如果根本没有十字路口。
最终结果如下: