../

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
}