程序未检测到与Physical Body SpriteKit的碰撞

时间:2018-06-11 20:07:19

标签: swift sprite-kit swift4

我有一个简单的游戏产生流星,玩家必须躲避这些流星。我试图通过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 :(得分:0)

在didMove方法中

添加以下代码行 physicsWorld.contactDelegate = self 。你将playerCateoryBitmask设置为0.这意味着没有任何东西可以击中玩家。使用 player.physicsBody?.categoryBitMask = 2 并将你的meteor设置为contactTestBitMask,如下所示: meteor.physicsBody?.contactTestBitMask