请帮助!!!我一直试图解决这个问题。我在网上搜索过,找不到任何可以帮助我的东西。
我正在制作一个游戏,你在中间是一艘太空飞船,敌舰正向你移动,你必须射击它们。有些敌人有不同的生活。例如:一艘红色的船只爆炸一次,蓝色的船只需要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。 非常感谢你提前!
答案 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
}