Spritekit 改变重力

Posted

技术标签:

【中文标题】Spritekit 改变重力【英文标题】:Spritekit Changing Gravity 【发布时间】:2017-09-17 00:05:04 【问题描述】:

我一直在尝试通过使用来改变重力

override func touchesBegan(_ touches: Set<UITouch>, with event: 
UIEvent?) 
self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)

但这似乎根本没有改变重力。当我在 didMove 函数中使用相同的代码时,它可以工作。

编辑1:

这是我的 SKSpriteNode 的代码:

spaceship = SKSpriteNode(imageNamed: "Spaceship")

    spaceship.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    spaceship.setScale(0.1)
    spaceship.physicsBody?.isDynamic = true
    spaceship.physicsBody = SKPhysicsBody(circleOfRadius: spaceship.size.width / 2);


    addChild(spaceship)

【问题讨论】:

您能否更具体地说明如何发现重力没有变化?在您的 SKScene 中您希望移动/下降的任何其他元素?如果是,您是否设置了他们物理体的质量/affectedByGravity 属性? 您是否希望精灵在关闭重力后立即停止? 就像@0x141E 指出的那样,如果你想让你的飞船立即停止然后朝另一个方向前进,你需要改变它的速度/速度属性,否则仍然会施加力它。 记住,重力是一种力。它会导致加速。如果你关闭重力,你并没有关闭运动,你只是关闭了加速度。如果当你关闭重力时一个物体正在移动,它会继续移动,直到其他一些力作用在它上面。此外,代码中的 spaceship.physicsBody?.isDynamic = true 行什么也没做。 这是有道理的。我用 spaceship.physicsBody?.velocity = CGVector(dx: 0, dy: 0) 来阻止它。 【参考方案1】:

它在didMove 中有效,因为物体不会受到力,因此它们仍然是

当您在游戏中途改变重力时,物体仍会从之前的重力运动——改变重力只会影响施加到物体上的 /future/ 力。

您需要同时更改重力和要在触摸功能中影响的节点的速度才能获得所需的效果。

此外,为简洁起见,您可以直接访问 dy 值,而无需为其分配新的 CGVector - 这也有助于提高性能。

spaceship.physicsBody!.velocity.dy = 0

【讨论】:

以上是关于Spritekit 改变重力的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 重力

swift spritekit 随着游戏时间的推移增加重力?

Spritekit - 将加速应用于物理主体

SPRITEKIT游戏框架之关于PHYSICS物理引擎属性

SpriteKit 设备方向改变导致 SKLabelNode 变形 Swift

如何使用 SpriteKit 使精灵跳到特定高度?