Программа не обнаруживает столкновения с Physics Body SpriteKit - PullRequest
0 голосов
/ 11 июня 2018

У меня есть простая игра, в которой появляются метеоры, и игрок должен увернуться от этих метеоров.Я пытаюсь определить, столкнулся ли игрок (ракетный корабль) с метеором (врагом) с PhysicsBody.Однако ничего не происходит, когда они сталкиваются.Консоль должна вывести «Обнаружен сбой». Вот мой код:

import SpriteKit
import GameplayKit
import UIKit



class GameScene: SKScene, SKPhysicsContactDelegate{

    let player = SKSpriteNode(imageNamed: "spaceship")
    let stars = SKSpriteNode(imageNamed: "stars")
    let meteor = SKSpriteNode(imageNamed: "meteor")


    override func didMove(to view: SKView) {
        print(frame.size.width)
        print(frame.size.height)

        stars.position = CGPoint(x:0, y:0)
        stars.zPosition = 1
        player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width / 2)

        player.position = CGPoint(x:0, y:-320)
        player.zPosition = 4
        player.physicsBody = SKPhysicsBody()
        player.physicsBody?.affectedByGravity = false
        player.physicsBody?.isDynamic = false

        player.physicsBody?.categoryBitMask = 0
        player.physicsBody?.collisionBitMask = 1
        player.physicsBody?.contactTestBitMask = 1



        self.addChild(player)
        self.addChild(stars)

        addMeteor()


    }



    func addMeteor() {
        meteor.physicsBody = SKPhysicsBody(circleOfRadius: meteor.size.width / 2)
        meteor.physicsBody?.affectedByGravity = false
        meteor.setScale(0.50)
        meteor.position = CGPoint(x:Int(arc4random()%300),y:Int(arc4random()%600))
        //meteor.position = CGPoint(x:0 , y:0)
        meteor.zPosition = 4

        meteor.physicsBody?.categoryBitMask = 1
        meteor.physicsBody?.collisionBitMask = 0

        self.addChild(meteor)
    }

    func fireBullet() {
        let bullet = SKSpriteNode(imageNamed: "bullet")
        bullet.position = player.position
        bullet.setScale(0.5)
        bullet.zPosition = 3
        self.addChild(bullet)

        let moveBullet = SKAction.moveTo(y: self.size.height + bullet.size.height, duration: 1)
        let deleteBullet = SKAction.removeFromParent()
        let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
        bullet.run(bulletSequence)


    }


    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        fireBullet()
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch:  AnyObject in touches {
            let pointOfTouch = touch.location(in: self)
            let previousPointOfTouch = touch.previousLocation(in: self)
            let amountDragged = pointOfTouch.x - previousPointOfTouch.x
            player.position.x += amountDragged
        }

    }

    func didBegin(_ contact: SKPhysicsContact) {
        print("Crash detected")
    }

    override func update(_ currentTime: TimeInterval) {
        meteor.position.y -= 6
        if meteor.position.y < player.position.y - 300{
            meteor.removeFromParent()
            addMeteor()

        }
        }
    }

Программа должна обнаружить коллизию и затем выполнить функцию didBegin (которая выводит «Обнаружен сбой» на консоль).Однако когда я запускаю программу, на консоли ничего не печатается.Кто-нибудь знает, что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 11 июня 2018

в методе didMove добавьте эту строку кода PhysicsWorld.contactDelegate = self .Вы устанавливаете playerCateoryBitmask в 0. Это означает, что ничто не может поразить игрока.используйте player.physicsBody? .categoryBitMask = 2 , а также установите свой метеор в качестве contactTestBitMask, например: meteor.physicsBody? .contactTestBitMask

...