public MainWindow() { InitializeComponent(); // noch keine map geladen / erstellt currentMap = null; StatusLabel.Content = "Programm gestartet"; }
public bool SaveToFile(Map _toSave, string _saveFile) { try { // gibt es den ordner nicht? => nicht speichern // if (!Directory.Exists(_saveDir)) { return false; } using(Stream outStream = File.Open( _saveFile, FileMode.Create, FileAccess.Write)) { using(BinaryWriter writer = new BinaryWriter(outStream, Encoding.Unicode)) { WriteHeader(_toSave, writer); WriteImages(_toSave, writer); } } // speichern hat funktionert return true; } // sollte ein fehler auftreten catch (Exception) { // datei loeschen if (File.Exists(_saveFile)) { File.Delete(_saveFile); } // signalisieren dass das speichern nicht funktionert hat return false; } }
public Map LoadFromFile(string _saveFile) { try { using(Stream inStream = File.Open(_saveFile, FileMode.Open, FileAccess.Read)) { using(BinaryReader reader = new BinaryReader(inStream, Encoding.Unicode)) { int version = reader.ReadInt32(); if(version != SerVersion) { version = -1; // altes dateiformat inStream.Seek(0, SeekOrigin.Begin); } string name = reader.ReadString(); int height = reader.ReadInt32(); int width = reader.ReadInt32(); int tileHeight = 50; int tileWidth = 50; if(version != -1) { tileHeight = reader.ReadInt32(); tileWidth = reader.ReadInt32(); } Map map = new Map(name, width, height, tileWidth, tileHeight); // zeile fuer zeile for (int y = 0; y < map.Height; ++y) { for (int x = 0; x < map.Width; ++x) { // die tile ID mit dem reader auslesen map.Tiles[x, y] = reader.ReadInt32(); } } // solange noch daten im stream sind while(inStream.Position < inStream.Length) { // laenge und daten des bildes laden int length = reader.ReadInt32(); byte[] data = reader.ReadBytes(length); using(MemoryStream memory = new MemoryStream(data)) { // bild dekodieren BitmapDecoder decoder = BitmapDecoder.Create( memory, BitmapCreateOptions.None, BitmapCacheOption.OnLoad ); // bild aus dem decoder der map hinzufuegen map.images.Add(decoder.Frames.First()); } } return map; } } } catch (Exception) { return null; } }
private void WriteImages(Map _toSave, BinaryWriter _writer) { // ueber alle bilder iterieren foreach (var image in _toSave.images) { using(MemoryStream memory = new MemoryStream()) { // erstellt einen encoder im format des (urspruenglichen) bildes BitmapEncoder encoder = BitmapEncoder.Create(image.Decoder.CodecInfo.ContainerFormat); // das bild dem encoder hinzufuegen encoder.Frames.Add(image); // das bild kodieren und in den stream schreiben encoder.Save(memory); // bild aus dem memorystream holen byte[] imageAsBytes = memory.ToArray(); // groesse des bildes schreiben _writer.Write(imageAsBytes.Length); // bild selbst schreiben _writer.Write(imageAsBytes); } } }
private void WriteHeader(Map _toSave, BinaryWriter _writer) { _writer.Write(SerVersion); _writer.Write(_toSave.Name); // Hoehe und breite schreiben _writer.Write(_toSave.Height); _writer.Write(_toSave.Width); _writer.Write(_toSave.TileHeight); _writer.Write(_toSave.TileWidth); // zeile fuer zeile for(int y = 0; y < _toSave.Height; ++y) { for(int x = 0; x < _toSave.Width; ++x) { // alle tiles mit dem writer schreiben _writer.Write(_toSave.Tiles[x, y]); } } }
public Map LoadFromFile(string _saveFile) { try { using (Stream inStream = File.Open(_saveFile, FileMode.Open, FileAccess.Read)) { using (BinaryReader reader = new BinaryReader(inStream, Encoding.Unicode)) { int version = reader.ReadInt32(); if (version != SerVersion) { version = -1; // altes dateiformat inStream.Seek(0, SeekOrigin.Begin); } string name = reader.ReadString(); int height = reader.ReadInt32(); int width = reader.ReadInt32(); int tileHeight = 50; int tileWidth = 50; if (version != -1) { tileHeight = reader.ReadInt32(); tileWidth = reader.ReadInt32(); } Map map = new Map(name, width, height, tileWidth, tileHeight); // zeile fuer zeile for (int y = 0; y < map.Height; ++y) { for (int x = 0; x < map.Width; ++x) { // die tile ID mit dem reader auslesen map.Tiles[x, y] = reader.ReadInt32(); } } // solange noch daten im stream sind while (inStream.Position < inStream.Length) { // laenge und daten des bildes laden int length = reader.ReadInt32(); byte[] data = reader.ReadBytes(length); Texture2D tex = new Texture2D(4, 4); if(!tex.LoadImage(data)) { Debug.LogError("Texture could not be loaded."); return null; } Sprite image = Sprite.Create( tex, new Rect(0.0f, 0.0f, 1.0f, 1.0f), new Vector2(0.5f, 0.5f) ); // bild aus dem decoder der map hinzufuegen map.images.Add(image); } return map; } } } catch (Exception) { return null; } }
private void SetMap(Map _map) { // haben wir bereits eine map if(currentMap != null) { // alle tiles entfernen MapGrid.Children.Clear(); // grid resetten MapGrid.RowDefinitions.Clear(); MapGrid.ColumnDefinitions.Clear(); // toolbox leeren ToolBoxStackPanel.Children.Clear(); } // aktuelle map setzen currentMap = _map; changed = false; DataContext = currentMap; // spalten füllen for(int i = 0; i < _map.Width; ++i) { // neue spalte erstellen ColumnDefinition def = new ColumnDefinition(); // groesse der spalte setzten def.Width = new GridLength(currentMap.TileWidth, GridUnitType.Pixel); // spalte dem grid hinzufuegen MapGrid.ColumnDefinitions.Add(def); } // zeilen füllen for (int i = 0; i < _map.Width; ++i) { // neue zeile erstellen RowDefinition def = new RowDefinition(); // groesse der zeile setzten def.Height = new GridLength(currentMap.TileHeight, GridUnitType.Pixel); // zeile dem grid hinzufuegen MapGrid.RowDefinitions.Add(def); } // MapGrid.ShowGridLines = true; // ueber alle bilder iterieren foreach (BitmapFrame image in currentMap.images) { // bild der toolbox hinzufuegen AddToolboxImage(image); } // tiles erstellen for(int s = 0; s < _map.Width; ++s) { for(int r = 0; r < _map.Height; ++r) { UIElement element = null; // pruefen ob map tile enthaelt if (currentMap.Tiles[s, r] != -1) { // erstellen neues image Image newImage = new Image(); // das bild soll komplett gefuellt werden newImage.Stretch = Stretch.Fill; // quelle setzen newImage.Source = currentMap.images[currentMap.Tiles[s, r]]; element = newImage; } else { // neues image erstellen Rectangle rect = new Rectangle(); // fuellfarbe aendern rect.Fill = Brushes.Magenta; element = rect; } // Drop event registrieren element.Drop += Tile_Drop; // das image dem grid an der stelle (s | r) hinzufuegen MapGrid.Children.Add(element); Grid.SetColumn(element, s); Grid.SetRow(element, r); } } }
private void NewMenuItem_Click(object sender, RoutedEventArgs e) { if (AbortUnsavedChanges()) { return; } CreateMapWindow createWindow = new CreateMapWindow(); createWindow.ShowDialog(); // pruefen ob gueltige eingaben gemacht wurden, wenn nicht => stopp if (!createWindow.InputValid) { return; } // neue map erstellen Map newMap = new Map( createWindow.MapName, createWindow.MapWidth, createWindow.MapHeight, createWindow.TileWidth, createWindow.TileHeight); SetMap(newMap); }