0

我是 Swift 编程新手。我正在尝试创建一个游戏,其中有一堆在屏幕上随机移动的精灵。假设我有一堆简单的 2D 图像精灵。随着精灵向上移动(因为在 y 位置增加),我希望它看起来更向后移动到其他精灵后面,所以我希望 zPosition 与其他精灵相比减少。游戏如何处理这个问题?如果我有 100 个在屏幕上随机移动的精灵怎么办?我什至不知道如何处理这个问题,所以任何帮助都将不胜感激。

第二个更高级的概念。所以假设每个精灵都有多层子精灵,比如手臂、腿、衣服、武器等。(我的精灵是高度可定制的。)然后每个精灵随机走动,当它们移动到其他精灵后面时,它们需要出现在正确的 zPosition 中精灵。我如何确保所有的手臂、腿、衣服和其他精灵层正确地出现在每个其他精灵的前面或后面?如果我有一个具有 20 层子精灵的精灵,并且它需要在具有 20 个子精灵的其他精灵前后无缝移动怎么办?这可能是错误的方向,但我可以以某种方式将一个精灵及其子图层制作为一层(或将所有左臂精灵制作为一层,将右臂精灵制作为另一层)?我看到可以处理这个问题的游戏,但是什么 这是如何处理的背后的概念?(我看到的一个游戏就是我想要的Fallout Shelter,每个人都有手臂,腿,武器等,他们走在其他人的前面或后面,所有的精灵都以正确的方式出现,但不像Fallout庇护我的游戏具有完全平坦的 2D 图像,这就是我希望它保持的方式。)

第三个更高级的概念。如果我想让这些精灵像一个精灵的手臂抓住另一个精灵一样交互怎么办(所以一只手臂将在第二个精灵人的后面,但另一只手臂将完全在另一个精灵人的前面)?如何处理图层以显示在正确的 zPosition 中?也许这是不可能的?好的,我完成了。很抱歉在一篇文章中提出了一百万个问题。我正在寻找这些问题背后的概念,以便开始计划和编程。谢谢你的帮助。

4

1 回答 1

0

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 的地方构建的,我们不能覆盖它的位置。

所有这三种方法都需要大量工作,并且需要针对您的游戏环境进行独特的优化才能有效运行,我不会详细说明如何做到这一点。

于 2017-10-27T14:09:29.693 回答