如何使敌人拥有独立的生命



请帮助!!!我一直在努力解决这个问题。我已经搜索了互联网,找不到任何可以帮助我的东西。

我目前正在制作一场游戏,您是中间的太空飞船,而敌人的船只向您移动,您必须射击它们。一些敌人的生命不同。例如:一艘红船需要一枪爆炸,蓝色的船需要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。非常感谢您!

正在发生的,因为life变量被声明为场景的属性,并且它不是特定节点(敌军)的本地化。您可以通过几种方式解决此问题...第一种方法将使用Node的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
}

最新更新