请帮助!!!我一直在努力解决这个问题。我已经搜索了互联网,找不到任何可以帮助我的东西。
我目前正在制作一场游戏,您是中间的太空飞船,而敌人的船只向您移动,您必须射击它们。一些敌人的生命不同。例如:一艘红船需要一枪爆炸,蓝色的船需要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
}