在swift 3中使用spritekit检测冲突并删除子进程

时间:2017-08-30 02:50:34

标签: swift3 collision removechild

最后,我正在尝试检测碰撞,并在接触矩形时删除大理石。我该怎么做?

import CoreMotion
import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate{
    let marbleSprite = SKSpriteNode(imageNamed: "marble")
    let marbleSprite1 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite2 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite3 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite4 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite5 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite6 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite7 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite8 = SKSpriteNode(imageNamed: "marble")
    let marbleSprite9 = SKSpriteNode(imageNamed: "marble")
    let rectSprite = SKSpriteNode(imageNamed: "rect")
    let rectSprite1 = SKSpriteNode(imageNamed: "rect")
    let motionManager = CMMotionManager()

    let marbleCategory: UInt32 = 1 << 0
    let wallCategory: UInt32 = 2 << 0
    let rectCategory: UInt32 = 3 << 0
    var teal = SKColor(red: 0, green: 128, blue: 128, alpha: 1)

    override func didMove(to view: SKView) {
        backgroundColor = teal

        marbleSprite.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite.setScale(0.5)
        marbleSprite.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite.size.width / 2)
        marbleSprite.physicsBody?.allowsRotation = true
        marbleSprite.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite1.name = "Marble"

        marbleSprite1.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite1.setScale(0.5)
        marbleSprite1.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite1.size.width / 2)
        marbleSprite1.physicsBody?.allowsRotation = true
        marbleSprite1.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite1.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite1.name = "Marble"


        marbleSprite2.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite2.setScale(0.5)
        marbleSprite2.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite2.size.width / 2)
        marbleSprite2.physicsBody?.allowsRotation = true
        marbleSprite2.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite2.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite2.name = "Marble"

        marbleSprite3.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite3.setScale(0.5)
        marbleSprite3.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite3.size.width / 2)
        marbleSprite3.physicsBody?.allowsRotation = true
        marbleSprite3.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite3.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite3.name = "Marble"

        marbleSprite4.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite4.setScale(0.5)
        marbleSprite4.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite4.size.width / 2)
        marbleSprite4.physicsBody?.allowsRotation = true
        marbleSprite4.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite4.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite4.name = "Marble"

        marbleSprite5.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite5.setScale(0.5)
        marbleSprite5.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite5.size.width / 2)
        marbleSprite5.physicsBody?.allowsRotation = true
        marbleSprite5.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite5.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite5.name = "Marble"

        marbleSprite6.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite6.setScale(0.5)
        marbleSprite6.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite6.size.width / 2)
        marbleSprite6.physicsBody?.allowsRotation = true
        marbleSprite6.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite6.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite6.name = "Marble"

        marbleSprite7.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite7.setScale(0.5)
        marbleSprite7.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite7.size.width / 2)
        marbleSprite7.physicsBody?.allowsRotation = true
        marbleSprite7.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite7.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite7.name = "Marble"

        marbleSprite8.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite8.setScale(0.5)
        marbleSprite8.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite8.size.width / 2)
        marbleSprite8.physicsBody?.allowsRotation = true
        marbleSprite8.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite8.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite8.name = "Marble"

        marbleSprite9.position = CGPoint(x: self.frame.width / 15, y: self.frame.height / 15)
        marbleSprite9.setScale(0.5)
        marbleSprite9.physicsBody = SKPhysicsBody(circleOfRadius: marbleSprite9.size.width / 2)
        marbleSprite9.physicsBody?.allowsRotation = true
        marbleSprite9.physicsBody?.categoryBitMask = marbleCategory
        marbleSprite9.physicsBody?.collisionBitMask = wallCategory | marbleCategory
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsBody?.isDynamic = false
        self.physicsBody?.categoryBitMask = wallCategory
        marbleSprite9.name = "Marble"

        rectSprite.position = CGPoint(x: 0, y: self.frame.height / 2)
        rectSprite.setScale(3.0)
        rectSprite.physicsBody = SKPhysicsBody(rectangleOf: rectSprite.size)
        rectSprite.physicsBody?.allowsRotation = false
        rectSprite.physicsBody?.categoryBitMask = rectCategory
        rectSprite.physicsBody?.collisionBitMask = marbleCategory
        rectSprite.physicsBody?.affectedByGravity = false
        rectSprite.physicsBody?.isDynamic = false
        rectSprite.name = "Rect"

        rectSprite1.position = CGPoint(x: 410, y: self.frame.height / 2)
        rectSprite1.setScale(3.0)
        rectSprite1.physicsBody = SKPhysicsBody(rectangleOf: rectSprite1.size)
        rectSprite1.physicsBody?.allowsRotation = false
        rectSprite1.physicsBody?.categoryBitMask = rectCategory
        rectSprite1.physicsBody?.collisionBitMask = marbleCategory
        rectSprite1.physicsBody?.affectedByGravity = false
        rectSprite1.physicsBody?.isDynamic = false
        rectSprite1.name = "Rect"



        physicsWorld.gravity = CGVector(dx: 0, dy: 0)
        addChild(marbleSprite)
        addChild(marbleSprite1)
        addChild(marbleSprite2)
        addChild(marbleSprite3)
        addChild(marbleSprite4)
        addChild(marbleSprite5)
        addChild(marbleSprite6)
        addChild(marbleSprite7)
        addChild(marbleSprite8)
        addChild(marbleSprite9)
        addChild(rectSprite)
        addChild(rectSprite1)
        motionManager.startAccelerometerUpdates()






    }
    override func update(_ currentTime: TimeInterval) {
        if let accelerometerData = motionManager.accelerometerData {
            print(accelerometerData)
            physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.x * 10, dy: accelerometerData.acceleration.y * 10)
        }
    }

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

        if contact.bodyA.node?.name == "Marble" {
            firstBody = contact.bodyA
            secondBody = contact.bodyB
        } else {
            firstBody = contact.bodyB
            secondBody = contact.bodyA
        }
        if firstBody.node?.name == "Marble" && secondBody.node?.name == "Rect" {
            secondBody.node?.removeFromParent()
        }
    }

}

我认为会发生的事情是,一旦大理石接触到矩形,大理石就会消失,然后消失。实际发生的事情是当大理石撞击矩形时,没有任何反应。我做错了吗?

1 个答案:

答案 0 :(得分:0)

尝试进行这些更改并设置联系人委托。

let marbleCategory: UInt32 = 0x1 << 0
let wallCategory: UInt32 = 0x1 << 1
let rectCategory: UInt32 = 0x1 << 2

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

func didBegin(_ contact: SKPhysicsContact) {
    let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
    if collision == marbleCategory | rectCatagory {
        rectSprite.removeFromParent()
    }
}