Swift 在Spritekit的多个级别中更改状态
我做了一个不同级别的游戏,但感觉它太扩展了。我用有限的知识创建了不同的级别,我认为可以更有效地进行编码。我想根据当前等级改变敌人的状态。 这是我的密码↓Swift 在Spritekit的多个级别中更改状态,swift,sprite-kit,swift3,Swift,Sprite Kit,Swift3,我做了一个不同级别的游戏,但感觉它太扩展了。我用有限的知识创建了不同的级别,我认为可以更有效地进行编码。我想根据当前等级改变敌人的状态。 这是我的密码↓ func addEnemy() { if currentLevel == 1{ let enemyGhost = SKSpriteNode(imageNamed: "enemy") enemyGhost.setScale(random(min: 1.5, max: 2.5))
func addEnemy() {
if currentLevel == 1{
let enemyGhost = SKSpriteNode(imageNamed: "enemy")
enemyGhost.setScale(random(min: 1.5, max: 2.5))
enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
enemyGhost.physicsBody?.isDynamic = true
enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost
enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None
let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
addChild(enemyGhost)
let actualDuration = random(min: CGFloat(5.0), max: CGFloat(7.0))
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
else if currentLevel == 2 {
let enemyGhost = SKSpriteNode(imageNamed: "enemy")
enemyGhost.setScale(random(min: 1.0, max: 1.5))
enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
enemyGhost.physicsBody?.isDynamic = true
enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost
enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None
let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
addChild(enemyGhost)
let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
}else if currentLevel == 3 {
let enemyGhost = SKSpriteNode(imageNamed: "enemy")
enemyGhost.setScale(random(min: 0.5, max: 1.0))
enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
enemyGhost.physicsBody?.isDynamic = true
enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost
enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None
let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
addChild(enemyGhost)
let actualDuration = random(min: CGFloat(2.0), max: CGFloat(3.0))
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
首先,我要为敌人创建一个单独的类,这样就不会重复太多初始化代码。然后,您可以为EnemyType创建一个枚举,根据敌人的类型或级别为敌人保存可变信息。然后,你只需根据敌人的类型创建敌人,敌人对象将不会获得所有必要的信息 值得注意的是,您的物理类别名称有不同的大小写“enemyGhost”和“Sproject”。它们应该是相同的情况
struct EnemyScale {
var minScale: CGFloat = 0
var maxScale: CGFloat = 0
}
enum EnemyType: Int {
case level1, level2, level3
var textureImage: String {
switch self {
case .level1: return "enemy"
case .level2: return "enemy"
case .level3: return "enemy"
}
}
var scale: EnemyScale {
switch self {
case .level1: return EnemyScale(minScale: 1.5, maxScale: 2.5)
case .level2: return EnemyScale(minScale: 1.0, maxScale: 1.5)
case .level3: return EnemyScale(minScale: 0.5, maxScale: 1.0)
}
}
}
class Enemy: SKSpriteNode {
init(type: EnemyType) {
let enemyTexture = SKTexture(imageNamed: type.textureImage)
super.init(texture: enemyTexture, color: .clear, size: enemyTexture.size())
self.setScale(random(min: type.scaleMin, max: type.scaleMax))
self.physicsBody = SKPhysicsBody(rectangleOf: self.size)
self.physicsBody?.isDynamic = true
self.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost
self.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
self.physicsBody?.collisionBitMask = PhysicsCategory.None
}
}
func addEnemy() {
if currentLevel == 1 {
let enemyGhost = Enemy(type: .level1)
let actualY = random(min: enemyGhost.size.height / 2, max: size.height - enemyGhost.size.height / 2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width / 2, y: actualY)
self.addChild(enemyGhost)
let actualDuration = random(min: CGFloat(5.0), max: CGFloat(7.0))
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width / 2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
else if currentLevel == 2 {
let enemyGhost = Enemy(type: .level2)
let actualY = random(min: enemyGhost.size.height / 2, max: size.height - enemyGhost.size.height / 2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width / 2, y: actualY)
self.addChild(enemyGhost)
let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width / 2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
else if currentLevel == 3 {
let enemyGhost = Enemy(type: .level3)
let actualY = random(min: enemyGhost.size.height / 2, max: size.height - enemyGhost.size.height / 2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width / 2, y: actualY)
self.addChild(enemyGhost)
let actualDuration = random(min: CGFloat(2.0), max: CGFloat(3.0))
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width / 2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
}
您的功能可以简化,因为它充满了冗余代码,如:
func addEnemy() {
let enemyGhost = SKSpriteNode(imageNamed: "enemy")
enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
enemyGhost.physicsBody?.isDynamic = true
enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost.rawValue
enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile.rawValue
enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None.rawValue
let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
addChild(enemyGhost)
var actualDuration = random(min: CGFloat(5.0), max: CGFloat(7.0))
switch currentLevel {
case 1:
enemyGhost.setScale(random(min: 1.5, max: 2.5))
case 2:
enemyGhost.setScale(random(min: 1.0, max: 1.5))
actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
case 3:
enemyGhost.setScale(random(min: 0.5, max: 1.0))
actualDuration = random(min: CGFloat(2.0), max: CGFloat(3.0))
default:
break
}
let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
let actionMoveDone = SKAction.removeFromParent()
let loseAction = SKAction.run() {
let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
let gameOverScene = GameOverScene(size: self.size, won: false)
self.view?.presentScene(gameOverScene, transition: reveal)
}
enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
关于您的敌人状态,请记住您可以使用userData
()存储和检索特定属性,例如:
enemyGhost.userData? = NSMutableDictionary()
enemyGhost.userData = ["status":"aggressive"]
print(enemyGhost.userData?["status"] ?? "none")