【问题标题】:SpriteKit: Change color of part of sprite which is intersecting with another spriteSpriteKit:更改与另一个精灵相交的部分精灵的颜色
【发布时间】:2017-07-14 21:34:44
【问题描述】:

我有两个SKSpriteNodes,它们是纯色(红色和蓝色)的基本矩形。

当用户拖动它们时。我想检查两个节点是否相交并更改第一个节点与第二个节点相交的部分的颜色。

我可以通过使用节点的.intersects(..) 属性来判断节点是否相交。

但我不知道如何获得实际的交叉区域以及如何将节点的那部分着色与其原始颜色不同。

【问题讨论】:

  • 没有任何内置功能可以解决问题。您应该自己计算交叉区域。或者,也许您可​​以尝试在精灵上使用 blendMode...

标签: swift sprite-kit skspritenode


【解决方案1】:

它可能有点古怪,但是在你的节点通过相交检查之后:

//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)

设置位置

miniSprite.anchorPoint = CGPoint(x:0.0,y:0.0)
miniSprite.position = intersection.origin

将它移动到 sprite1(这将为我们转换位置)

miniSprite.move(toParent:sprite1)

我们现在有一个不同颜色的盒装区域。

但是我们的精灵不是正方形?你可能会问。

这就是SKCropNode 的用武之地。

让我们做一个裁剪节点。

let croppedNode = SKCropNode()

我们想添加我们的 sprite1 作为掩码节点

croppedNode.maskNode = sprite1.copy() as? SKNode

然后将它作为一个孩子添加到 sprite1 sprite1.addChild(croppedNode)

我们现在有了一个带有精灵蒙版的裁剪节点,让我们将迷你节点移动到这个新的裁剪节点

miniSprite.move(toParent:croppedNode)

我们开始了,您现在应该在交叉点出现颜色。

最终的代码应该是这样的:

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)

现在要记住一些事情,

zPosition 可能需要调整

这是它的工作示例:

override func didMove(to view: SKView) {
    let sprite1 = SKSpriteNode(imageNamed: "Spaceship")
    sprite1.anchorPoint = CGPoint(x:0.5,y:0.5)
    sprite1.position = CGPoint.zero
    sprite1.zPosition = 1



    let sprite2 = SKSpriteNode(imageNamed: "Spaceship")
    sprite2.anchorPoint = CGPoint(x:0.5,y:0.5)
    sprite2.position = CGPoint(x:0,y:300)
    addChild(sprite1)
    addChild(sprite2)

    let intersection = sprite1.frame.intersection(sprite2.frame)
    let miniSprite = SKSpriteNode(color:.red,size:intersection.size)
    miniSprite.alpha = 0.5

    miniSprite.anchorPoint = CGPoint(x:0.0,y:0.0)
    miniSprite.position = intersection.origin
    miniSprite.zPosition = 2
    sprite1.parent!.addChild(miniSprite)
    let croppedNode = SKCropNode()
    croppedNode.maskNode = sprite1.copy() as? SKNode
    croppedNode.zPosition = 3
    sprite1.addChild(croppedNode)

    let biggy = SKSpriteNode(color: .white, size: (scene?.size)!)
    miniSprite.move(toParent:croppedNode)
}

【讨论】:

  • 请让我知道这是否真的有效,或者我是否需要进行更改。
  • 哇,非常详尽的答案。我现在正在做一个不同的项目,但是当我回到这个问题时,我一定会尝试这个,如果可行,我会接受你的回答,如果不行,就让你回答。
  • 大声笑,我给了你一个证明它有效,如果它不是你做的事情不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多