如何让敌人独立生活?

时间:2017-03-03 23:44:29

标签: ios sprite-kit swift3

请帮助!!!我一直试图解决这个问题。我在网上搜索过,找不到任何可以帮助我的东西。

我正在制作一个游戏,你在中间是一艘太空飞船,敌舰正向你移动,你必须射击它们。有些敌人有不同的生活。例如:一艘红色的船只爆炸一次,蓝色的船只需要3次,等等。我拥有一切只能生活的东西。例如:每当一艘蓝色的船被召唤到屏幕上时我就会射击一次,所以它的寿命会下降到2.但是每当另一艘蓝色船被召唤时,第一艘蓝色船的生命重新恢复到3。无论如何,我能做到这样,只要船舶失去生命,即使有其他船只被召唤,它仍然是那样的吗?

这是我的船只功能被调用并将敌人太空船添加到屏幕上:

func VillainRight(){
    let TooMuch = self.size.width
    let point = UInt32(TooMuch)
    life = 3
    let VillainR = SKSpriteNode(imageNamed: "BlueVillain")

    VillainR.zPosition = 2
    VillainR.position = CGPoint(x: self.frame.minX,y: CGFloat(arc4random_uniform(point)))

    //This code makes the villain's Zposition point towards the SpaceShip
    let angle = atan2(SpaceShip.position.y - VillainR.position.y, SpaceShip.position.x - VillainR.position.x)
    VillainR.zRotation = angle - CGFloat(M_PI_2)


    let MoveToCenter = SKAction.move(to: CGPoint(x: self.frame.midX, y: self.frame.midY), duration: 15)

    //Physics World
    VillainR.physicsBody = SKPhysicsBody(rectangleOf: VillainR.size)
    VillainR.physicsBody?.categoryBitMask = NumberingPhysics.RightV
    VillainR.physicsBody?.contactTestBitMask = NumberingPhysics.Laser | NumberingPhysics.SpaceShip
    VillainR.physicsBody?.affectedByGravity = false
    VillainR.physicsBody?.isDynamic = true






    VillainR.run(MoveToCenter)
    addChild(VillainR)
    }

这是调用此函数的代码:

_ = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(Level1.VillainRight), userInfo: nil, repeats: true)

我在Swift中使用spritekit。 非常感谢你提前!

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为life变量被声明为场景的属性,并且它不是特定节点(敌舰)的本地变量。你可以通过几种方式解决这个问题......第一种方法是使用节点的userData属性:

import SpriteKit

let kEnergyKey = "kEnergyKey"

class GameScene: SKScene, SKPhysicsContactDelegate {

    override func didMove(to view: SKView) {


        let blueShip = getShip(energy: 3)
        let greenShip = getShip(energy: 2)
        let redShip = getShip(energy: 1)

        if let blueShipEnergy = blueShip.userData?.value(forKey: kEnergyKey) as? Int {

            print("Blue ship has \(blueShipEnergy) lives left")
            //hit the ship
            blueShip.userData?.setValue(blueShipEnergy-1, forKey: kEnergyKey)

            if let energyAfterBeingHit = blueShip.userData?.value(forKey: kEnergyKey) as? Int {

                print("Blue ship has \(energyAfterBeingHit) lives left")
            }
        }
    }

    func getShip(energy:Int)->SKSpriteNode{
        //determine which texture to load here based on energy value
        let ship = SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50))

        ship.userData = [kEnergyKey:energy]

        return ship
    }
}

这是文档关于userData属性的说法:

  

您可以使用此属性将自己的数据存储在节点中。例如,   您可以存储有关每个节点的游戏特定数据,以便在您的内部使用   游戏逻辑。这可以是创建自己的节点的有用替代方法   用于保存游戏数据的子类。

如您所见,替代方案是节点的子类化(SKSpriteNode):

class Enemy:SKSpriteNode {

    private var energy:Int
    //do initialization here
}