Swift 不叫迪德贝京

Swift 不叫迪德贝京,swift,sprite-kit,Swift,Sprite Kit,我的目标是输出“hit”,但不改变卡和另一张卡的位置。它们应该相互接触,但不能移动。然而,didbegen并不是一个名字 结构: struct physicBodyCharacters { static let cardNumber = 00000001 //1 static let anotherCardNumber = 00000010 //2 static let nobodyNumber = 00000100 //4 } 在viewDidLoad()中: 第一

我的目标是输出“hit”,但不改变
另一张卡
的位置。它们应该相互接触,但不能移动。然而,didbegen并不是一个名字

结构:

struct physicBodyCharacters {

    static let cardNumber = 00000001 //1
    static let anotherCardNumber = 00000010 //2
    static let nobodyNumber = 00000100 //4
}
在viewDidLoad()中:

第一个节点:

card = SKSpriteNode(texture: cardTexture)
    card.position = CGPoint(x: gameScene2.size.width / 2 + 150, y: 95)
    card.zPosition = 3
    card.setScale(1)
    card.physicsBody = SKPhysicsBody(texture: cardTexture, size: card.size)
    card.physicsBody?.affectedByGravity = false
    card.physicsBody?.categoryBitMask = UInt32(physicBodyCharacters.cardNumber)
    card.physicsBody?.collisionBitMask = UInt32(physicBodyCharacters.nobodyNumber)
    card.physicsBody?.contactTestBitMask = UInt32(physicBodyCharacters.anotherCardNumber)
第二个节点:

anotherCard = SKSpriteNode(texture: anotherCardTexture)
    anotherCard.position = CGPoint(x: 31 , y: 532)
    anotherCard.zPosition = 2
    anotherCard.setScale(1)
    anotherCard.physicsBody = SKPhysicsBody(texture: anotherCardTexture, size: battlefieldCard0.size)
    anotherCard.physicsBody?.affectedByGravity = false
    anotherCard.physicsBody?.categoryBitMask = UInt32(physicBodyCharacters.anotherCardNumber)
    anotherCard.physicsBody?.collisionBitMask = UInt32(physicBodyCharacters.nobodyNumber)
    anotherCard.physicsBody?.contactTestBitMask = UInt32(physicBodyCharacters.cardNumber)
didbeagin()函数:

func didBegin(_ contact: SKPhysicsContact) {
    print("contact")
    let contanctMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch contanctMask
    {
    case UInt32(physicBodyCharacters.cardNumber) | UInt32(physicBodyCharacters.anotherCardNumber):
        print("hit")
    default:
        break
    } 
}

对于每一个答案,我都非常感激。

要在两个节点接触时得到通知,但不让它们移动,那么您需要在节点之间打开接触检测(这样做
didbeagin
被调用),但关闭碰撞检测(因为是碰撞导致节点在接触时移动)

这是通过正确设置
冲突位掩码
contactTestBitMask
来实现的

您没有发布足够的代码供我们检查,但您可能希望通读以下关于其他类似问题的答案:

碰撞和接触的分步指南:

以及碰撞和接触测试位掩码指南:

操纵位掩码以关闭和打开单个碰撞ans触点。

编辑:

我认为您的类别定义是错误的-它们应该是二进制位掩码,但您将它们定义为小数

尝试将其定义更改为:

结构物理odycharacters{

static let cardNumber = 00000001 << 0 // 1
static let anotherCardNumber = 00000010 << 1 // 2
static let nobodyNumber = 00000100 << 2 // 4

static让cardNumber=0000000 1您没有显示所有相关的代码行。假设您在SKScene中声明了此方法,“请确保编写”self.physicsWorld.contactDelegate=self"在您需要检测联系人之前的某个地方,或者您的联系人方法将不会被调用。
self.physicsWorld.contactDelegate=self
已在我的代码中。问题一定在其他地方。我已经阅读了文章,并尝试在某些地方重写代码。但仍然存在相同的问题。自从我被访问以来,您能在这里帮助我吗这个问题已经讨论了一段时间了?你还没有列出很多代码。例如,你定义物理体的代码,类别位掩码等。如果你更改了代码,请将新代码添加到问题中。我现在添加了更多代码。你能再看一遍吗?我将其更改为二进制位掩码,但仍然没有工作
static let cardNumber = 00000001 << 0 // 1
static let anotherCardNumber = 00000010 << 1 // 2
static let nobodyNumber = 00000100 << 2 // 4