1

I'm new with Xcode and I'm trying to make a flappy bird game but I'm having troubles with the score and collision code, the game runs but it is infinite because the character never dies when touch the walls or ground and when I take the coins the score level don't increase, someone can help me with this please?

func createScene(){
    
    self.physicsWorld.contactDelegate = self
    
    for i in 0..<2 {
        let background = SKSpriteNode(imageNamed: "Background")
        background.anchorPoint = CGPoint.zero
        background.position = CGPoint(x: CGFloat(i) * self.frame.width,y: 0)
        background.name = "background"
        background.size = (self.view?.bounds.size)!
        self.addChild(background)
        
    }
    
    scoreLbl.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 + self.frame.height / 2.5)
    scoreLbl.text = "\(score)"
    scoreLbl.zPosition = 6
    scoreLbl.fontSize = 60
    self.addChild(scoreLbl)
    
    Ground = SKSpriteNode(imageNamed: "Ground")
    Ground.setScale(0.5)
    Ground.position = CGPoint(x: self.frame.width / 2, y: 0 + Ground.frame.height / 2)
    
    Ground.physicsBody = SKPhysicsBody(rectangleOf: Ground.size)
    Ground.physicsBody?.categoryBitMask = PhysicsCatagory.Ground
    Ground.physicsBody?.collisionBitMask = PhysicsCatagory.Ghost
    Ground.physicsBody?.contactTestBitMask  = PhysicsCatagory.Ghost
    Ground.physicsBody?.affectedByGravity = false
    Ground.physicsBody?.isDynamic = false
    
    Ground.zPosition = 3
    
    self.addChild(Ground)
    
    
    
    Ghost = SKSpriteNode(imageNamed: "Ghost")
    Ghost.size = CGSize(width: 60, height: 70)
    Ghost.position = CGPoint(x: self.frame.width / 2 - Ghost.frame.width, y: self.frame.height / 2)
    
    Ghost.physicsBody = SKPhysicsBody(circleOfRadius: Ghost.frame.height / 2)
    Ghost.physicsBody?.categoryBitMask = PhysicsCatagory.Ghost
    Ghost.physicsBody?.collisionBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall
    Ghost.physicsBody?.contactTestBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall | PhysicsCatagory.Score
    Ghost.physicsBody?.affectedByGravity = false
    Ghost.physicsBody?.isDynamic = true
    
    Ghost.zPosition = 2
    
    
    self.addChild(Ghost)
    
    
    
    

    
}

override func didMove(to view: SKView) {
    /* Setup your scene here */
    
    createScene()
    
}

func createBTN(){
    
    restartBTN = SKSpriteNode(imageNamed: "RestartBtn")
    restartBTN.size = CGSize(width: 200,height: 100)
    restartBTN.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    restartBTN.zPosition = 6
    restartBTN.setScale(0)
    self.addChild(restartBTN)
    restartBTN.run(SKAction.scale(to: 1.0, duration: 0.3))
    
}

func didBeginContact(contact: SKPhysicsContact) {
    let firstBody = contact.bodyA
    let secondBody = contact.bodyB
    
  
    if firstBody.categoryBitMask == PhysicsCatagory.Score && secondBody.categoryBitMask == PhysicsCatagory.Ghost{
        
        score+=1
        scoreLbl.text = "score"
        firstBody.node?.removeFromParent()
        
    }
    else if firstBody.categoryBitMask == PhysicsCatagory.Ghost && secondBody.categoryBitMask == PhysicsCatagory.Score {
        
        score+=1
        scoreLbl.text = "score"
        secondBody.node?.removeFromParent()
        
    }
    
    else if firstBody.categoryBitMask == PhysicsCatagory.Ghost && secondBody.categoryBitMask == PhysicsCatagory.Wall || firstBody.categoryBitMask == PhysicsCatagory.Wall && secondBody.categoryBitMask == PhysicsCatagory.Ghost{
        
        enumerateChildNodes(withName: "wallPair", using: ({
            (node, error) in
            
            node.speed = 0
            self.removeAllActions()
            
        }))
        if died == false{
            died = true
            createBTN()
        }
    }
    else if firstBody.categoryBitMask == PhysicsCatagory.Ghost && secondBody.categoryBitMask == PhysicsCatagory.Ground || firstBody.categoryBitMask == PhysicsCatagory.Wall && secondBody.categoryBitMask == PhysicsCatagory.Ghost{
        enumerateChildNodes(withName: "wallPair", using: ({
            (node, error) in
            node.speed = 0
            self.removeAllActions()   
        }))
        if died == false{
            died = true
            createBTN()
        }
    }
}
Swift Dev Journal
  • 19,282
  • 4
  • 56
  • 66
  • I'd recommend adding the SpriteKit tag to your post so people can find it. Also, your post is very unclear. What behavior are you hoping to achieve? Where is `PhysicsCatagory` defined? Please provide more/better information so someone can help you. – West1 May 10 '21 at 15:57
  • The last else if, "|| firstBody.categoryBitMask == PhysicsCatagory.Wall" shoud be "|| firstBody.categoryBitMask == PhysicsCatagory.Ground" I think. The didBeginContact is for physics collision and contacts, why is the Score being checked here? It is worth adding "view.showsPhysics = true" so you can see if the bodies are set up. Also add print("collsion happened") or similar in your physics checks to make sure they are indeed working. – JohnL May 10 '21 at 18:44

0 Answers0