pt-br en
TileMap Automata
Nessa demo utilizamos o mesmo Automata da demo diffusion-automata-v1, mas usamos um mapa do Tiled para renderizar o quadro. Além disso usamos um esquema simples de camera para permitir zoom(mouse wheel) e pan(middle button) do mapa, assim como adicionar(left button) e remover(right button) rochas do mapa.
Nossa struct então vai ser bastante simples, precisamos apenas do AUtomata e do TileMap:
type TileBoard struct {
tMap *tiled.Map
b *boards.HumidityBoard
cursor [2]int
}
Durante o update apenas atualizamos o estado do automata e traduzimos esses estados para o TileMap. Se antes cada célula do nosso espaço correspondia a um pixel, aqui ele corresponde a um tile; uma cor corresponde a um tipo de tile e assim por diante.
func (tb *TileBoard) Update() error {
// Atualizamos o estado do Automato
err := tb.b.Update()
if err != nil {
return err
}
// Extraímos o novo estado
bState := tb.b.GetState()
width, height := tb.b.Size()
for x := 0; x < width; x++ {
for y := 0; y < height; y++ {
humidity, impermeability := bState[x][y].Elem()
// Aplicamos o valor da umidade na primeira camada
tb.tMap.Layers[0].Tiles[x+tb.tMap.Width*y] = &tiled.LayerTile{Tileset: tb.tMap.Tilesets[0], ID: uint32(humidity / 128)}
// Aplicamos o valor da impermeabilidade na segunda camada
tb.tMap.Layers[1].Tiles[x+tb.tMap.Width*y] = &tiled.LayerTile{Tileset: tb.tMap.Tilesets[1], ID: 838, Nil: impermeability < (math.MaxFloat32/5)*4}
// Atualizamos a posição do cursos na terceira camada
tb.tMap.Layers[2].Tiles[x+tb.tMap.Width*y] = &tiled.LayerTile{Tileset: tb.tMap.Tilesets[1], ID: 847, Nil: !(x == tb.cursor[0] && y == tb.cursor[1])}
}
}
return nil
}