gpt4 book ai didi

swift - SKPhysicsBody 避免碰撞 Swift/SpriteKit

转载 作者:行者123 更新时间:2023-11-28 13:16:15 26 4
gpt4 key购买 nike

我的场景中有 3 个 SKSpriteNode。场景周围有一只、一枚硬币边框。我不希望硬币 相互碰撞但有边界。我为每个节点分配了不同的 collisionBitMask 和 categoryBitMask:

enum CollisionType:UInt32{
case Bird = 1
case Coin = 2
case Border = 3
}

像这样:

bird.physicsBody!.categoryBitMask = CollisionType.Bird.rawValue
bird.physicsBody!.collisionBitMask = CollisionType.Border.rawValue

coin.physicsBody!.categoryBitMask = CollisionType.Coin.rawValue
coin.physicsBody!.collisionBitMask = CollisionType.Border.rawValue

但是硬币仍然相互碰撞。我做错了什么?

最佳答案

位掩码为 32 位。像你一样声明它们对应于:

enum CollisionType:UInt32{
case Bird = 1 // 00000000000000000000000000000001
case Coin = 2 // 00000000000000000000000000000010
case Border = 3 // 00000000000000000000000000000011
}

您想要做的是将边框值设置为 4。为了改为使用以下位掩码:

enum CollisionType:UInt32{
case Bird = 1 // 00000000000000000000000000000001
case Coin = 2 // 00000000000000000000000000000010
case Border = 4 // 00000000000000000000000000000100
}

请记住,对于下一个位掩码,您必须遵循相同的规则:8、16...等等。

编辑:

此外,您可能希望使用结构而不是枚举,并使用另一种语法使其更容易(这不是强制性的,只是偏好问题):

struct PhysicsCategory {
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let Bird : UInt32 = 0b1 // 1
static let Coin : UInt32 = 0b10 // 2
static let Border : UInt32 = 0b100 // 4
}

你可以这样使用:

bird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
bird.physicsBody!.collisionBitMask = PhysicsCategory.Border

coin.physicsBody!.categoryBitMask = PhysicsCategory.Coin
coin.physicsBody!.collisionBitMask = PhysicsCategory.Border

关于swift - SKPhysicsBody 避免碰撞 Swift/SpriteKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com