2017-08-18 2 views
1

J'ai actuellement créé un jeu avec un joueur. J'ai également créé un écran de personnage où l'utilisateur peut choisir le personnage avec lequel il veut jouer. Comment puis-je faire en sorte qu'un certain score élevé débloque un certain personnage, et permet à l'utilisateur d'équiper ce personnage pour l'utiliser dans le jeu?Comment mettre à jour des personnages déblocables dans le jeu SpriteKit avec Swift 3?

En ce moment, mon joueur a son propre fichier rapide qui définit toutes les propriétés de lui:

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]) 

Ce n'est pas tout le code, mais vous obtenez le point.

Puis je dis: let player = Player() dans mon fichier Gamescene qui attache essentiellement tous les attributs dans le fichier du lecteur à mon lecteur qui sera vu dans la console de jeux vidéo. Même si je suis capable de remplacer le premier joueur par un autre joueur différent, il y a tellement d'animations que je ne sais pas comment tout remplacer à la fois. Je veux définir une condition qui couvre à la fois la classe gamescene et la classe de joueur afin qu'elle puisse simplement sous-estimer certaines images pour d'autres et conserver les mêmes actions.

Nous vous remercions de votre aide!

Répondre

0

Voici quelques techniques que vous pouvez utiliser pour faire des choses comme ça plus facile à gérer:

  • Avoir une convention de nommage pour vos images de caractères et/ou des feuilles de sprite, de sorte que vous pouvez transmettre un nom à votre Player() constructeur. Ensuite, au lieu de charger texturenamed ("pug3"), vous chargez texturenamed ("\ (playerName) 3"). Si la seule différence entre vos personnages sont les feuilles de sprite, c'est en réalité tout ce dont vous avez besoin du côté joueur. Si vos personnages sont plus complexes, avec des différences au-delà des images, comme être plus grand ou avoir plus de santé, alors vous voudrez probablement adopter une approche plus orientée données. Il y a quelques approches à cela, mais il est pratique de lire vos noms de texture, tailles de hitbox, niveaux de santé, etc., à partir d'un fichier .plist au lieu de les coder en dur. Ensuite, il suffit de passer le nom du fichier .plist à charger pour le personnage que vous voulez. Ensuite, pour créer un nouveau personnage, créez simplement un nouveau fichier .plist. Une autre approche consisterait à créer une structure de "définition de caractère" que vous pourriez transmettre au constructeur Player contenant les informations dont vous avez besoin pour construire le lecteur (ceci, à son tour, pourrait également être chargé à partir d'un fichier .plist, mais vous pourrait également les coder en dur ou les enregistrer directement en utilisant la sérialisation codable). Si aucune des approches ci-dessus ne suffit, par exemple si vous avez besoin d'un comportement différent entre les caractères, vous pouvez toujours suivre la route de sous-classement - tirer les différentes parties en fonctions, puis remplacer ces fonctions pour ajouter le fonctionnalité dont vous avez besoin pour les caractères plus complexes.