1)随着精灵向上移动(因为在 y 位置增加),我希望它看起来更向后移动到其他精灵后面,所以我希望 zPosition 与其他精灵相比减少。游戏如何处理这个问题?
这可以简单地通过创建一个自定义类(我不建议扩展它)并将 zPosition 覆盖为 Y 的倒数来完成
例如
class Player : SKSpriteNode
{
override var zPosition : CGFloat
{
get
{
//Yes it looks weird to be setting zPosition on get, but we want to ensure the variable storing zPosition is also changed in case any property reads it
super.zPosition = -super.position.y
return super.zPosition
}
set
{
//do nothing
}
}
}
2)如果屏幕上有 100 个精灵都在随机移动怎么办?
覆盖它将处理屏幕上的每个精灵(在我的示例中为“播放器”类型),y 位置确定 zPosition
3)我如何确保所有的手臂、腿、衣服和其他层的精灵正确地出现在每个其他精灵的前面或后面?现在这有点棘手。zPosition 是相对于其父级的,因此您需要考虑您的 sprite 可以明智地获得 zPosition 的层数,并相应地进行计划。假设我们有一个带有衬衫裤子和腰带的精灵。
如果我们像这样构造精灵:
body
->shirt
->pants
->belt
然后我们可以将这些子节点的所有 zPosition 设置为 0,因为渲染顺序将使用 zPosition 后跟树顺序,并且什么都不会改变:
但如果我们这样构造它:body
->shirt
->pants
--->belt
并且我们想要将衬衫的效果放在裤子和腰带之间,那么我们需要通过将衬衫和腰带的 zPosition 设置为 1 来进行补偿。
4)如果我有一个有 20 层子精灵的精灵,它需要在其他有 20 层子精灵的精灵前后无缝移动怎么办?现在我们遇到了与其他精灵战斗的问题,所以我们需要对 Player 上的 zPosition 应用一些数学来修复它。类播放器:SKSpriteNode {
override var zPosition : CGFloat
{
get
{
//Yes it looks weird to be setting zPosition on get, but we want to ensure the variable storing zPosition is also changed in case any property reads it
super.zPosition = -super.position.y * 2 //(We need at least 2 zPosition slots reserved for every sprite)
return super.zPosition
}
set
{
//do nothing
}
}
}
5)但是我可以以某种方式将一个精灵及其子图层制作为一层(或将所有左臂精灵制作为一层,将右臂精灵制作为另一层)?6) 我看到了处理这个问题的游戏,但是处理这个问题背后的概念是什么?是的,您可以使用view.texture(from:)
将任何节点转换为纹理,然后从纹理中创建一个新的精灵。
7)如果我想让这些精灵像一个精灵的手臂抓住另一个精灵一样交互怎么办(所以一只手臂将在第二个精灵人的后面,但另一只手臂将完全在另一个精灵人的前面 8)图层如何处理后出现在正确的 zPosition 9) 也许这是不可能的?
这部分现在变得很棘手,我们需要更改每个节点的 zPosition,而不是进行乘法运算。
我们还需要计算每个精灵的绝对位置,以了解我们在 y 轴上的位置
为了做到这一点,我们至少有 3 个选项,
a)我们可以为我们放置在场景中的每个节点制作自定义协议 + 自定义类 b)可以为我们放置在场景中的节点类型编写扩展(例如 SKSpriteNode 和SKShapeNode),除了 SKNode,因为它是基节点类 c)我们可以做一些称为键值观察的事情,我们需要监听position
精灵何时发生变化。我们需要做 KVO 的原因是因为你的 sprite 可能是在你有 SKNode 的地方构建的,我们不能覆盖它的位置。
所有这三种方法都需要大量工作,并且需要针对您的游戏环境进行独特的优化才能有效运行,我不会详细说明如何做到这一点。