代码之家  ›  专栏  ›  技术社区  ›  existing person

在swift 3中使用spritekit检测碰撞并移除儿童

  •  1
  • existing person  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  0
  •   Jeff    8 年前

    尝试进行这些更改并设置联系人代理。

    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()
        }
    }