【发布时间】:2018-06-28 21:58:12
【问题描述】:
我有一个非常奇怪的情况,从多边形创建的 SKShapeNode 在添加到 SKSpriteNode 时没有显示,但在基础 SKScene 上工作正常。 (更新 - 已解决,见问题结尾)
作为调试的一部分,我将另一个 SKSpriteNode 附加到 SKShapeNode,以在顶部显示另一个图像。
第二张图片总是出现。
所以工作层次结构是:
- SKScene
- SKShapeNode - 蓝色形状
- SKSpriteNode - 蚂蚁图片
- SKShapeNode - 蓝色形状
在第一张图片上裁剪了空白 - Ant 在两张图片中的位置相同。
非工作层次结构是:
- SKScene
- SKSpriteNode - 脚图片
- SKShapeNode - 蓝色形状(未绘制但其附加的 Ant 是)
- SKSpriteNode - 蚂蚁图片
- SKShapeNode - 蓝色形状(未绘制但其附加的 Ant 是)
- SKSpriteNode - 脚图片
希望这里有足够的代码来帮助人们弄清楚发生了什么。请注意:
- 这不是使用点数组构造绘图的副作用 - 如果我使用
init(rect:)或init(rectOf:)创建一个简单的矩形形状,也会发生同样的事情 - 它发生在设备和模拟器上。
按照 cmets 中的建议,在缩放到调试后更新
场景背景设置为红色以使其清晰。
感谢您的任何建议,我在这里束手无策。
将绘图和蚂蚁图片附加到节点的代码
override func applyTo(node:SKNode) -> Bool {
var pointsVec = renders[0].rescaledPoints().map{ tp in tp.loc }
let numPointsNow = pointsVec.count
if numPointsNow==0 {
return false
}
let draw = SKShapeNode(points: &pointsVec, count: numPointsNow)
draw.lineWidth = 1
draw.fillColor = fillColor
draw.strokeColor = fillColor
draw.position = CGPoint(x: 0, y: 0)
node.addChild(draw)
let antNode = SKSpriteNode(imageNamed: "Ant05_150px.png")
antNode.position = CGPoint(x:0.0, y:0.0) // for anchor 0,0
antNode.size = CGSize(width: node.frame.width, height: node.frame.height)
antNode.anchorPoint = CGPoint(x: 0.0,y: 0.0)
draw.addChild(antNode)
return true
}
制作用于脚的 SKSpriteNode 的工厂函数
override func makeBackgroundNode(_ within:CGSize) -> SKNode? {
let bgNode = SKSpriteNode(imageNamed: imageName)
bgNode.size = within
bgNode.position = CGPoint(x:0.0, y:0.0) // for anchor 0,0
bgNode.anchorPoint = CGPoint(x: 0.0,y: 0.0)
return bgNode
}
使用 makeBackground 的场景工厂
func makeSKScene(_ within:CGSize) -> SKScene? {
let scene = tgSKSceneWithTouch(size: within)
playingBounds = within
var rootNode : SKNode = scene
if let bg = currentScene?.background {
if let bgNode = bg.makeBackgroundNode(within) {
scene.addChild(bgNode)
rootNode = bgNode
}
...
currentScene?.applyTo(sourceOfTouches:scene, nodeToAttachChildrenTo:rootNode)
// iterates down through non-SpriteKit logic to invoke the applyTo
}
答案
在applyTo 中显式设置 zPosition 可以解决此问题!
draw.zPosition = node.zPosition + 1
node.addChild(draw)
这似乎与the docs直接矛盾
如果多个节点共享相同的 z 位置,则对这些节点进行排序,以便在其子节点之前绘制父节点,并且按照它们在父节点的子数组中出现的顺序呈现兄弟节点。
让我得出结论,形状节点的默认 zPosition 不同,或者由于其他原因,此机制不适用于此处! (可能是因为节点类型的变化?)
【问题讨论】:
-
你的
applyTo在哪里被调用? -
我现在的猜测是您的形状确实存在,但是这些点与 SKSpriteNode 无关,而是相对于场景而言是绝对的,这将其扔掉了。为了验证我的理论,在您的 SKS 文件中,将宽度和高度添加 10 的倍数。随着缩放模式的启动,这将使所有东西缩小 10 倍,但你应该在远处的某个地方看到你的蓝色脚。
-
感谢@Knight0fDragon 给了我一个线索!将场景缩放 10 后,如果我将脚节点定位在 0,0,它会出现(很小)在屏幕的左下角,没有蓝色覆盖的迹象。如果我让足部锚点为默认值 0.5,0.5 并将其定位在巨型场景的计算中间,则会出现蓝色叠加层——在足部图片的上方和右侧,部分在足部图片的后面。我正在玩一些缩放的东西,看看我能不能把它拉得更近。
-
等你看到它在脚后?那么你也有 zposition 的问题,你需要担心
-
我对明显落后的绘图感到非常困惑 - 我认为 zPosition 仅适用于 SIBLINGS。已在调试器中确认正在调用 addChild(draw) 的节点是带有脚图片的精灵。这里没有兄弟姐妹 - 所有嵌套的孩子
标签: sprite-kit