如何使用Swift 3更新SpriteKit游戏中的解锁字符?
我目前已经制作了一款拥有一名玩家的游戏。我还做了一个角色屏幕,用户可以选择他/她想玩哪个角色。我该如何做到这一点,以便某个高分可以解锁某个角色,并且允许用户使用该角色在游戏中使用?如何使用Swift 3更新SpriteKit游戏中的解锁字符?
现在我的球员有自己的快捷文件定义了他所有的属性:
import SpriteKit
class Player: SKSpriteNode, GameSprite {
var initialSize = CGSize(width:150, height: 90)
var textureAtlas: SKTextureAtlas = SKTextureAtlas(named: "Rupert")
let maxFlyingForce: CGFloat = 80000
let maxHeight: CGFloat = 900
var health:Int = 1
var invulnerable = false
var damaged = false
var damageAnimation = SKAction()
var dieAnimation = SKAction()
var forwardVelocity: CGFloat = 190
var powerAnimation = SKAction()
init() {
super.init(texture:nil, color: .clear, size: initialSize)
createAnimations()
self.run(soarAnimation, withKey: "soarAnimation")
let bodyTexture = textureAtlas.textureNamed("pug3")
self.physicsBody = SKPhysicsBody(texture: bodyTexture, size: self.size)
self.physicsBody?.linearDamping = 0.9
self.physicsBody?.mass = 10
self.physicsBody?.allowsRotation = false
self.physicsBody?.categoryBitMask = PhysicsCategory.rupert.rawValue
self.physicsBody?.contactTestBitMask = PhysicsCategory.enemy.rawValue | PhysicsCategory.treat.rawValue | PhysicsCategory.winky.rawValue | PhysicsCategory.ground.rawValue
func createAnimations() {
let rotateUpAction = SKAction.rotate(toAngle: 0.75, duration: 0.475)
rotateUpAction.timingMode = .easeOut
let rotateDownAction = SKAction.rotate(toAngle: 0, duration: 0.475)
rotateDownAction.timingMode = .easeIn
let flyFrames: [SKTexture] = [
textureAtlas.textureNamed("pug1"),
textureAtlas.textureNamed("pug2"),
textureAtlas.textureNamed("pug3"),
textureAtlas.textureNamed("pug4"),
textureAtlas.textureNamed("pug3"),
textureAtlas.textureNamed("pug2")
]
let flyAction = SKAction.animate(with:flyFrames, timePerFrame: 0.07)
flyAnimation = SKAction.group([SKAction.repeatForever(flyAction), rotateUpAction])
let soarFrames:[SKTexture] = [textureAtlas.textureNamed("pug5")]
let soarAction = SKAction.animate(with: soarFrames, timePerFrame: 1)
soarAnimation = SKAction.group([SKAction.repeatForever(soarAction), rotateDownAction])
这还不是全部的代码,但你明白了吧。
然后,我在我的Gamescene文件中说:let player = Player()
,它基本上将播放器文件中的所有属性附加到我的播放器中,这将在Gamescene中看到。即使我能够用某个不同的玩家取代最初的玩家,也有很多动画,我不知道如何一次替换所有东西。我想设置一个跨越gamescene类和玩家类的条件,以便它可以将某些图像分解为其他图像并保持相同的动作。
谢谢你的帮助!
这里有一些技巧,你可以使用使这样的事情更易于管理:
对你的性格的图像和/或精灵表的命名约定,这样就可以在名称传递给您的Player()构造函数。然后,不是加载texturenamed(“pug3”),而是加载texturenamed(“\(playerName)3”)。如果你的角色之间的唯一区别是精灵表,这实际上是你在玩家端所需要的全部。
如果你的角色比较复杂,除了图像之外的差异,比如更大或者更健康,那么你可能会希望采用更加面向数据的方法。对此有几种方法,但方便的方法是从.plist文件中读取您的纹理名称,hitbox大小,健康级别等,而不是对它们进行硬编码。然后,只需传入.plist文件的名称即可加载所需字符。然后,要创建一个新角色,只需创建一个新的.plist文件。另一种方法是创建一个“字符定义”结构,您可以将其传递给包含构建播放器所需信息的播放器构造函数(这反过来也可以从.plist文件加载,但是您也可以对它们进行硬编码或使用可编码序列化直接保存它们)。
如果上述两种方法都不足够,比如说你需要不同的字符间行为,你总是可以进入子类路径 - 将各个部分和部分拉入函数中,然后覆盖这些函数以添加特定您需要更多复杂字符的功能。