[英]How to handle multiple sprites' zPositions as they move around each other?
我是Swift编程的新手。 我正在尝试创建一个游戏,其中有一堆在屏幕上随机移动的精灵。 假设我有一堆简单的2D图像精灵。 当精灵向上移动(随着y位置的增加)时,我希望它看起来向后移动到其他精灵后面,因此我希望zPosition与其他精灵相比有所减少。 游戏如何处理? 如果屏幕上有100个随机移动的精灵怎么办? 我什至对它的处理方式甚至都没有一个大致的了解,因此我们将不胜感激。
第二个更高级的概念。 假设每个精灵都有多层子精灵,例如手臂,腿,衣服,武器等。(我的精灵是高度可定制的。)然后,每个精灵随机走动,并需要在正确的zPosition中出现,因为它们在其他位置后面移动精灵。 我如何确保所有手臂,腿,衣服和其他精灵的层正确显示在其他精灵的前面或后面? 如果我有一个带有20个Sprite子级的Sprite,并且需要在具有20个Sprite子级的其他Sprite的前后无缝移动,该怎么办? 这可能是错误的方向,但是我可以以某种方式使一个子画面及其子层变成1层(或使所有左臂子画面变成1层,而右臂子画面变成另一层)吗? 我看到可以处理这种情况的游戏,但是处理方式背后的概念是什么? (我看到一种游戏,我想要做的就是“辐射防护棚”,其中每个人都有手臂,腿,武器等,他们在其他人的前面或后面行走,所有精灵都以正确的方式出现,但是与“辐射”不同庇护我的游戏具有完全平坦的2D图像,这就是我希望它保持不变的方式。)
第三更先进的概念。 如果我希望这些子画面像一个子画面的手臂抓住另一个子画面(这样,一个手臂将在另一个子画面人的后面,而另一条手臂将完全在另一个子画面人的前面)交互,该怎么办? 如何处理图层以使其显示在正确的zPosition中? 也许这是不可能的? 好吧,我完成了。 很抱歉将一百万个问题发布到一个帖子中。 我正在寻找这些问题背后的概念,以便可以开始进行规划和编程。 谢谢你的帮助。
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个随机移动的精灵怎么办?
覆盖此位置将处理屏幕上的每个子画面(在我的示例中为“ Player”类型),y位置确定zPosition
3)如何确保所有手臂,腿,衣服和其他精灵的图层正确显示在其他精灵的前面或后面? 现在,这变得有些棘手。 zPosition是相对于其父对象的,因此您需要考虑您的精灵可以使zPosition明智地达到多少深度,并进行相应的计划。 假设我们有一个精灵,上面有衬衫裤和皮带。
如果我们像这样构造精灵:
身体
->衬衫
->裤子
->皮带
然后,我们可以将所有这些子节点的zPositions设置为0,因为渲染顺序将使用zPosition,然后是树顺序,并且没有任何变化:
但是,如果我们这样构造它:身体
->衬衫
->裤子
--->皮带
并且我们想让衬衫位于裤子和皮带之间,那么我们需要通过将衬衫和皮带的zPosition设置为1来进行补偿。
4)如果我有一个带有20个Sprite子级的Sprite,并且它需要在具有20个Sprite子级的其他Sprite的前后无缝移动,该怎么办? 现在我们在与其他精灵战斗时遇到了问题,因此我们需要对Player的zPosition应用一些数学运算来修复它。 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 * 2 //(We need at least 2 zPosition slots reserved for every sprite)
return super.zPosition
}
set
{
//do nothing
}
}
}
5)但是我可以以某种方式使一个子画面及其子层变成1层(或使所有左臂子画面变成1层而右臂子画面变成另一层)吗? 6)我看到可以处理这种情况的游戏,但是处理方式背后的概念是什么? 是的,您可以使用
view.texture(from:)
将任何节点转换为纹理,然后在该纹理之外创建一个新的精灵。7)如果我希望这些子画面像一个子画面的手臂抓住另一个子画面一样交互(这样,一个胳膊将在第二个子画面人的后面,但是相反的手臂将完全在另一个子画面人的前面)8)如何分层出现在正确的zPosition 9中)也许这不可能吗?
现在这部分变得很棘手,而不是进行乘法,我们需要每个节点zPosition都进行更改。
我们还需要计算每个精灵的绝对位置,以知道我们在y轴上的位置
为此,我们至少有3种选择,
a)我们可以为我们在场景上放置的每个节点制作一个自定义协议+自定义类b)可以为我们在场景上放置的节点类型(例如SKSpriteNode和SKShapeNode)编写扩展,但SKNode除外,因为这是基础节点c)类,我们可以做一些称为“键值观察”的操作,并且需要侦听sprite上的position
变化时。 之所以需要执行KVO,是因为您的子画面可能是在具有SKNode的位置构造的,因此我们无法覆盖其位置。
所有这三种方法都需要大量工作,并且需要您的游戏环境所特有的优化才能有效运行,我将不详细介绍如何执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.