Как обнаружить столкновение без физики

Я хочу определить, когда два тела соприкасаются, не используя функцию didBeginContact()

Я пытаюсь использовать CGRectIntersectsRect() без какого-либо эффекта.

class GameScene: SKScene, SKPhysicsContactDelegate {

    // Player
    var _player = SKNode()
    var platform = SKNode()

    let heroCategory: UInt32 = 1 << 0
    let platformCategory: UInt32 = 1 << 1

    override func didMoveToView(view: SKView) {

        /* Setup your scene here */

        // Setup
        self.anchorPoint = CGPointMake(0.5, 0.5)
        self.physicsWorld.gravity = CGVectorMake(0.0, -2.0);
        self.physicsWorld.contactDelegate = self

        // Start populating
        _player = creatPlayer()
        self.addChild(_player)

        platform = creatPlatform(1, atPosition: CGPoint(x: 0, y: -200))
        self.addChild(platform)


        let platformTwo = creatPlatform(2, atPosition: CGPoint(x: 0, y: 200))
        self.addChild(platformTwo)

    }

    func creatPlatform(type: Int, atPosition: CGPoint) -> PlatformNode {

        let node = PlatformNode()
        node.platformType = type
        node.position = atPosition
        let sprite = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 200, height: 50))
        node.addChild(sprite)

        node.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
        node.physicsBody?.dynamic = false;
        node.physicsBody?.categoryBitMask = platformCategory
        node.physicsBody?.contactTestBitMask = heroCategory
        node.physicsBody?.collisionBitMask = 0;

        return node

    }

    func creatPlayer() -> SKNode {

        let playerNode = SKNode()
        let sprite = SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 50, height: 50))
        playerNode.addChild(sprite)

        playerNode.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
        playerNode.physicsBody?.dynamic = false
        playerNode.physicsBody?.allowsRotation = false
        playerNode.physicsBody?.restitution = 1.0
        playerNode.physicsBody?.friction = 0.0
        playerNode.physicsBody?.angularDamping = 0.0
        playerNode.physicsBody?.linearDamping = 0.0
        playerNode.physicsBody?.categoryBitMask = heroCategory
        playerNode.physicsBody?.contactTestBitMask = platformCategory
        playerNode.physicsBody?.collisionBitMask = 0;

        return playerNode

    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

        /* Called when a touch begins */
        _player.physicsBody?.dynamic = true

    }

    override func update(currentTime: CFTimeInterval) {

        /* Called before each frame is rendered */
        if(CGRectIntersectsRect(platform.frame, _player.frame)){
            println("Collision")
        }
    }

}

Может быть, использование CGRectIntersectsRect — неправильный подход, но вместо этого можно использовать меня?


person grape1    schedule 24.07.2015    source источник
comment
Я только что проверил ваш код, и он работает. Мне просто нужно было изменить PlatformNode на SKSpriteNode, чтобы запустить его. Вы уверены, что в области отладки не напечатано столкновение?   -  person Whirlwind    schedule 24.07.2015
comment
Нет, но проблема была в том, что фрейм платформы был 0   -  person grape1    schedule 24.07.2015
comment
Да, это из-за свойства фрейма SKNode. Кадр вашего узла игрока также (0,0,0,0). Я добавил ответ, который описывает это поведение.   -  person Whirlwind    schedule 24.07.2015


Ответы (1)


Свойство фрейма

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

Также из документов:

Фрейм непуст, если класс узла рисует содержимое.

А поскольку класс SKNode не выполняет никакого рисования сам по себе, и ваша платформа, вероятно, является подклассом SKNode, а игрок - SKNode, свойство фрейма всегда (0,0,0,0).

Вы можете получить доступ к реальному размеру кадра несколькими способами:

О calcualteAccumulatedFrame() из документов:

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

person Whirlwind    schedule 24.07.2015