gpt4 book ai didi

ios - 模拟寿司火车 - Swift SpriteKit

转载 作者:搜寻专家 更新时间:2023-11-01 07:08:41 25 4
gpt4 key购买 nike

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

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

我试过使用场景编辑器放置几个 Sprite 节点并使它们像这样在方形路径上移动。

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 道菜一样。

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

最佳答案

好吧,我可能会以类似的方式完成它,我认为使用 SKAction.follow 是一个解决方案。

但是您可以对代码进行一些改进。第一个是你不需要将你的 SKAction 写成一个序列,因为它只由一个 Action 组成,所以你可以将你的代码简化为:

    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)

现在另一件重要的事情是,为了节省您的内存使用量,而不是每次(20 次)都重新创建一个新菜,您可以只使用 copy()在你的 SKSpriteNode创建它的许多不同的副本。根据您需要实现的目标,您当然可以自定义每个副本,更改其颜色或位置等。这样效率会更高。

您可以像这样创建 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 loop , 或者你可以玩 update(_ currentTime:)通过指定您想要每 5 秒创建一个新寿司盘的方法,例如 :)。

好吧,如果您在任何时候需要访问这些副本中的任何一个,只需访问 dishes 即可。大批。

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

// And just iterate through all of your dish copies:

for dish in dishes {

dish.removeFromParent()

// Do whatever you need here :)

}

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

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

顺便说一下,今晚我真的会去你在问题中提到的寿司店,那家有小火车的…真巧! :D

关于ios - 模拟寿司火车 - Swift SpriteKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46355990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com