private List<Tileset> m_tilesets;
private TileSelect m_tileSelect;
private TiledMap m_tileMap;
public MapWriter(TileSelect tileSelect, TiledMap tileMap)
{
m_tileMap = tileMap;
m_tileSelect = tileSelect;
m_tilesets = new List<Tileset>();
}
public void Save(string Path)
{
//Recupera l'each dai blocchi
MemoryStream s_tilesets = WriteTilesets(m_tileSelect.Tilesets);
MemoryStream s_tiles = WriteTiles();
FileStream FS = new FileStream(Path, FileMode.Create);
//scrittura data
byte[] name = System.Text.ASCIIEncoding.ASCII.GetBytes("MapEditorFile");
FS.Write(name, 0, name.Length);
string[] s_version = Application.ProductVersion.Split('.');
float f_version = 0;
float.TryParse(s_version[0]+"."+s_version[1], out f_version);
byte[] version = System.BitConverter.GetBytes(f_version);
FS.Write(version, 0, 4);
byte[] size = System.BitConverter.GetBytes(s_tilesets.Length);
FS.Write(size, 0, 8);
s_tilesets.WriteTo(FS);
size = System.BitConverter.GetBytes(s_tiles.Length);
FS.Write(size, 0, 8);
s_tiles.WriteTo(FS);
FS.Close();
}
private MemoryStream WriteTiles()
{
MemoryStream s_tiles = new MemoryStream();
Tile[,] allTiles = m_tileMap.Tiles;
MemoryStream tempStream = new MemoryStream();
int width = allTiles.GetLength(0);
int height = allTiles.GetLength(1);
//Scrive la larghezza e la lunghezza
byte[] size = System.BitConverter.GetBytes(width);
tempStream.Write(size, 0, 4);
size = System.BitConverter.GetBytes(height);
tempStream.Write(size, 0, 4);
//Scrive il data per tile
for(int x=0; x<width; x++) {
for(int y=0; y<height; y++) {
//Posizione X
size = System.BitConverter.GetBytes(allTiles[x,y].X);
tempStream.Write(size, 0, 4);
//Posizione Y size = System.BitConverter.GetBytes(allTiles[x,y].Y);
tempStream.Write(size, 0, 4);
//Solido
size = System.BitConverter.GetBytes(allTiles[x,y].IsSolid);
tempStream.Write(size, 0, 1);
int index = -1;
for(int i=0;i<m_tilesets.Count; i++) {
if(allTiles[x,y].Init && m_tilesets[i] == allTiles[x,y].Tileset) {
index = i;
break;
}
}
//Numero Tileset
size = System.BitConverter.GetBytes(index);
tempStream.Write(size, 0, 4);
}
}
tempStream.WriteTo(s_tiles);
return s_tiles;
}
private MemoryStream WriteTilesets(List<Tileset> tileset)
{
MemoryStream s_tilesets = new MemoryStream();
MemoryStream tempStream = new MemoryStream();
foreach(Tileset tSet in tileset)
{
m_tilesets.Add(tSet);
MemoryStream image = new MemoryStream();
//Dimensione tile
byte[] size = System.BitConverter.GetBytes(tSet.TileSize);
tempStream.Write(size, 0, 4);
//nome
byte[] name = System.Text.ASCIIEncoding.ASCII.GetBytes(tSet.ToString());
size = System.BitConverter.GetBytes(name.Length);
tempStream.Write(size, 0, 4);
tempStream.Write(name, 0, name.Length);
//Immagine
tSet.Image.Save(image, System.Drawing.Imaging.ImageFormat.Bmp);
size = System.BitConverter.GetBytes(image.Length);
tempStream.Write(size, 0, 8);
image.Position = 0;
image.WriteTo(tempStream);
}
tempStream.WriteTo(s_tilesets);
return s_tilesets;
}
}