/// <summary> /// Empty Constructor For New Worlds /// </summary> /// <param name="name">World Name</param> /// <param name="EditorWidth">Editor Width</param> /// <param name="EditorHeight">Editor Height</param> public EditorWorld(string name, int EditorWidth, int EditorHeight) { WorldName = name; _Layers = LayerInfo.CreateDefault(); EditorScreen _TmpScreen = new EditorScreen(0, 0, this, true); Screens.Add(GetKey(0, 0, Enumerations.RelativePosition.Main), _TmpScreen); EditorScreenWidth = EditorWidth; EditorScreenHeight = EditorHeight; OffsetX = (EditorScreenWidth - 800) / 2; OffsetY = (EditorScreenHeight - 600) / 2; _BackBufferImage = new Bitmap(EditorScreenWidth, EditorScreenHeight); _WorkingLayerImage = new Bitmap(800, 600); // _G = The Whole Map Drawn Including the Sides _G = System.Drawing.Graphics.FromImage(_BackBufferImage); // _WorkingLayerGraphics = Current Layer Being Edited (Also used for Saving Screen Layer Info) _WorkingLayerGraphics = System.Drawing.Graphics.FromImage(_WorkingLayerImage); // _MiniMapBufferGraphics = Minimap Image Used For Displaying the Minimap _MiniMapBufferGraphics = System.Drawing.Graphics.FromImage(_MiniMapBufferImage); // _SingleScreenGraphicsObject = Single Screen (Main) Drawn. Used For Updating Only The Editing Part _SingleScreenGraphicsObject = System.Drawing.Graphics.FromImage(_SingleScreenImage); }
/// <summary> /// Draw A Single Screen That Which Is 800,600 /// </summary> /// <param name="X">Position X In The World</param> /// <param name="Y">Position Y In The World</param> /// <returns></returns> public Image DrawLocation_SingleScreen(int X, int Y, bool DrawObjects) { _SingleScreenGraphicsObject.Clear(Color.FromArgb(0, 255, 0)); #region Draw Each Of The Layers foreach (var Layer in _Layers) { if (Layer.Value.Visible) { if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.Main))) { _SingleScreenGraphicsObject.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.Main)].GetLayerImage(Layer.Key.ToLower()), new Point(0, 0)); } } } #endregion if (DrawObjects) { #region Draw Objects On Screen var AllObjs = from QMapObject in Screens.Values.SelectMany(x => x.MapObjects) where QMapObject.Screen.InRange(X, Y, OffsetX, OffsetY) orderby QMapObject.DrawLocation.Y select new { QMapObject, QMapObject.Screen.X, QMapObject.Screen.Y }; foreach (var MapO in AllObjs) { Enumerations.RelativePosition _RPos = EditorScreen.GetRelativePos(X, Y, MapO.X, MapO.Y); if (_RPos == Enumerations.RelativePosition.Main) { Point _DrawPoint = new Point(MapO.QMapObject.DrawLocation.X, MapO.QMapObject.DrawLocation.Y); _SingleScreenGraphicsObject.DrawImage(ResourceManager.GetMapObjectImageStart(MapO.QMapObject.ID.ToString()), _DrawPoint); } } #endregion #region Draw The Selected Object if (SelectedMapObject != Guid.Empty) { var SelectedObjs = from QMapObject in Screens.Values.SelectMany(x => x.MapObjects) where QMapObject.ID == SelectedMapObject select QMapObject; var FirstObject = SelectedObjs.ToList()[0]; _SingleScreenGraphicsObject.DrawRectangle(Pens.White, new Rectangle(new Point(FirstObject.DrawLocation.X + OffsetX, FirstObject.DrawLocation.Y + OffsetY), FirstObject.ImageSize)); } #endregion } // Draw The Bounding Box for Refrence _SingleScreenGraphicsObject.DrawRectangle(Pens.Black, new Rectangle(-1, -1, 800, 600)); return(_SingleScreenImage); }
public void AddMapObject(int X, int Y, MapObject MapO) { string _Key = GetKey(X, Y, Enumerations.RelativePosition.Main); if (!Screens.ContainsKey(_Key)) { EditorScreen _New = new EditorScreen(X, Y, this, true); Screens.Add(_Key, _New); } MapO.Screen = Screens[_Key]; Screens[_Key].MapObjects.Add(MapO); Screens[_Key].MapObjects = Screens[_Key].MapObjects.OrderBy(x => x.DrawLocation.Y).ToList(); }
/// <summary> /// Sets the Working Layer /// </summary> /// <param name="LayerName"></param> /// <param name="X">Map X Location</param> /// <param name="Y">Map Y Location</param> public void SetWorkingLayer(string LayerName, int X, int Y) { string _Key = GetKey(X, Y, Enumerations.RelativePosition.Main); if (!Screens.ContainsKey(_Key)) { EditorScreen _New = new EditorScreen(X, Y, this, true); Screens.Add(_Key, _New); } _WorkingLayerImage = Screens[_Key].GetLayerImage(LayerName); if (_WorkingLayerGraphics != null) { _WorkingLayerGraphics.Dispose(); } _WorkingLayerGraphics = System.Drawing.Graphics.FromImage(_WorkingLayerImage); _CurrentLayer = LayerName; }
/// <summary> /// Draws the specified Location. This Should Never Be Called Consecutavly. The Editor Only calls It /// One Time The After It Updates The Editor Screens With Any changes. Also On A resize or A Paint /// </summary> /// <param name="X"></param> /// <param name="Y"></param> /// <returns></returns> public Image DrawLocation(int X, int Y) { _G.Clear(Color.FromArgb(255, 255, 255)); #region Draw Each Of The Layers foreach (var Layer in _Layers) { if (Layer.Value.Visible) { if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.Main))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.Main)].GetLayerImage(Layer.Key.ToLower()), new Point(OffsetX, OffsetY)); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.Left))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.Left)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(0, OffsetY, OffsetX, 600), new Rectangle(800 - OffsetX, 0, OffsetX, 600), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.Right))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.Right)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(800 + OffsetX, OffsetY, OffsetX, 600), new Rectangle(0, 0, OffsetX, 600), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.Bottom))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.Bottom)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(OffsetX, 600 + OffsetY, 800, OffsetY), new Rectangle(0, 0, 800, OffsetY), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.Top))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.Top)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(OffsetX, 0, 800, OffsetY), new Rectangle(0, 600 - OffsetY, 800, OffsetY), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.TopLeft))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.TopLeft)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(0, 0, OffsetX, OffsetY), new Rectangle(800 - OffsetX, 600 - OffsetY, OffsetX, OffsetY), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.TopRight))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.TopRight)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(800 + OffsetX, 0, OffsetX, OffsetY), new Rectangle(0, 600 - OffsetY, OffsetX, OffsetY), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.BottomRight))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.BottomRight)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(800 + OffsetX, 600 + OffsetY, OffsetX, OffsetY), new Rectangle(0, 0, OffsetX, OffsetY), GraphicsUnit.Pixel); } if (Screens.ContainsKey(GetKey(X, Y, Enumerations.RelativePosition.BottomLeft))) { _G.DrawImage(Screens[GetKey(X, Y, Enumerations.RelativePosition.BottomLeft)].GetLayerImage(Layer.Key.ToLower()), new Rectangle(0, 600 + OffsetY, OffsetX, OffsetY), new Rectangle(800 - OffsetX, 0, OffsetX, OffsetY), GraphicsUnit.Pixel); } } } #endregion #region Draw The Objects var AllObjs = from QMapObject in Screens.Values.SelectMany(x => x.MapObjects) where QMapObject.Screen.InRange(X, Y, OffsetX, OffsetY) orderby QMapObject.DrawLocation.Y select new { QMapObject, QMapObject.Screen.X, QMapObject.Screen.Y }; foreach (var MapO in AllObjs) { Enumerations.RelativePosition _RPos = EditorScreen.GetRelativePos(X, Y, MapO.X, MapO.Y); if (_RPos == Enumerations.RelativePosition.Main) { Point _DrawPoint = new Point(MapO.QMapObject.DrawLocation.X + OffsetX, MapO.QMapObject.DrawLocation.Y + OffsetY); _G.DrawImage(ResourceManager.GetMapObjectImageStart(MapO.QMapObject.ID.ToString()), _DrawPoint); } else if (_RPos == Enumerations.RelativePosition.Right) { Point _DrawPoint = new Point(MapO.QMapObject.DrawLocation.X + 800 + OffsetX, MapO.QMapObject.DrawLocation.Y + OffsetY); _G.DrawImage(ResourceManager.GetMapObjectImageStart(MapO.QMapObject.ID.ToString()), _DrawPoint); } else if (_RPos == Enumerations.RelativePosition.Left) { Point _DrawPoint = new Point(MapO.QMapObject.DrawLocation.X - 800, MapO.QMapObject.DrawLocation.Y + OffsetY); _G.DrawImage(ResourceManager.GetMapObjectImageStart(MapO.QMapObject.ID.ToString()), _DrawPoint); } else if (_RPos == Enumerations.RelativePosition.Top) { Point _DrawPoint = new Point(MapO.QMapObject.DrawLocation.X + OffsetX, MapO.QMapObject.DrawLocation.Y - 600); _G.DrawImage(ResourceManager.GetMapObjectImageStart(MapO.QMapObject.ID.ToString()), _DrawPoint); } else if (_RPos == Enumerations.RelativePosition.Bottom) { Point _DrawPoint = new Point(MapO.QMapObject.DrawLocation.X + OffsetX, MapO.QMapObject.DrawLocation.Y + 600); _G.DrawImage(ResourceManager.GetMapObjectImageStart(MapO.QMapObject.ID.ToString()), _DrawPoint); } } #endregion #region Draw The Selected Object if (SelectedMapObject != Guid.Empty) { var SelectedObjs = from QMapObject in Screens.Values.SelectMany(x => x.MapObjects) where QMapObject.ID == SelectedMapObject select QMapObject; var FirstObject = SelectedObjs.ToList()[0]; _G.DrawRectangle(Pens.White, new Rectangle(new Point(FirstObject.DrawLocation.X + OffsetX, FirstObject.DrawLocation.Y + OffsetY), FirstObject.ImageSize)); } #endregion // Draw The Bounding Box for Refrence _G.DrawRectangle(Pens.Black, new Rectangle(OffsetX - 1, OffsetY - 1, 800, 600)); return(_BackBufferImage); }
public EditorWorld(string FileName, int EditorWidth, int EditorHeight, Point FocusPoint) { if (System.IO.File.Exists(FileName) == false) { throw new Exception("World File Not Found"); } _ApplicationDirectory = AppDomain.CurrentDomain.BaseDirectory.EnsureDirectoryFormat(); _BaseDirectory = FileName.Substring(0, FileName.LastIndexOf("\\") + 1).EnsureDirectoryFormat(); _LayersDirectory = _BaseDirectory + "layers\\"; _ObjectDirectory = _BaseDirectory + "objects\\"; // LOAD FILE NEW FORMAT dynamic Settings = ACT.Core.Dynamic.Encoder.LoadFromFile(FileName); NonPassableColor = System.Drawing.ColorTranslator.FromHtml(Settings.nonpassablecolor); #region Load The Layers foreach (string name in Settings.layers.GetMemberNames) { if (name == "name") { continue; } dynamic _TmpLayerData = Settings.layers.GetObject(name); LayerInfo _NewLayer = new LayerInfo(); _NewLayer.Name = _TmpLayerData.Name; _NewLayer.Visible = Convert.ToBoolean(_TmpLayerData.visible); _NewLayer.LayerType = Enum.Parse(typeof(Enumerations.LayerType), _TmpLayerData.type); _Layers.Add(_NewLayer.Name, _NewLayer); } #endregion #region Load The Screens foreach (string name in Settings.screens.GetMemberNames) { if (name == "name") { continue; } dynamic _TmpScreenData = Settings.screens.GetObject(name); string[] PositionData = name.SplitString("-", StringSplitOptions.RemoveEmptyEntries); if (PositionData.Length != 2) { ErrorLogable.LogError(null, "Invalid PositionData-Name", ACT.Core.Enums.ErrorLevel.Severe); continue; } EditorScreen _NewScreen = new EditorScreen(Convert.ToInt32(PositionData[0]), Convert.ToInt32(PositionData[1]), this); #region Load the Objects foreach (string objname in _TmpScreenData.objects.GetMemberNames) { if (objname == "name") { continue; } dynamic MapObjectInfo = _TmpScreenData.objects.GetObject(objname); try { MapObject _NewMapObject = new MapObject(); _NewMapObject.ID = new Guid(objname.Trim()); string _MapImageLocation = _ObjectDirectory + _NewMapObject.ID + ".png"; if (!System.IO.File.Exists(_MapImageLocation)) { ErrorLogable.LogError(null, "Error Locating Object: " + _NewMapObject.ID.ToString(), ACT.Core.Enums.ErrorLevel.Critical); continue; } string _Location = MapObjectInfo.location; string _Size = MapObjectInfo.size; string[] _Points = _Location.SplitString(",", StringSplitOptions.RemoveEmptyEntries); string[] _Sizes = _Location.SplitString(",", StringSplitOptions.RemoveEmptyEntries); _NewMapObject.DrawLocation = new Point(Convert.ToInt32(_Points[0]), Convert.ToInt32(_Points[1])); _NewMapObject.ImageSize = new Size(Convert.ToInt32(_Sizes[0]), Convert.ToInt32(_Sizes[1])); _NewMapObject.Position = Enum.Parse(typeof(NebulaGames.RPGWorld.Enumerations.RelativePosition), MapObjectInfo.relativeposition); _NewMapObject.ResourceName = ""; _NewMapObject.Screen = _NewScreen; _NewScreen.MapObjects.Add(_NewMapObject); Graphics.CompressibleImage _TmpMapObject = new CompressibleImage(Image.FromFile(_MapImageLocation), System.Drawing.Imaging.ImageFormat.Png); ResourceManager.AddObject(_NewMapObject.ID.ToString(), _TmpMapObject); } catch (Exception ex) { ErrorLogable.LogError(ex, "Error Loading Object: " + name, ACT.Core.Enums.ErrorLevel.Critical); } } #endregion #region Load the Layer Images foreach (string TmpLayerName in _Layers.Keys) { if (System.IO.File.Exists(_LayersDirectory + TmpLayerName + "\\" + name + ".png")) { _NewScreen.AddUpdateLayerImage(TmpLayerName.ToLower(), Image.FromFile(_LayersDirectory + TmpLayerName + "\\" + name + ".png")); } } #endregion Screens.Add(name, _NewScreen); } #endregion EditorScreenWidth = EditorWidth; EditorScreenHeight = EditorHeight; OffsetX = (EditorScreenWidth - 800) / 2; OffsetY = (EditorScreenHeight - 600) / 2; _BackBufferImage = new Bitmap(EditorScreenWidth, EditorScreenHeight); _G = System.Drawing.Graphics.FromImage(_BackBufferImage); _MiniMapBufferGraphics = System.Drawing.Graphics.FromImage(_MiniMapBufferImage); _SingleScreenGraphicsObject = System.Drawing.Graphics.FromImage(_SingleScreenImage); }