didBegin не вызывается - PullRequest
       29

didBegin не вызывается

0 голосов
/ 02 декабря 2018

Моя цель - выводить "hit" , но без изменения позиций card и anotherCard.Они должны касаться друг друга, но не двигаться.Однако didBegin не вызывается.

Структура:

struct physicBodyCharacters {

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

в viewDidLoad ():

gameScene2.physicsWorld.gravity = CGVector(dx: 0, dy: -9.81)
    gameScene2.physicsWorld.contactDelegate = self

Первый узел:

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)

didBegin () Функция:

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
    } 
}

За каждый ответ я очень благодарен.

1 Ответ

0 голосов
/ 03 декабря 2018

Чтобы получать уведомления при касании 2 узлов, но не о том, чтобы они двигались, необходимо включить обнаружение контактов между узлами (сделать так, чтобы вызывался didBegin), но обнаружение столкновений было отключено (потому что это столкновения, которыезаставить узлы двигаться, когда они касаются).

Это делается путем правильной установки collisionBitMask и contactTestBitMask.

Вы недостаточно опубликовали свой код, чтобы мы могли проверитьэто, но вы можете прочитать следующие ответы на другие подобные вопросы:

Пошаговое руководство для столкновений и контактов: https://stackoverflow.com/a/51041474/1430420

И руководство по столкновениям и contactTestбитовые маски: https://stackoverflow.com/a/40596890/1430420

Управление битовыми масками для включения и выключения отдельных контактов и контактов.https://stackoverflow.com/a/46495864/1430420

Редактировать:

Я думаю, что ваши определения категорий неверны - они должны быть двоичными битовыми масками, но вы определили их как десятичные дроби.

Попробуйте изменить их определениеto:

struct physicBodyCharacters {

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