Возможная проблема с битовой маской, столкновение узлов не работает должным образом - PullRequest
0 голосов
/ 25 декабря 2018

Я 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), ничего не происходит.Но когда игрок сталкивается с категорийной маской 1, он теряет очки.Мне нужно, чтобы он работал на обоих инопланетян.

Я пытался изменить маску категорий, коллизию битов и контактную маску, но ничего не работает.Я добавил много кода, чтобы вы могли видеть, как он висит вместе.

   // 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


}
...