【问题标题】:Xcode Spritekit destroy sprite on touch and create other sprites?Xcode Spritekit 在触摸时破坏精灵并创建其他精灵?
【发布时间】:2019-04-12 03:36:57
【问题描述】:

我正在创建一个游戏,玩家必须触摸敌人的精灵才能摧毁它们。播放器始终位于屏幕中间。有许多不同的敌人类型,我首先使用 2 种敌人类型来测试应用程序的想法。

这是创建敌人的代码。

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。对我如何解决这个问题有任何帮助吗?

【问题讨论】:

    标签: ios sprite-kit


    【解决方案1】:

    好的,我想我通过为敌人本身创建一个类来解决这个问题,但现在我遇到了一个问题,即当每个敌人被杀死时,我无法生成发射器作为爆炸效果。我删除了一些代码来平衡问题,但这里是代码

    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()
        }
    
    }
    

    目前所有这些代码应该做的是移除被触摸的敌人并播放粒子发射器。难道我做错了什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多