位掩码可能存在问题,节点冲突无法正常工作

时间:2018-12-25 11:27:50

标签: swift xcode skphysicsbody skphysicscontact

m making a test alien shooter game, where i want the player to gain points from shooting one kind of alien and lose from another. And when the player collides with the aliens he loses points. But i陷入了一个问题,即当我与外星人碰撞时(categorybitmask 0),什么也没发生。但是,当玩家与categorybitmask 1发生冲突时,他将失去积分。我需要它对两个外星人都起作用。

我尝试过更改categorybitmask,碰撞位掩码和contactTestbitmask,但是没有任何效果。我已经添加了很多代码,以便您可以看到它们如何挂在一起。

   // let xPos = CGFloat.random(in: 0...414)
   // let yPos = frame.size.height + player.size.height
   // player.position = CGPoint(x: xPos, y: yPos)
    player.zPosition = -1;
      let index = Int.random(in: 0...1)
    player.physicsBody = SKPhysicsBody(rectangleOf: player.size)
    player.physicsBody?.isDynamic = false

    player.physicsBody?.categoryBitMask = playerCategory
   player.physicsBody?.contactTestBitMask = alienCategories[index]
   player.physicsBody?.collisionBitMask = alienCategories[index]
  player.physicsBody?.usesPreciseCollisionDetection = true



    self.addChild(player)

    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    self.physicsWorld.contactDelegate = self

    scoreLabel = SKLabelNode(text: "Score: 0")
    scoreLabel.position = CGPoint(x: 100, y: self.frame.size.height - 60)
    scoreLabel.fontName = "AmericanTypewriter-Bold"
    scoreLabel.fontSize = 36
    scoreLabel.fontColor = UIColor.white
    score = 0

    self.addChild(scoreLabel)

    gameTimer = Timer.scheduledTimer(timeInterval: 0.75, target: self, selector: #selector(addAlien), userInfo: nil, repeats:true) //Hvor ofte ting skal spawne / normal = 0.75
    gameTimer = Timer.scheduledTimer(timeInterval: 28, target: self, selector: #selector(shutoff), userInfo: nil, repeats:false) //Hvor ofte ting skal spawne / normal = 0.75
    gameTimer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(begin2), userInfo: nil, repeats:true) //Hvor ofte ting skal spawne / normal = 0.75





    motionManger.accelerometerUpdateInterval = 0.2
    motionManger.startAccelerometerUpdates(to: OperationQueue.current!) { (data:CMAccelerometerData?, error:Error?) in
        if let accelerometerData = data {
            let acceleration = accelerometerData.acceleration
            self.xAcceleration = CGFloat(acceleration.x) * 0.75 + self.xAcceleration * 0.25
        }
    }



}



func shutoff(){

    gameTimer.invalidate()


}


func begin2(){

    gameTimer = Timer.scheduledTimer(timeInterval: 0.60, target: self, selector: #selector(addAlien), userInfo: nil, repeats:true) //Hvor ofte ting skal spawne / normal = 0.75



}





func addAlien () {

    let index = Int.random(in: 0...1)
   let textureName = alienTextureNames[index]
    alien = SKSpriteNode(imageNamed: textureName)

    let xPos = CGFloat.random(in: 0...414)
    let yPos = frame.size.height + alien.size.height
    alien.position = CGPoint(x: xPos, y: yPos)
    alien.zPosition = -1;

    alien.physicsBody = SKPhysicsBody(rectangleOf: alien.size)
    alien.physicsBody?.isDynamic = true
    alien.physicsBody?.categoryBitMask = alienCategories [index]
   alien.physicsBody?.contactTestBitMask = photonTorpedoCategory
   alien.physicsBody?.collisionBitMask =  photonTorpedoCategory



    self.addChild(alien)

    let moveAction = SKAction.moveTo(y: -alien.size.height, duration: 6)
    alien.run(moveAction, completion: { alien.removeFromParent() })

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    fireTorpedo()

}


func fireTorpedo() {
    let index = Int.random(in: 0...1)
       let index2 = Int.random(in: 0...1)
    let textureName = alienTextureNames[index]
    self.run(SKAction.playSoundFileNamed("torpedo.mp3", waitForCompletion: false))

    let torpedoNode = SKSpriteNode(imageNamed: "torpedo")
    torpedoNode.position = player.position
    torpedoNode.position.y += 5

    torpedoNode.physicsBody = SKPhysicsBody(circleOfRadius: torpedoNode.size.width / 2)
    torpedoNode.physicsBody?.isDynamic = true

    torpedoNode.physicsBody?.categoryBitMask = photonTorpedoCategory
    torpedoNode.physicsBody?.contactTestBitMask = photonTorpedoCategory
    torpedoNode.physicsBody?.collisionBitMask = photonTorpedoCategory
    torpedoNode.physicsBody?.usesPreciseCollisionDetection = true

    self.addChild(torpedoNode)

    let animationDuration:TimeInterval = 0.3


    var actionArray = [SKAction]()

    actionArray.append(SKAction.move(to: CGPoint(x: player.position.x, y: self.frame.size.height + 10), duration: animationDuration))
    actionArray.append(SKAction.removeFromParent())

    torpedoNode.run(SKAction.sequence(actionArray))



}


func didBegin(_ contact: SKPhysicsContact) {

    var firstBody:SKPhysicsBody
    var secondBody:SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    }else{
        firstBody = contact.bodyB
        secondBody = contact.bodyA

    }











    if firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == alienCategories[0] {
        playerDidCollideWithAlien(playerNode: firstBody.node as! SKSpriteNode, alienNode: secondBody.node as! SKSpriteNode)

        score -= 5



    }

    if firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == alienCategories[1] {
       playerDidCollideWithAlien2(playerNode: firstBody.node as! SKSpriteNode, alienNode: secondBody.node as! SKSpriteNode)
        score -= 5

    }







    if firstBody.categoryBitMask == photonTorpedoCategory && secondBody.categoryBitMask == alienCategories[0] {
        torpedoDidCollideWithAlien(torpedoNode: firstBody.node as! SKSpriteNode, alienNode: secondBody.node as! SKSpriteNode)

        score += 5



    }else if firstBody.categoryBitMask == photonTorpedoCategory && secondBody.categoryBitMask == alienCategories[1] {
        torpedoDidCollideWithREDAlien(torpedoNode: firstBody.node as! SKSpriteNode, alienNode: secondBody.node as! SKSpriteNode)
        score -= 5

    }/*else if firstBody.categoryBitMask == photonTorpedoCategory && secondBody.categoryBitMask == alienCategories[2] {
        torpedoDidCollideWithAlien(torpedoNode: firstBody.node as! SKSpriteNode, alienNode: secondBody.node as! SKSpriteNode)
        score -= 10

    }

   */
}










func playerDidCollideWithAlien (playerNode:SKSpriteNode, alienNode:SKSpriteNode) {


    let explosion = SKEmitterNode(fileNamed: "Explosion")!
    explosion.position = alienNode.position
    self.addChild(explosion)

    self.run(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))


    playerNode.removeFromParent()



    self.run(SKAction.wait(forDuration: 2)) {
        explosion.removeFromParent()
    }

}


func playerDidCollideWithAlien2 (playerNode:SKSpriteNode, alienNode:SKSpriteNode) {


    let explosion = SKEmitterNode(fileNamed: "Explosion2")!
    explosion.position = alienNode.position
    self.addChild(explosion)

    self.run(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))


      alienNode.removeFromParent()



    self.run(SKAction.wait(forDuration: 2)) {
        explosion.removeFromParent()
    }




}






func torpedoDidCollideWithAlien (torpedoNode:SKSpriteNode, alienNode:SKSpriteNode) {

    let explosion = SKEmitterNode(fileNamed: "Explosion")!
    explosion.position = alienNode.position
    self.addChild(explosion)

    self.run(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))

    torpedoNode.removeFromParent()
    alienNode.removeFromParent()


    self.run(SKAction.wait(forDuration: 2)) {
        explosion.removeFromParent()
    }

    //score += 5


}



func torpedoDidCollideWithREDAlien (torpedoNode:SKSpriteNode, alienNode:SKSpriteNode) {

    let explosion = SKEmitterNode(fileNamed: "Explosion2")!
    explosion.position = alienNode.position
    self.addChild(explosion)

    self.run(SKAction.playSoundFileNamed("explosion.mp3", waitForCompletion: false))

    torpedoNode.removeFromParent()
    alienNode.removeFromParent()


    self.run(SKAction.wait(forDuration: 2)) {
        explosion.removeFromParent()
    }

    //score += 5


}

0 个答案:

没有答案