- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习使用 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/
我正在尝试构建一个 SpriteKit 游戏,但它因错误而失败:“无法将模块“SpriteKit”加载为“Spritekit”” 我使用的是 Xcode 版本 6.3.2 (6D2105)。 最佳答案
如何在 spritekit swift 中更改碰撞时的 spritekit。 else if collidedBird.birdType == 6 { if U
我刚刚创建了一个新的 SpriteKit 项目,就遇到了砰!问题。我运行该项目时没有触及任何内容,并且应该如此,默认的 hello world 项目出现了。这方面一切都很好。现在,我创建了一个新的 C
当我使用 SpriteKit 创建视频对象时 let background = SKVideoNode(videoFileNamed: "Video.mov") 我只使用了一次命令: backgrou
出于某种原因,我无法将节点放置在屏幕的顶部或底部。我曾经能够使用 self.frame.height/2 很好地做到这一点,但现在我在景观中工作,这行代码不起作用。注意:我的 anchor 是 0.5
在场景中“缩小”的正确方法是什么。 我有一个物体,我施加一个冲动将它发射到屏幕上。例如,它会发射大约 100 像素,这按预期工作 - 增加它飞行的力量,增加它飞行的密度更少等等。 我遇到的问题是缩放,
是否可以更改粒子发射的频率。例如,如果我发射一个粒子,我可以让它每 5 秒或 10 秒发射一次吗? 我搜索了文档,但找不到任何内容。有解决方法吗?我想做这样的事情: emitter.partic
有谁知道一些开箱即用的库,它们可能会为 SKNode 提供诸如相机抖动之类的效果。 ? 如果没有,是否有一种简单的方法可以使用 Action 来实现相机抖动? 谢谢 最佳答案 我找到了一种使用 SKA
我目前一直在使用委托(delegate)和 SKView 自定义类来监视我的 OS X SpriteKit 游戏中的按键。我需要为我的键盘监控类雇用多个代表,我知道这是不可能的,但可以通过使用观察者来
我从事 SpriteKit 游戏已经有一段时间了,但我有一个无法摆脱的恼人问题。我不想过多介绍这款游戏,但它非常简单。我每秒生成一些对象(SKSpriteNodes),这些对象使用 SpriteKit
我正在制作基于SpriteKit的多级游戏。 一切正常,除了一件事:当用户玩很长时间、改变很多关卡等时......然后 SpriteKit 开始丢失纹理。 我的意思是,没有像图像加载失败时那样的大红叉
我正在尝试将 SKSprite Particle Emitter 与 Swift 一起使用。 但我想在我的发射器中使用许多不同的纹理。 是否有可能:拥有许多图像,并且让发射器随机使用图像,而不是仅使用
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在用SpriteKit构建我的第一个项目,但我无法弄清楚这部分。 我的项目包括飞入屏幕的敌方直升机。每个敌人播放大约14秒长的声音文件。这不是循环。它包括敌人进入屏幕之前接近的声音,以及在屏幕上移
我试图在代码中到处搜索:解释文档在进入后台时会做什么,或者甚至有时会暂停,但无济于事-有人可以指导我在进入后台时建议做什么到启用 Sprite 套件的游戏中的背景吗? 我应该调用scene.pause
我是 SpriteKit 新手。我需要通过 UIImageView 或 SpriteNode 显示图像(它是游戏的背景图像)。但是,我需要用户能够放大背景并平移。我在不使用 SpriteKit 的情况
在我的游戏中,我正在创建一些受重力影响的球。当游戏开始时,他们会从屏幕外掉下来,并在底部找到自己的位置。没有其他力施加在他们身上。 问题是我正在用精确的坐标、精确的物理属性创建这些球,但结果不一样。它
我想让我的宇宙飞船有一条跟随它的粒子轨迹。我该怎么做? 这是我的宇宙飞船的代码: override func didMove(to view: SKView) { spaceS.positio
我正在尝试制作一个动画角色,可以在不移动他的躯干的情况下伸手去拿屏幕上的东西。 如果他够不到,他的手应该朝这个方向移动最大量,然后被他的静态躯干的物理限制所抵消。 所以在我的代码中,绿色矩形( han
我的场景上有player对象,并试图对其施加一些力。您可以看到我正在对update:文件上的MyScene.h方法施加作用力。但是,我的player根本没有动。发生了什么? 下面是Player SKS
我是一名优秀的程序员,十分优秀!