Xcode Spritekit уничтожить спрайт на ощупь и создать другие спрайты? - PullRequest
0 голосов
/ 08 ноября 2018

Я создаю игру, в которой игрок должен коснуться вражеских спрайтов, чтобы уничтожить их. Плеер всегда находится в центре экрана. Существует несколько различных типов врагов. Сначала я проверяю идею приложения с двумя типами врагов.

вот код, который создает врагов.

func createEnemy(type:Enemies, forSpawner spawner: Int) -> SKSpriteNode?
    {

        switch type {
        case .diamond:
            enemySprite = SKSpriteNode(imageNamed: "Diamond")
            enemySprite.setScale(0.5)
            enemySprite.color = UIColor.green
            enemySprite.colorBlendFactor = 1
            enemySprite.name = "enemy"
            let location = targetLocation
            let action = SKAction.move(to: CGPoint(x: location.x, y: location.y), duration: 2.0)
            enemySprite.run(action)
        case .diamondSolid:
            enemySprite = SKSpriteNode(imageNamed: "DiamondSolid")
            enemySprite.setScale(0.5)
            enemySprite.color = UIColor.purple
            enemySprite.colorBlendFactor = 1
            enemySprite.name = "enemySolid"
            let location = targetLocation
            let action = SKAction.move(to: CGPoint(x: location.x, y: location.y), duration: 1.0)
            enemySprite.run(action)
        }

        guard let enemyPosition = spawnArray?[spawner].position else {return nil}
        let dx = targetLocation.x - enemyPosition.x
        let dy = targetLocation.y - enemyPosition.y
        let angle = atan2(dy,dx)

        enemySprite.position.x = enemyPosition.x
        enemySprite.position.y = enemyPosition.y
        enemySprite.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: enemySprite.size.width, height: enemySprite.size.height))
        enemySprite.physicsBody?.categoryBitMask = enemyCategory
        enemySprite.zRotation = angle - 90 * degreesToRadians



        return enemySprite

    }

и функция касания

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let location = touch.previousLocation(in: self)
            let node = self.nodes(at: location).first

            if node?.name == "enemy"{
                node?.removeFromParent()
            }
        }
    }

Я думаю, что мне нужно сделать, это отправить местоположение из события касания и отправить его в новую функцию, которая уничтожает врага с некоторой добротой частиц эмиттера, чтобы дать игроку понять, что форма мертва. В зависимости от типа, он будет либо уничтожать и добавлять к счету, либо уничтожать, добавлять к счету и порождать ряд других врагов и перемещать их назад на определенную величину, прежде чем перемещать их к targetLocation. Любая помощь о том, как я мог пойти об этом?

1 Ответ

0 голосов
/ 10 ноября 2018

Хорошо, я думаю, что я решил эту проблему, создав класс для самих врагов, но теперь у меня есть проблема, когда я не могу вызвать излучателя в качестве эффекта взрыва, когда каждый враг убит.я удалил некоторый код, чтобы уравновесить проблему, но вот код

import SpriteKit

enum EnemyType:Int {
    case diamond
    case triangle
    case chevron
    case elipse
    case pentagon
    case diamondSolid
    case traingleSolid
    case elipseSolid
    case pentagonSolid
}

class Enemy: SKSpriteNode {

    let type: EnemyType
    var enemyTexture:SKTexture!
    var touched = false
    init (type:EnemyType){
        self.type = type

        switch type {
        case .diamond:
            enemyTexture = SKTexture(imageNamed: "diamond")
        case .triangle:
            enemyTexture = SKTexture(imageNamed: "triangle")
        case .chevron:
            enemyTexture = SKTexture(imageNamed: "chevron")
        case .elipse:
            enemyTexture = SKTexture(imageNamed: "elipse")
        case .pentagon:
            enemyTexture = SKTexture(imageNamed: "pentagon")
        case .diamondSolid:
            enemyTexture = SKTexture(imageNamed: "diamondSolid")
        case .traingleSolid:
            enemyTexture = SKTexture(imageNamed: "triangleSolid")
        case .elipseSolid:
            enemyTexture = SKTexture(imageNamed: "elipseSolid")
        case .pentagonSolid:
            enemyTexture = SKTexture(imageNamed: "pentagonSolid")

        }

        super.init(texture: enemyTexture,color:UIColor.clear, size: CGSize.zero)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func createPhysicsBody()
    {
        physicsBody = SKPhysicsBody(rectangleOf: size)
        physicsBody?.isDynamic = true
        physicsBody?.categoryBitMask = PhysicsCategory.enemyCategory
        physicsBody?.contactTestBitMask = PhysicsCategory.playerCategory
        physicsBody?.collisionBitMask = PhysicsCategory.playerCategory
    }


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

            if let explosion = SKEmitterNode(fileNamed: "explosion.sks"){
            explosion.position = self.position
            self.addChild(explosion)
            self.run(SKAction.wait(forDuration: 1)){
            explosion.removeFromParent()
            }
        }
        removeFromParent()
    }

}

на данный момент все, что должен делать этот код, - это удаление врага, которого коснулись, и воспроизведение эмиттера частиц.Я делаю что-то неправильно?

...