Last active
March 20, 2019 22:22
-
-
Save ramiresnas/93ea3086243491978ed5f5e6de916a68 to your computer and use it in GitHub Desktop.
SpriteSheet é uma classe que ajuda a trabalhar com sprites sheets de forma simplificada usando Swift.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// SpriteSheet.swift | |
// MyGame | |
// | |
// Created by Ramires Moreira on 14/03/19. | |
// Copyright © 2019 Ramires Moreira. All rights reserved. | |
// | |
import SpriteKit | |
struct Position : Equatable { | |
/// a linha correspondente em um SpriteSheet | |
let row: Int | |
/// a coluna correspondente em um SpriteSheet | |
let column: Int | |
} | |
/// SpriteSheet é uma classe que facilita o trablaho com sprites sheet, que é uma | |
/// imagem que contem um conjunto de outras imagens. | |
class SpriteSheet { | |
/// contem uma referência para a imagem que contém o sprite sheet completo | |
let sheet : SKTexture | |
/// quantidade de linhas no sprite sheet | |
let rows : Int | |
/// quantidade de colunas no sprite sheet | |
let columns : Int | |
/// handler que determina quando um sprite deve ser excluído | |
var excludeRectWhen: ((Position) -> Bool)? | |
/// a largura ocupada por cada sprite individualmente | |
private lazy var width : CGFloat = { | |
return 1.0/CGFloat(columns) | |
}() | |
/// a altura ocupada por cada sprite individualmente | |
private lazy var height : CGFloat = { | |
return 1.0/CGFloat(rows) | |
}() | |
/// Cria um SpriteSheet | |
/// | |
/// - Parameters: | |
/// - imageNamed: nome da imagem que está no xcassets | |
/// - rows: numero de linhas na imagem | |
/// - columns: numero de colunas na imagem | |
/// - excludeRectWhen: condição para excluir uma determinada posição do sprite | |
init(imageNamed : String, rows : Int, columns: Int, excludeRectWhen: ((Position) -> Bool)? = nil ) { | |
sheet = SKTexture(imageNamed: imageNamed) | |
self.rows = rows | |
self.columns = columns | |
self.excludeRectWhen = excludeRectWhen | |
} | |
/// Retorna um SKtexture | |
/// | |
/// - Parameters: | |
/// - row: um numero inteiro que representa a coluna do sprite desejado | |
/// - column: um numero inteiro que representa a coluna do sprite desejado | |
/// - Returns: SKTexture com a imagem correspondente da linha e coluna do sprite | |
func textureFor(row: Int, column: Int) -> SKTexture { | |
let xPosition = CGFloat(column) * width | |
let yPosition = CGFloat(rows - 1 - row) * height //para fazer iniciar por cima | |
let rect = CGRect(x: xPosition, y: yPosition, width: width , height: height) | |
return SKTexture(rect: rect, in: sheet) | |
} | |
/// Todos os sprites que estão na imagem com exceção aos que foram | |
/// excluidos pela função | |
/// ```excludeRectWhen: ((Position) -> Bool)?``` | |
/// | |
/// - Returns: um array com todos os sprites da imagem | |
func allTxtures() -> [SKTexture] { | |
var textures = [SKTexture]() | |
for row in 0...(rows - 1) { | |
for col in 0...(columns - 1) { | |
if excludeRectWhen?(Position(row: row, column: col) ) ?? false { | |
continue | |
} | |
textures.append(textureFor(row: row, column:col )) | |
} | |
} | |
return textures | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Introdução
No desenvolvimento de jogos é comum o uso de sprites para criação de personagens e suas animações, como por exemplo a imagem abaixo
Essa classe foi criada pra simplificar o uso desse tipo de imagem no seu projeto
Exemplo de uso
existe também a possibilidade de você excluir alguma linha ou coluna. Para isso basta que você use
excludeRectWhen: ((Position) -> Bool)?
, no construtor ou configurando após a criação do objeto. Isso é um recurso importante pois seu Sprite sheet pode conter mais de um tipo de animação, e você pode querer filtrar. Na imagem acima nos temos espaços em branco, um exemplo de como excluir esses espaços é:Passando o exclude no construtor
Configurando o exclude após a construção