Swift Sprite 套件碰撞位掩码
Swift Sprite kit Collision Bitmask
我想知道是否有人能够为我提供一些使用 3 个节点的帮助,我知道如果我只有 2 个节点,例如body A 和 body B 但我正在努力添加第三个 body,我希望它像 body C 一样简单,但事实并非如此。
这是下面的相关代码:
struct CollisionCategoryBitmask {
static let Player: UInt32 = 0x00
static let Enemy1: UInt32 = 0x01
static let Enemy2: UInt32 = 0x02
}
func didBeginContact(contact: SKPhysicsContact) {
var updateHud = false
_ = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node
updateHud = slowDown(player)
}
下面这个函数是为了在接触 Enemy1 时减慢玩家速度
func slowDown (player: SKNode) -> Bool {
player.physicsBody?.velocity = CGVector(dx: 0, dy: -50.0)
return true
}
下面的这个是为了让游戏在接触 Enemy2 时结束
func endGame (player: SKNode) -> Bool {
endOfGame()
return true
}
目前这两种功能都有效,但一次只能使用一种,所以当玩家接触到敌人 1 或 2 时。我现在可以让玩家放慢速度或让游戏结束,只需更改
updateHud = slowDown(player) 行。那么,当玩家触摸敌人 1 或 2 时,我该如何调整代码以产生两种不同的结果。
谢谢
您不了解 didBeginContact 的工作原理。基本上发生的事情是当任何 2 个节点进行联系时,系统要做的第一件事是确保类别和联系位掩码对齐以进行有效联系。如果是,则调用 didBeginContact。现在在这个函数中,你有 2 个任意节点进行接触,称为 bodyA 和 bodyB。您首先需要做的是弄清楚 bodyA 和 bodyB 是什么。所以你做的第一件事就是检查 categoryBitMask。
if(contact.bodyA.categoryBitMask == HERO) then contact.bodyA is a hero
既然我们知道了这些节点指的是什么类别,那么我们就可以检查这些节点到底是什么了。为此,您可以检查节点的名称
if(contact.bodyA.node.name == "Hero") then bodyA is the hero
或者比较节点本身
if(contact.bodyA.node == heroNode) then bodyA is the hero
现在对 bodyB 做同样的事情。
此时您已经确定了您的节点是什么,您可以根据这些信息继续处理您需要的结果。
如果Hero同时击中了两个敌方节点,那么你也需要处理这个问题。将要发生的是对 didBeginContact
的 2 次调用,您需要找到一种方法来记住这一点,并在 didEvaluateActions
或 didSimulatePhysicsMethod
中填写您的联系代码。我不记得didBeginContact后面是哪一个,所以你得自己测试一下。
我想知道是否有人能够为我提供一些使用 3 个节点的帮助,我知道如果我只有 2 个节点,例如body A 和 body B 但我正在努力添加第三个 body,我希望它像 body C 一样简单,但事实并非如此。 这是下面的相关代码:
struct CollisionCategoryBitmask {
static let Player: UInt32 = 0x00
static let Enemy1: UInt32 = 0x01
static let Enemy2: UInt32 = 0x02
}
func didBeginContact(contact: SKPhysicsContact) {
var updateHud = false
_ = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node
updateHud = slowDown(player)
}
下面这个函数是为了在接触 Enemy1 时减慢玩家速度
func slowDown (player: SKNode) -> Bool {
player.physicsBody?.velocity = CGVector(dx: 0, dy: -50.0)
return true
}
下面的这个是为了让游戏在接触 Enemy2 时结束
func endGame (player: SKNode) -> Bool {
endOfGame()
return true
}
目前这两种功能都有效,但一次只能使用一种,所以当玩家接触到敌人 1 或 2 时。我现在可以让玩家放慢速度或让游戏结束,只需更改 updateHud = slowDown(player) 行。那么,当玩家触摸敌人 1 或 2 时,我该如何调整代码以产生两种不同的结果。
谢谢
您不了解 didBeginContact 的工作原理。基本上发生的事情是当任何 2 个节点进行联系时,系统要做的第一件事是确保类别和联系位掩码对齐以进行有效联系。如果是,则调用 didBeginContact。现在在这个函数中,你有 2 个任意节点进行接触,称为 bodyA 和 bodyB。您首先需要做的是弄清楚 bodyA 和 bodyB 是什么。所以你做的第一件事就是检查 categoryBitMask。
if(contact.bodyA.categoryBitMask == HERO) then contact.bodyA is a hero
既然我们知道了这些节点指的是什么类别,那么我们就可以检查这些节点到底是什么了。为此,您可以检查节点的名称
if(contact.bodyA.node.name == "Hero") then bodyA is the hero
或者比较节点本身
if(contact.bodyA.node == heroNode) then bodyA is the hero
现在对 bodyB 做同样的事情。
此时您已经确定了您的节点是什么,您可以根据这些信息继续处理您需要的结果。
如果Hero同时击中了两个敌方节点,那么你也需要处理这个问题。将要发生的是对 didBeginContact
的 2 次调用,您需要找到一种方法来记住这一点,并在 didEvaluateActions
或 didSimulatePhysicsMethod
中填写您的联系代码。我不记得didBeginContact后面是哪一个,所以你得自己测试一下。