【发布时间】: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,或使用不同的游戏引擎。
-
我认为您的解决方案是解决您的性能问题。试着弄清楚你可以异步做什么。
标签: swift random sprite-kit skaction timedelta