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

SpriteKit: Removing gravity from SKSpriteNode doesn't work

我正在尝试从 SKSpriteNode 移除重力,但没有成功。这是我的代码:

我添加了SKSpriteNode:

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

我通过 Scene.sks

添加重力

我尝试了所有这些方法来消除重力,但 none 的工作:

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

如何去除 SKSpriteNode 的重力?有谁知道

非常感谢你的帮助。

看起来(从给定的代码来看)您的精灵是 GameScene.sks 中的彩色精灵。如果是这样,这很容易修复。

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

将物理定义切换为 none,或删除 "Affected By Gravity"

中的勾号

如果您试图在代码中消除精灵的重力,请纠正我,但我认为您做不到。我更喜欢在我的场景中手动设置物理以避免这样的错误。

仅当您想要 null/nil

时才使用 ?
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 不是 nil 的地方崩溃,那么我们需要重新考虑我们的节点是如何命名的,因为让 2 个不同的节点具有相同的名称并不是一个好主意。