Использование нескольких контактов didBegin - SpriteKit - PullRequest
0 голосов
/ 06 апреля 2020

Мне бы хотелось, чтобы SKSpriteNodes мог позаботиться о собственном обнаружении контактов. Как и в Unity, существуют собственные OnTriggerEnter методы для GameObjects. Но я не знаю, как добиться этого в SpriteKit, некоторая помощь будет очень цениться

Пример того, как я бы "хотел", чтобы она работала:

пример Класс Ball:

import SpriteKit

class Ball: SKSpriteNode, SKPhysicsContactDelegate {

    func didBegin(_ contact: SKPhysicsContact) {
        print("INSIDE BALL: ",contact.bodyA.node?.name, contact.bodyB.node?.name)
    }

    init(x: Int, y: Int) {
physicsWorld.contactDelegate = self ????

     //setting up Physicsbody etc
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

пример файла сцены

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    override func didMove(to view: SKView) {
        physicsWorld.contactDelegate = self
    }


    func didBegin(_ contact: SKPhysicsContact) {
        print("INSIDE MAIN: ",contact.bodyA.node?.name, contact.bodyB.node?.name)
    }

Или как вы управляете большим количеством логи контактов c?

Спасибо за любую помощь и извините, если вопросы странно сформулированы

1 Ответ

1 голос
/ 06 апреля 2020

Мне нравится структурировать мой код didBegin следующим образом: (объекты, с которыми можно связаться, это blueBall, blueRectangle, greenBall, greenRectangle, redBall и redRectangle)

func didBegin(_ contact: SKPhysicsContact) {

    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch contactMask {

    case blueBallCategory | blueRectangleCategory:
       print("Alive! Blue ball has hit blue rectangle.")

    case greenBallCategory | greenRectangleCategory:
       print("Alive! Green ball has hit green rectangle.")

    case redBallCategory | redRectangleCategory:
       print("Alive! Red ball has hit red rectangle.")

    default :
        print("Dead! Some other contact has occurred")
    }
}

Можно, конечно, вызвать отдельные функции внутри каждого оператора case, если у вас гораздо больше контактных логи c. Точно так же вы можете вызвать метод столкновения для объекта, который столкнулся:

    case blueBallCategory | blueRectangleCategory:
       contact.bodyA.hasHit(contact.bodyB)

или аналогичный.

...