如何使用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文件加载,但是您也可以对它们进行硬编码或使用可编码序列化直接保存它们)。

  • 如果上述两种方法都不足够,比如说你需要不同的字符间行为,你总是可以进入子类路径 - 将各个部分和部分拉入函数中,然后覆盖这些函数以添加特定您需要更多复杂字符的功能。