Skip to content

Instantly share code, notes, and snippets.

@ramiresnas
Last active March 20, 2019 22:22
Show Gist options
  • Save ramiresnas/93ea3086243491978ed5f5e6de916a68 to your computer and use it in GitHub Desktop.
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.
//
// 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
}
}
@ramiresnas
Copy link
Author

ramiresnas commented Mar 14, 2019

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

sprite sheet

Essa classe foi criada pra simplificar o uso desse tipo de imagem no seu projeto

Exemplo de uso


let sheet = SpriteSheet(imageNamed: "my_sprite_sheet", rows: 3, columns: 6)

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

var postionsToExclude = [Position]()
postionsToExclude.append( Position(row: 0, column: 3 ) )
let sheet = SpriteSheet(imageNamed: "my_sprite_sheet", rows: 3, columns: 6) { position -> Bool in
    return postionsToExclude.contains(where: {$0 == position})
 }

Configurando o exclude após a construção

let sheet = SpriteSheet(imageNamed: "my_sprite_sheet", rows: 3, columns: 6)
sheet.excludeRectWhen = { position -> Bool in
    return postionsToExclude.contains(where: {$0 == position})
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment