如何将Sprite Kits物理转换为绝对点值?

时间:2016-02-10 09:50:36

标签: ios swift sprite-kit game-physics physics-engine

我正在开发一款垂直2D平台自动跳线游戏。使用模式和自适应难度在程序上完成级别生成。游戏将在iOS / OS X上发布,并使用Apples Sprite Kit框架。

使用Sprite Kit自己的物理引擎实现物理。例如,通过施加力或改变玩家实体的当前速度来完成跳跃。这样的事情:

playerEntity.physicsComponent.velocity =
    CGVectorMake(playerEntity.physicsComponent.velocity.dx, 850.0)

让玩家保持自己的“流动区”适应性难度非常重要。这需要使用独特的模式,提供独特的挑战。

使用程序概念生成模式。但这需要了解球员的物理行为,尤其是跳远距离。

一种方法是手动硬编码一些跳跃距离。一种更灵活的方法是从物理系统获得跳跃距离 - 或跳跃半径和“空中时间”等细节 - 。

不幸的是,在Sprite Kit中,没有真正的等效力 - 向量单位。

所以我问如何将Sprite Kit物理转换为绝对点值。我需要一个我可以输入的功能,例如一个力矢量,并输出玩家可能跳跃区域的半径。

如果我对Sprite Kit物理如何工作有所了解,例如'每帧像素'率,但我想这不存在!?如下所示:

/// Returns a rectangle describing an oval area in absolute points
func jumpRadius(withPhysicsBody body: SKPhysicsBody, 
                andVector vector: CGVector) -> CGRect {

    // Compute area using physics body properties like mass, friction, etc.
    // Return it ...
    return ...
}

1 个答案:

答案 0 :(得分:2)

菲利普迪克,我最喜欢的科幻小说作家之一,1978年撰写了文章How to Build a Universe That Doesn't Fall Apart Two Days Later。这是一段摘录:

  

现实是,当你停止相信它时,它不会消失。

让我们看看这与你的问题和答案有什么关系。

错误的做法

这是你问题的简短回答。如果您想将position精灵的Hero转换为视图系统,可以添加以下属性

class Hero: SKSpriteNode {
    var globalPosition: CGPoint? {
        guard let scene = self.scene else { return nil }
        let pointInScene = self.convertPoint(self.position, toNode: scene)
        return scene.convertPointToView(pointInScene)
    }
}

为什么它不起作用

现在,如果您的游戏确实使用了物理,那么您的游戏确实存在于(虚拟)物理世界中,其中距离以米为单位,点和像素。

点和像素只是在平面屏幕上表示您在物理世界中模拟的更复杂的现实的一种方式。视觉表现应该取决于物理世界,但物理世界中发生的事情应该完全不可知视觉表现。最重要的是不应该受此影响。

否则,当你改变场景适合设备屏幕的方式时,让我们说替换这个

scene.scaleMode = .AspectFill

用这个

scene.scaleMode = .AspectFit

进入你的GameViewController你会遇到严重的麻烦,因为这会改变点和米之间的关系(我确信我们可以找到更多这样的例子)。

正确的方法

我的建议是:用米和物理世界进行计算。它甚至在没人看的时候也应该工作(即根本没有图形表示)。