SpriteKit - 创建随机对象并使用 deltatime 移动它们
Posted
技术标签:
【中文标题】SpriteKit - 创建随机对象并使用 deltatime 移动它们【英文标题】:SpriteKit - Create random objects and move them using deltatime 【发布时间】:2016-02-23 05:38:50 【问题描述】:在我的游戏中,我想每隔几秒调用一个函数,从数组中创建随机对象。目前我正在通过 SKAction 像这样移动这些对象:
func createRandmoObject()
let random = arc4random_uniform(4)
randomObject = randomObjects[random]
randomObject.runAction(SKAction.moveTo(CGPoint(x: randomObject.position.x, y: 0 - randomObject.size.height), duration: 3))
addChild(randomObject)
当物体击中玩家时,它会被移除,然后再次调用该函数。这种方法的问题是我发现物体的运动并不总是平滑的,当帧率由于某种原因下降时,就会出现卡顿。现在我知道如何在更新方法中计算增量时间,但是我不确定当对象不断变化而不总是在屏幕上时如何将它应用于对象,并且还有其他一些类似的对象(让我们想想它们是敌人,还有另一个函数会创建另一个敌人)那么我怎样才能让这些随机对象根据 deltatime 而不是 SKAction 移动?
【问题讨论】:
SpriteKit 对其物理使用可变时间步长。不幸的是,这意味着如果增量时间很长,对象会出现“跳跃”。如果您不希望这种情况发生(即保持运动独立于帧速率),您将需要自己手动计算节点的物理特性,例如在更新方法中增加节点的位置。您基本上需要编写自己的物理引擎。 我可以手动增加“更新”中的位置,但是当节点并不总是存在时如何做到这一点,产生之间需要几秒钟。 有时新节点会在之前的节点仍然存在时产生。 您需要保留所有活动节点的列表,并按速度增加位置。不过,您需要使用自定义速度属性,因为您需要避免使用 Sprite Kit Physics。就像我说的那样,您基本上需要创建自己的物理引擎,这不是一项容易的任务,具体取决于您需要多少功能,例如碰撞。 imo真的不值得。而是使用 Sprite Kit 物理引擎并针对 60fps 进行优化,这样您就不会看到任何“跳跃”行为。找出您的游戏为何会低于 60 fps,或使用不同的游戏引擎。 我认为您的解决方案是解决您的性能问题。试着弄清楚你可以异步做什么。 【参考方案1】:虽然您可以在 spritekit 项目中使用 SKAction,但如果您的游戏基于物理,您应该对所有 sprite 动作使用更新方法。 SKactions 适用于简单的游戏,但如果您的游戏涉及碰撞和随机运动,则可以选择更新方法。
【讨论】:
以上是关于SpriteKit - 创建随机对象并使用 deltatime 移动它们的主要内容,如果未能解决你的问题,请参考以下文章
使用 SpriteKit 如何以随机但一致的速度将精灵节点移动到一个点
Sprite Kit - 使用 Switch Case 将随机 Sprite 节点添加到场景中
将 SKSpriteNode 移动 Y - Swift 2 + SpriteKit