Невозможно обнаружить контакт SKSpritNode (Swift Xcode) - PullRequest
0 голосов
/ 10 октября 2019

У меня есть простая игра, которую я пишу для iOS с помощью Swift. В игре персонажу необходимо собирать предметы. У меня есть следующие настройки в файле Swift для основного игрока:

import SpriteKit

struct ColliderType {
    static let Player: UInt32 = 1
    static let Ground: UInt32 = 2
    static let Collectables: UInt32 = 3
}

class Player: SKSpriteNode {

    func initialize() {

        var walk = [SKTexture]()

        for i in 1...16 {
            let name = "Kidwalk\(i)"
            walk.append(SKTexture(imageNamed: name))
        }

        let walkAnimation = SKAction.animate(with: walk, timePerFrame: 0.095, resize: true, restore: true)

        self.name = "Player"
        self.physicsBody = SKPhysicsBody(rectangleOf: self.size)
        self.physicsBody?.affectedByGravity = true
        self.physicsBody?.allowsRotation = false
        self.physicsBody?.categoryBitMask = ColliderType.Player
        self.physicsBody?.collisionBitMask = ColliderType.Ground | ColliderType.Collectables
        self.position = CGPoint(x: 0, y: 0)
        self.zPosition = 5
        self.run(SKAction.repeatForever(walkAnimation))
        self.xScale = CGFloat(0.4)
        self.yScale = CGFloat(0.4)
    }

    func jump() {
        self.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
        self.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 500))
    }

}

В основном файле GameplayScene.swift я установил следующую константу:

let phone = SKSpriteNode()

Изатем я создаю объект следующим образом:

func createPhone() {
     var ring = [SKTexture]()

     for i in 1...7 {
     let name = "phone\(i)"
     ring.append(SKTexture(imageNamed: name))
     }

     let ringAnimation = SKAction.animate(with: ring, timePerFrame: 0.095, resize: true, restore: true)

     phone.name = "Phone"
     phone.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: phone.size.width / 2, height: phone.size.height / 2))
     phone.physicsBody?.affectedByGravity = true
     phone.physicsBody?.allowsRotation = false
     phone.physicsBody?.categoryBitMask = ColliderType.Player
     phone.physicsBody?.collisionBitMask = ColliderType.Ground | ColliderType.Collectables
     phone.position = CGPoint(x: 300, y: -50)
     phone.zPosition = 5
     phone.run(SKAction.repeatForever(ringAnimation))
     phone.xScale = CGFloat(0.7)
     phone.yScale = CGFloat(0.7)

        let move = SKAction.moveTo(x: -(self.frame.size.width * 2), duration: 15)

        let remove = SKAction.removeFromParent()

        let sequence = SKAction.sequence([move, remove])

        phone.run(sequence)

        addChild(phone)
    }

Я вызываю createPhone () в функции didMove вверху.

И, наконец, у меня есть эта настройка для обнаружения столкновений:

func didBegin(_ contact: SKPhysicsContact) {
        var firstBody = SKPhysicsBody();
        var secondBody = SKPhysicsBody();

        if contact.bodyA.node?.name == "Player" {
            firstBody = contact.bodyA;
            secondBody = contact.bodyB;
        } else {
            firstBody = contact.bodyB;
            secondBody = contact.bodyA;
        }

        if firstBody.node?.name == "Player" && secondBody.node?.name == "Ground" {
            canJump = true;
            print("canjump")
        } else if firstBody.node?.name == "Player" && secondBody.node?.name == "Phone" {
            print("Collect)
        }
    }

Очевидно, что что-то в корне неверно, потому что обнаружено столкновение между землей и плеером, но не между телефоном и плеером.

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

Любая помощь будет принята с благодарностью.

...