как убрать спрайт после трех попаданий на него - PullRequest
0 голосов
/ 22 декабря 2018

Я учусь делать игры на swift и spritekit, но застрял в одном месте.Мне удалось убрать «врага» и «пулю» после первого столкновения.Подскажите, пожалуйста, как убрать «врага» после того, как «пуля» попала в него три раза.Я долго искал ответ в интернете, но безуспешно.

import SpriteKit
import GameplayKit

class enemiesValue: SKSpriteNode {
    var health: Int = 3
}

class bulletValue: SKSpriteNode {
    var damage: Int = 1
}

class GameScene: SKScene, SKPhysicsContactDelegate {

var player: SKSpriteNode!
var touchLocation: CGPoint!
var timeSpawnEnemies: Timer!
var timeSpawnBullet: Timer!

struct PhysicsCategory {
    static let enemyCategory: UInt32 = 0x1 << 1
    static let bulletCategory: UInt32 = 0x1 << 0
}

override func didMove(to view: SKView) {
    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    self.physicsWorld.contactDelegate = self

    //playerAdd()
    timeSpawnEnemies = Timer.scheduledTimer(timeInterval: 2.75, target: self, selector: #selector(enemiesAdd), userInfo: nil, repeats: true)

}

@objc func enemiesAdd() {
    let enemyNode = enemiesValue(imageNamed: "enemy")
    let randomPos = GKRandomDistribution(lowestValue: -350, highestValue: 350)
    let pos = CGFloat(randomPos.nextInt())
    enemyNode.position = CGPoint(x: pos, y: 800)
    enemyNode.size = CGSize(width: 50, height: 50)
    enemyNode.yScale = 1.5
    enemyNode.xScale = 1.5

    //enemyNode.userData = ["health": 3]

    enemyNode.physicsBody = SKPhysicsBody(rectangleOf: enemyNode.size)
    enemyNode.physicsBody?.isDynamic = true
    enemyNode.physicsBody?.categoryBitMask = PhysicsCategory.enemyCategory
    enemyNode.physicsBody?.contactTestBitMask = PhysicsCategory.bulletCategory
    enemyNode.physicsBody?.collisionBitMask = 0

    self.addChild(enemyNode)

    let animDuration: TimeInterval = 16

    var actions = [SKAction]()

    actions.append(SKAction.move(to: CGPoint(x: pos, y: -800), duration: animDuration))
    actions.append(SKAction.removeFromParent())

    enemyNode.run(SKAction.sequence(actions))
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    //timeSpawnBullet = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(shoot), userInfo: nil, repeats: true)
    shoot()

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    //timeSpawnBullet.invalidate()
}

@objc func shoot() {
    let bullet = bulletValue(imageNamed: "bullet")
    bullet.size = CGSize(width: 75, height: 25)
    bullet.position = player.position

    bullet.physicsBody = SKPhysicsBody(rectangleOf: bullet.size)
    bullet.physicsBody?.isDynamic = true
    bullet.physicsBody?.categoryBitMask = PhysicsCategory.bulletCategory
    bullet.physicsBody?.contactTestBitMask = PhysicsCategory.enemyCategory
    bullet.physicsBody?.collisionBitMask = 0
    bullet.physicsBody?.usesPreciseCollisionDetection = true


    self.addChild(bullet)

    let animDuration: TimeInterval = 0.3

    var actions = [SKAction]()

    actions.append(SKAction.move(to: CGPoint(x: player.position.x, y: 800), duration: animDuration))
    actions.append(SKAction.removeFromParent())

    bullet.run(SKAction.sequence(actions))

}

func didBegin(_ contact: SKPhysicsContact) {
    let enemyBody: SKPhysicsBody
    let bulletBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        bulletBody = contact.bodyA
        enemyBody = contact.bodyB
    } else {
        bulletBody = contact.bodyB
        enemyBody = contact.bodyA
}

    if (enemyBody.categoryBitMask & PhysicsCategory.enemyCategory) != 0 && (bulletBody.categoryBitMask & PhysicsCategory.bulletCategory) != 0 {


        collisionElementsBullets(bulletNode: bulletBody.node as! SKSpriteNode)


        collisionElementsEnemies(enemyNode: enemyBody.node as! SKSpriteNode)

    }
}

func collisionElementsBullets(bulletNode: SKSpriteNode) {

    bulletNode.removeFromParent()

}

func collisionElementsEnemies(enemyNode: SKSpriteNode) {

    enemyNode.removeFromParent()

}

}

1 Ответ

0 голосов
/ 22 декабря 2018
func collisionElementsEnemies(enemyNode: enemiesValue) 
{
   enemyNode.health = enemyNode.health - 1       

   if enemyNode.health == 0
   {
       enemyNode.removeFromParent()
   }
}

Поскольку ваш enemiesValue (кстати, он должен быть заглавным и переименован. Я бы назвал его EnemySprite), является потомком SKSpriteNode, вы можете поместить этот тип как тип параметра в collisionElementsEnemies.Затем просто уменьшите здоровье врагов и уберите врага из родительского, когда его здоровье упадет до нуля

Вы можете вызвать этот метод, например так:

collisionElementsEnemies(enemyNode: enemyBody.node as! enemiesValue)
...