我有两个SKSpriteNodes
,它们是纯色(红色和蓝色)的基本矩形。
当用户拖动它们时。我想检查两个节点是否相交,并改变第一个节点与第二个节点相交的部分的颜色。
我能够通过使用节点的.intersects(..)
属性来判断节点是否相交。
但是我无法弄清楚如何获得实际的交叉区域以及如何将节点的那部分颜色与其原始颜色进行着色。
答案 0 :(得分:1)
它可以变得有点时髦,但是在你的节点通过交叉检查之后:
currencyDecimalSymbol
我们现在有了交叉矩形,所以让我们制作一个颜色精灵
//Note: I am assuming both frames are on the same parent node, you may need to convert if parents are different
let intersection = sprite1.frame.intersection(sprite2.frame)
将其添加到场景
let miniSprite = SKSpriteNode(color:.red,size:intersection.size)
miniSprite.alpha = 0.5
设置位置
sprite1.parent.addChild(miniSprite)
将其移至sprite1(这将为我们转换位置)
miniSprite.anchorPoint = CGPoint(x:0.0,y:0.0)
miniSprite.position = intersection.origin
我们现在有一个不同颜色的盒装区域。
但我们的精灵不是正方形?你可能会问。
这就是miniSprite.move(toParent:sprite1)
进来的地方。
让我们制作裁剪节点。
SKCropNode
我们想要将sprite1添加为掩码节点
let croppedNode = SKCropNode()
然后将其作为子项添加到sprite1 sprite1.addChild(croppedNode)
我们现在有一个带有精灵掩码的裁剪节点,让我们将迷你节点移动到这个新的裁剪节点
croppedNode.maskNode = sprite1.copy() as? SKNode
我们走了,你现在应该有交叉发生的颜色。
最终代码应如下所示:
miniSprite.move(toParent:croppedNode)
现在要记住一些事情,
zPosition可能需要调整
以下是工作的示例:
let intersection = sprite1.frame.intersection(sprite2.frame)
let miniSprite = SKSpriteNode(color:.red,size:intersection.size)
miniSprite.alpha = 0.5
sprite1.parent!.addChild(miniSprite)
miniSprite.anchorPoint = CGPoint(x:0.0,y:0.0)
miniSprite.position = intersection.origin
let croppedNode = SKCropNode()
croppedNode.maskNode = sprite1.copy() as? SKNode
croppedNode.anchorPoint = CGPoint(x:0.5,y:0.5)
sprite1.addChild(croppedNode)
miniSprite.move(toParent:croppedNode)