Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 模拟寿司列车-Swift SpriteKit_Ios_Swift_Sprite Kit_Skphysicsbody - Fatal编程技术网

Ios 模拟寿司列车-Swift SpriteKit

Ios 模拟寿司列车-Swift SpriteKit,ios,swift,sprite-kit,skphysicsbody,Ios,Swift,Sprite Kit,Skphysicsbody,我正在学习使用SprikeKit创建一个游戏,这个游戏与寿司火车有关 我有大约20个盘子,沿着一条矩形的路径,以模拟所有盘子都在移动的传送带上的样子 我曾尝试使用场景编辑器放置两个精灵节点,并使它们在这样的方形路径上移动 let dish_1 = self.childNode(withName: "dish_1"); let dish_2 = self.childNode(withName: "dish_2"); let square = UIBezierPath(rect: CGRect(x

我正在学习使用SprikeKit创建一个游戏,这个游戏与寿司火车有关

我有大约20个盘子,沿着一条矩形的路径,以模拟所有盘子都在移动的传送带上的样子

我曾尝试使用场景编辑器放置两个精灵节点,并使它们在这样的方形路径上移动

let dish_1 = self.childNode(withName: "dish_1");
let dish_2 = self.childNode(withName: "dish_2");

let square = UIBezierPath(rect: CGRect(x: 0, y: 0,  width: 200, height: 200));
let followSquare = SKAction.follow(square.cgPath, asOffset: true, orientToPath: false, duration: 5.0);

dish_1?.run(SKAction.sequence([followSquare]))
dish_2?.run(SKAction.sequence([followSquare]))
目前,两个盘子使用相同的正方形,正方形位置相对于每个盘子,因此它们看起来像是在两个不同的矩形路径上,因为它们的起点不同

这是模拟我想要的样子的合理方式吗? 我问这个问题的原因是为了让所有的盘子看起来像是在同一条路径上移动,我需要调整每个盘子的x,y位置,它将像20个盘子


我想知道是否可以使用物理工具包,让一个矩形节点使所有盘子沿着路径移动,只要它们在矩形节点区域内。

a偏移量
似乎不正确。根据你的观点,这正是你想要的相反的行为

如果是,则路径中的点是相对于节点起始位置的相对偏移。如果否,则节点中的点为绝对坐标值

将此设置为true将为每个盘子提供它们自己的矩形路径,以及相对于其起始位置的坐标,如您在问题中所述:

v First dish v Second dish O--O-----.---. | | | | | | | | '--'-----'---' ^^ Second dish's path ^^ First dish's path 第一道菜 第二道菜 O--O-------。 | | | | | | | | '--'-----'---' ^^第二道菜 ^^第一道菜 相反,我会想象你需要在绝对坐标系下设置传送带,然后初始化每个盘子的起始点,使之不同——同样在绝对坐标系下——最后让每个盘子沿着所述路径:

v First dish (starting point x=0; y=0) v Second dish (starting point x=20; y=0) O--O-----. | | | | '--------' ^^ Single, absolute path v第一盘(起点x=0;y=0) v第二盘(起点x=20;y=0) O--O-----。 | | | | '--------' ^^单一、绝对路径
(如果你在模拟寿司传送带,它们是顺时针移动的,上面的术语“first”和“second”在技术上是向后的。交换这是留给读者的练习。:-p)

我可能会用类似的方法来做,我认为使用SKAction.follow是一个解决方案

但是您可以在代码中做一些改进。首先,您不需要将SKAction编写为序列,因为它只由一个操作组成,因此您可以将代码简化为:

    let squarePath = UIBezierPath(rect: CGRect(x: 0, y: 0,  width: 200, height: 200))

    let followAction = SKAction.follow(path: squarePath.cgPath, duration: 5.0)

    dish?.run(followAction)
现在,另一件重要的事情是,为了节省内存使用量,您可以在
SKSpriteNode
上使用
copy()
创建许多不同的副本,而不是每次(20次)重新创建一个新盘子。根据您需要实现的目标,您当然可以自定义每个副本,更改其颜色或位置等。这将是更有效的方法

您可以创建SKSpriteNode的副本,如下所示:

import GameplayKit

 if let dishCopy = dish?.copy() as? SKSpriteNode {
      dishCopy.position = CGPoint(x: GKRandomDistribution(lowestValue: 0, highestValue: 200).nextInt(), y: GKRandomDistribution(lowestValue: 0, highestValue: 500).nextInt())
      self.addChild(dishCopy)
 }
对于每个碟片副本的位置,您当然可以根据自己的值进行调整,但这里我使用了GameplayKit及其非常有用的随机值生成器

更新:

如果要在仍使用copy()的情况下为每个菜式设置唯一的名称,您有几个选项

一种可能是使用递增的计数器生成唯一名称,另一种可能是在更新方法中使用currentTime

但另一种更优雅的方法是创建一个数组来存储所有副本,以跟踪副本的位置

在场景子类的顶部,声明您的碟形数组,如下所示:

 var dishes = [SKSpriteNode]()
目前,它仍然为空,因此您需要在创建每个副本时将其添加到阵列中:

    // Create (safely) a dish copy:

    if let dishCopy = dish?.copy() as? SKSpriteNode {

        // Add the dish copy to the dishes array:

        dishes.append(dishCopy)

        // And add the dish copy to the world node:

        worldNode?.addChild(dishCopy)
    }
如果您想创建这样的多个副本,可以使用
for循环
,也可以使用
更新(uCurrentTime:)
方法,指定每5秒创建一个新的寿司盘,例如:)

如果您需要在任何时候访问这些副本,只需访问
disks
数组即可

例如,这是删除所有副本的方式(如果将原始盘添加到场景中,则必须处理原始盘):

它非常简单,允许您完美地控制添加到
worldNode
的所有对象和/或副本

如果您还有其他问题,请告诉我,我很乐意为您提供帮助


顺便说一句,今晚我要去你在问题中提到的寿司店,那家有小火车的。。真是巧合!:谢谢你富有洞察力的回答。这似乎绝对是一条路要走。对不起,我是游戏开发新手,如何将矩形路径设置为绝对坐标?默认情况下它是相对的吗?我可以想象它都在调用
follow
时的
asOffset
参数中。如果设置为false,则表示路径坐标为绝对坐标。非常感谢。非常有用。我正在考虑使用copy()。但由于每个菜距离也需要实际的sushi作为子节点,所以我不确定复制的实例是否允许有子节点。每道菜还必须有唯一的标识符,以便玩家选择和补充寿司,因此我想知道如果它们是复制的实例,如何知道其id。非常欢迎@SeongLeem,我更新了我的答案,以向您提供有关如何在应用程序中实现这一点的更多详细信息。这太棒了。谢谢这里的世界节点而不是场景的用例是什么?每个菜肴复制节点都需要有一个子节点,如鲑鱼、金枪鱼等。因此,我想我可以使用循环为前5道菜肴分配鲑鱼子节点,如for u in 0..worldNode这里只是一个包含所有元素的SKNode
// And just iterate through all of your dish copies:

for dish in dishes {

   dish.removeFromParent()

   // Do whatever you need here :)

}