首页 > 解决方案 > 如何检测盒子对象和球之间的碰撞

问题描述

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    
    guard let touch = touches.first else { return }
    
    let location = touch.location(in: self) // locates touches on the screen
    
    let objects = nodes(at: location) // shows all objects were screen was touched
    
    if objects.contains(editLabel) { // checking if appropriate array of objects contains the editLabel
        editingMode.toggle()
        
        
        
    } else {
        if editingMode {
            let size = CGSize(width: Int.random(in: 16...128), height: 16)
            let box = SKSpriteNode(color: UIColor(red: CGFloat.random(in: 0...1), green: CGFloat.random(in: 0...1), blue: CGFloat.random(in: 0...1), alpha: 1), size: size)
            box.zRotation = CGFloat.random(in: 0...3)
            box.position = location // add the box ob ject were the user taps
            box.name = "box"
            
            box.physicsBody = SKPhysicsBody(rectangleOf: box.size)
            box.physicsBody!.contactTestBitMask = box.physicsBody!.collisionBitMask
            box.physicsBody?.isDynamic = false // box object will not move when impact happens
            addChild(box) // box object will be added to the screen
            
        } else if usedBalls != 0 {
            let ball = SKSpriteNode(imageNamed: allBalls.randomElement() ?? "ballRed.png") // pulls out the red ball from app bundle
            ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width / 2.0) // animates the ball object
            ball.physicsBody!.contactTestBitMask = ball.physicsBody!.collisionBitMask
            ball.physicsBody?.restitution = 0.4 // determines the ball object bounciness
            ball.position = location // ball will appear where the user tapped on the screen
            ball.name = "ball"
 // ball.position = CGPoint (x: 550, y: 700)
 addChild (ball) // adds the ball object to the screen
 usedBalls -= 1
            
        }
    }
    
}



func makeBouncer(at position: CGPoint) {
let bouncer = SKSpriteNode(imageNamed: "bouncer.png")
bouncer.position = position
bouncer.physicsBody = SKPhysicsBody(circleOfRadius: bouncer.size.width / 2.0)
bouncer.physicsBody?.isDynamic = false // bouncer object is fixed to the bottom of the screen
addChild(bouncer)

}

func makeSlot(at position: CGPoint, isGood: Bool) {
    var slotBase: SKSpriteNode
    var slotGlow: SKSpriteNode
    
    if isGood {
        slotBase = SKSpriteNode(imageNamed: "slotBaseGood.png")
        slotGlow = SKSpriteNode(imageNamed: "slotGlowGood.png")
        slotBase.name = "good"
        
    } else {
        slotBase = SKSpriteNode(imageNamed: "slotBaseBad.png")
        slotGlow = SKSpriteNode(imageNamed: "slotGlowBad.png")
        slotBase.name = "bad"
    }
    
    slotBase.position = position
    slotGlow.position = position
    
    slotBase.physicsBody = SKPhysicsBody(rectangleOf: slotBase.size)
    slotBase.physicsBody?.isDynamic = false
    
    addChild(slotBase)
    addChild(slotGlow)
    
    let spin = SKAction.rotate(byAngle: .pi, duration: 10)
    let spinForever = SKAction.repeatForever(spin)
    slotGlow.run(spinForever)
}

func collisionBetween(ball: SKNode, object: SKNode) {
    if object.name == "good" { // green slot
        destroy(ball: ball)
        score += 1
        usedBalls += 1
    } else if object.name == "bad" { // red slot
        destroy(ball: ball) // the ball will be removed once drops into a green or red slot
        score -= 1
        
    }
    
}


func boxandballCollision(box: SKNode, ball: SKNode) {
    if ball.name == "ball" {
    destroyObject(box: box)
        
    }
}


func destroyObject(box: SKNode) {
    if let fireParticles = SKEmitterNode(fileNamed: "FireParticles") {
        fireParticles.position = box.position
        addChild(fireParticles)
    }

    box.removeFromParent() // box should be removed when a ball will hit it
}


func destroy(ball: SKNode) {
    if let fireParticles = SKEmitterNode(fileNamed: "FireParticles") {
        fireParticles.position = ball.position
        addChild(fireParticles)
    }
    
    ball.removeFromParent() // ball object is removed from scene when hits a slot

}

func didBegin(_ contact: SKPhysicsContact) {
    guard let nodeA = contact.bodyA.node else { return }
    guard let nodeB = contact.bodyB.node else { return }
    
    if nodeA.name == "ball" {
        collisionBetween(ball: nodeA, object: nodeB)
    } else if nodeB.name == "ball" {
        collisionBetween(ball: nodeB, object: nodeA)
        
        }
    }
    
func begin(_ contact: SKPhysicsContact) {
    guard let nodeA = contact.bodyA.node else { return }
    guard let nodeB = contact.bodyB.node else { return }
    
    if nodeA.name == "box" {
        boxandballCollision(box: nodeA, ball: nodeB)
    } else if nodeB.name == "box" {
        boxandballCollision(box: nodeB, ball: nodeA)
      }
   }

当球击中它时,我想移除任何盒子对象,这只是一个用于学习目的的简单游戏,但我正在努力解决它。我对 box 对象使用了完全相同的方法,这可以获取有关每次碰撞的通知“box.physicsBody!.contactTestBitMask = box.physicsBody!.collisionBitMask”。

标签: swiftsprite-kit

解决方案


推荐阅读