Проверка текущего спритенода - PullRequest
0 голосов
/ 28 февраля 2020

Вот такая ситуация: у меня прыгающий красный шар и несколько случайно сгенерированных платформ. В случае контакта с нижней частью платформы мяч должен пройти через платформу. В другом случае это будет верхняя часть платформы, и мяч должен отскочить. Я изменил параметры .collisionBitMask и .contactTestBitMask, чтобы игрок мог пройти через платформу или отскочить от нее. Но мой код работает только для последней платформы, вы можете увидеть на снимок экрана . Для других платформ не работает - мяч также проходит через верх. У меня есть массив этих платформ, и я не знаю, как проверить текущую платформу.

Вот часть моего кода:

var platforms = [SKSpriteNode]()

....

extension GameScene: SKPhysicsContactDelegate {

func didBegin(_ contact: SKPhysicsContact) {
    let floor = BitMaskCategory.floor
    let player = BitMaskCategory.player
    let platformCategory = BitMaskCategory.platform
    let bodyA = contact.bodyA.categoryBitMask
    let bodyB = contact.bodyB.categoryBitMask


    if bodyA == player && bodyB == platformCategory  || bodyA == platformCategory && bodyB == player {
        for platform in platforms {
            if self.player.position.y > platform.position.y {
                self.player.physicsBody?.collisionBitMask = floor | platformCategory
                self.player.physicsBody?.contactTestBitMask = floor | platformCategory
            } else if self.player.position.y < platform.position.y  {
                self.player.physicsBody?.collisionBitMask = floor
                self.player.physicsBody?.contactTestBitMask = floor
            }
        }
    }
}

func didEnd(_ contact: SKPhysicsContact) {
    let player = BitMaskCategory.player
    let bar = BitMaskCategory.platform
    let floor = BitMaskCategory.floor
    let bodyA = contact.bodyA.categoryBitMask
    let bodyB = contact.bodyB.categoryBitMask

    if bodyA == bar && bodyB == player || bodyA == player && bodyB == bar {
        for platform in platforms {
            if self.player.position.y > platform.position.y  {
                self.player.physicsBody?.collisionBitMask = floor
                self.player.physicsBody?.contactTestBitMask = floor


               }
            }
        }
    }
}

Итак, я не знаю, как проверить текущую платформу. Если я размещаю 3 постоянные платформы вручную, все работает нормально: D

Пожалуйста, помогите, не знаете, как реализовать эту задачу.

1 Ответ

0 голосов
/ 29 февраля 2020

У меня есть такой подход для решений (красные платформы)

enter image description here

Пример кода можно получить здесь: https://github.com/Maetschl/SpriteKitExamples/tree/master/PlatformTest

Использует скорость объекта для получения направления и добавляет маску столкновения

override func update(_ currentTime: TimeInterval) {
    player.physicsBody?.collisionBitMask = 0b0000 // Reset the mask

    // For UP only Platform
    if (player.physicsBody?.velocity.dy)! < CGFloat(0.0) {
        player.physicsBody?.collisionBitMask |= 0b0001 // The pipe | operator adds the mask by binary operations
    }

    // For Down only platforms
    if (player.physicsBody?.velocity.dy)! > CGFloat(0.0) {
        player.physicsBody?.collisionBitMask |= 0b0010  // The pipe | operator adds the mask by binary operations
    }

}
...