SpriteKit:从SKSpriteNode移除重力不起作用

时间:2018-09-28 19:10:18

标签: sprite-kit xcode10 gameplay-kit swift4.2

我正在尝试从SKSpriteNode中移除重力,但无法正常工作。这是我的代码:

我添加添加SKSpriteNode:

let block: SKSpriteNode = self.childNode(withName: "block") as! SKSpriteNode

我通过Scene.sks添加重力

我尝试了所有这些方法来消除重力,但是没有任何作用:

block.physicsBody?.affectedByGravity = false
block.physicsBody?.isDynamic = false
block.physicsBody?.velocity.dy = 0
block.physicsBody?.categoryBitMask = 0

如何从SKSpriteNode中除去重力?你们都知道

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

(从给定的代码中)您的子画面看起来像是GameScene.sks中的彩色子画面。如果是这样,这很容易解决。

只需从GameScene.sks文件中移除重力:

Image 1

Image 2

Image 3

将物理定义切换为无,或从“重力影响”中删除勾号

如果您试图从代码中的精灵中消除重力,请在错误的情况下纠正我,但我认为您不能。我更喜欢在场景中手动设置物理场,以避免出现此类错误。

答案 1 :(得分:0)

仅当您要允许为空/无时才使用?

block.physicsBody!.affectedByGravity = false
block.physicsBody!.isDynamic = false
block.physicsBody!.velocity.dy = 0
block.physicsBody!.categoryBitMask = 0

physicsBody不存在时,这将崩溃,这就是您要检查的内容(或者您可以使用guard进行适当的检查。)

如果失败,则表明您的块没有物理物体(这意味着您正在抓错块)。

您现在需要问自己的问题是场景中存在许多block子画面,因为代码的方式,它只会提取找到的第一个子画面。

要禁用块精灵上的所有重力,可以执行以下操作:

enumerateChildNodes(withName:"block")
{
    block,finished in
    block.physicsBody!.isDynamic = false
}

如果我们的代码在PhysicsBody不为零的位置崩溃,那么我们需要重新考虑节点的命名方式,因为让两个不同的节点同名不是一个好主意。