/// <summary> /// Удалить активный объект с карты /// </summary> /// <param name="Id">Идентификатор объекта</param> public void RemoveActiveObject(Guid Id) { MapActiveObjectState ActiveObject = GetActiveObjectById(Id); DeAttachActiveObject(ActiveObject); ActiveObjects.Remove(Id); }
/// <summary> /// Добавить новый объект на карту /// </summary> /// <param name="ActiveObject">Активный объект</param> /// <param name="Position">Координаты левой верхней точки</param> /// <param name="Id">Идентификатор (для десериализации)</param> /// <returns>Идентификатор</returns> public Guid AddActiveObject(MapActiveObject ActiveObject, MapPoint Position) { if (ActiveObject == null) { throw new ArgumentNullException("ActiveObject", "ActiveObject cannot be null"); } if (Position.Level >= this.LevelsCount) { throw new ArgumentOutOfRangeException("Position.Level", "Level cannot be out of map"); } if ((Position.X + ActiveObject.Tile.Size.Width > this.Size.Width) || (Position.Y + ActiveObject.Tile.Size.Height > this.Size.Height)) { throw new ArgumentOutOfRangeException("Position", "Position cannot be out of map"); } if (!CheckPlaceForActiveObject(ActiveObject, Position)) { throw new ArgumentException("ActiveObject", "ActiveObject cannot be located to this Position"); } Guid Id = Guid.NewGuid(); MapActiveObjectState state = new MapActiveObjectState(ActiveObject, Position); state.Destroying += (sender, args) => { OnActiveObjectDestroying(args.ActiveObject); }; state.Destroyed += (sender, args) => { OnActiveObjectDestroyed(args.ActiveObject); }; this.ActiveObjects.Add(Id, state); AttachActiveObject(state, Position); return(Id); }
/// <summary> /// Вызов события разрушения активного объекта /// </summary> /// <param name="ActiveObject">Активный объект</param> protected void OnActiveObjectDestroying(MapActiveObjectState ActiveObject) { DeAttachActiveObject(ActiveObject); if (ActiveObjectDestroying != null) { ActiveObjectDestroying(this, new MapActiveObjectEventArgs(ActiveObject)); } }
/// <summary> /// "Отклеить" объект от карты /// </summary> /// <param name="ActiveObject">Активный объект</param> private void DeAttachActiveObject(MapActiveObjectState ActiveObject) { for (UInt16 x = ActiveObject.Position.X; x < ActiveObject.Position.X + ActiveObject.Size.Width; x++) { for (UInt16 y = ActiveObject.Position.Y; y < ActiveObject.Position.Y + ActiveObject.Size.Height; y++) { Levels[ActiveObject.Position.Level].Cells[x, y].RemoveActiveObject(ActiveObject); } } }
/// <summary> /// "Приклеить" объект к карте /// </summary> /// <param name="ActiveObject">Активный объект</param> /// <param name="Position">Координаты левой верхней точки</param> private void AttachActiveObject(MapActiveObjectState ActiveObject, MapPoint Position) { ActiveObject.Locate(Position); for (UInt16 x = ActiveObject.Position.X; x < ActiveObject.Position.X + ActiveObject.Size.Width; x++) { for (UInt16 y = ActiveObject.Position.Y; y < ActiveObject.Position.Y + ActiveObject.Size.Height; y++) { Levels[Position.Level].Cells[x, y].AddActiveObject(ActiveObject); } } }
/// <summary> /// Идентификатор размещения активного объекта /// </summary> /// <param name="ActiveObject">Активный объект</param> /// <returns>Идентифкатор размещения</returns> public Guid GetIdOfActiveObject(MapActiveObjectState ActiveObject) { if (ActiveObject == null) { throw new ArgumentNullException("ActiveObject", "ActiveObject cannot be null"); } if (!ActiveObjects.ContainsValue(ActiveObject)) { throw new ArgumentException("ActiveObject", "This ActiveObject not found"); } Guid id = ActiveObjects.Where(ao => ao.Value == ActiveObject).FirstOrDefault().Key; return(id); }
/// <summary> /// Вызов события разрушения активного объекта /// </summary> /// <param name="ActiveObject">Активный объект</param> protected void OnActiveObjectDestroyed(MapActiveObjectState ActiveObject) { if (ActiveObject.ActiveObject == null) { RemoveActiveObject(GetIdOfActiveObject(ActiveObject)); } else { if (!CheckPlaceForActiveObject(ActiveObject.ActiveObject, ActiveObject.Position)) { throw new OverflowException("New ActiveObject cannot be located to place of destroyed old ActiveObject"); } AttachActiveObject(ActiveObject, ActiveObject.Position); } if (ActiveObjectDestroyed != null) { ActiveObjectDestroyed(this, new MapActiveObjectEventArgs(ActiveObject)); } }
/// <summary> /// Удалить активный объект /// </summary> /// <param name="ActiveObject">Активный объект</param> public void RemoveActiveObject(MapActiveObjectState ActiveObject) { if (ActiveObject == null) { return; } if (ActiveObjects == null) { return; } if (!ActiveObjects.Contains(ActiveObject)) { return; } List <MapActiveObjectState> objects = new List <MapActiveObjectState>(ActiveObjects); objects.Remove(ActiveObject); ActiveObjects = objects.ToArray(); }
/// <summary> /// Переместить объект в другое место карты /// </summary> /// <param name="Id">Идентификатор объекта</param> /// <param name="Position">Координаты левой верхней точки</param> public void RelocateActiveObject(Guid Id, MapPoint Position) { MapActiveObjectState ActiveObject = GetActiveObjectById(Id); if (Position.Level >= this.LevelsCount) { throw new ArgumentOutOfRangeException("Position.Level", "Position.Level cannot be out of map"); } if ((Position.X + ActiveObject.Size.Width >= this.Size.Width) || (Position.Y + ActiveObject.Size.Height >= this.Size.Height)) { throw new ArgumentOutOfRangeException("Position", "Position cannot be out of map"); } if (!CheckPlaceForActiveObject(ActiveObject.ActiveObject, Position)) { throw new ArgumentException("ActiveObject", "ActiveObject cannot be located to this Position"); } DeAttachActiveObject(ActiveObject); AttachActiveObject(ActiveObject, Position); }
/// <summary> /// Добавить новый объект на карту /// </summary> /// <param name="ActiveObjectState">Активный объект</param> /// <param name="Position">Координаты левой верхней точки</param> /// <param name="Id">Идентификатор (для десериализации)</param> /// <returns>Получилось ли добавить</returns> public bool AddActiveObject(MapActiveObjectState ActiveObjectState, Guid Id) { if (ActiveObjectState == null) { throw new ArgumentNullException("ActiveObjectState", "ActiveObjectState cannot be null"); } if (ActiveObjects.ContainsKey(Id)) { return(false); } if (ActiveObjectState.Position.Level >= this.LevelsCount) { throw new ArgumentOutOfRangeException("Position.Level", "Level cannot be out of map"); } if ((ActiveObjectState.Position.X + ActiveObjectState.Tile.Size.Width >= this.Size.Width) || (ActiveObjectState.Position.Y + ActiveObjectState.Tile.Size.Height >= this.Size.Height)) { throw new ArgumentOutOfRangeException("Position", "Position cannot be out of map"); } if (!CheckPlaceForActiveObject(ActiveObjectState.ActiveObject, ActiveObjectState.Position)) { throw new ArgumentException("ActiveObject", "ActiveObject cannot be located to this Position"); } ActiveObjectState.Destroying += (sender, args) => { OnActiveObjectDestroying(args.ActiveObject); }; ActiveObjectState.Destroyed += (sender, args) => { OnActiveObjectDestroyed(args.ActiveObject); }; this.ActiveObjects.Add(Id, ActiveObjectState); AttachActiveObject(ActiveObjectState, ActiveObjectState.Position); return(true); }
/// <summary> /// Добавить активный объект /// </summary> /// <param name="ActiveObject">Активный объект</param> public void AddActiveObject(MapActiveObjectState ActiveObject) { if (ActiveObject == null) { return; } List <MapActiveObjectState> objects; if (ActiveObjects == null) { objects = new List <MapActiveObjectState>(); objects.Add(ActiveObject); } else { if (ActiveObjects.Contains(ActiveObject)) { return; } objects = new List <MapActiveObjectState>(ActiveObjects); objects.Add(ActiveObject); } ActiveObjects = objects.ToArray(); }
/// <summary> /// Вызов события разрушения активного объекта /// </summary> /// <param name="ActiveObject">Активный объект</param> protected void OnActiveObjectDestroying(MapActiveObjectState ActiveObject) { DeAttachActiveObject(ActiveObject); if (ActiveObjectDestroying != null) ActiveObjectDestroying(this, new MapActiveObjectEventArgs(ActiveObject)); }
/// <summary> /// Вызов события разрушения активного объекта /// </summary> /// <param name="ActiveObject">Активный объект</param> protected void OnActiveObjectDestroyed(MapActiveObjectState ActiveObject) { if (ActiveObject.ActiveObject == null) { RemoveActiveObject(GetIdOfActiveObject(ActiveObject)); } else { if (!CheckPlaceForActiveObject(ActiveObject.ActiveObject, ActiveObject.Position)) { throw new OverflowException("New ActiveObject cannot be located to place of destroyed old ActiveObject"); } AttachActiveObject(ActiveObject, ActiveObject.Position); } if (ActiveObjectDestroyed != null) ActiveObjectDestroyed(this, new MapActiveObjectEventArgs(ActiveObject)); }
/// <summary> /// Идентификатор размещения активного объекта /// </summary> /// <param name="ActiveObject">Активный объект</param> /// <returns>Идентифкатор размещения</returns> public Guid GetIdOfActiveObject(MapActiveObjectState ActiveObject) { if (ActiveObject == null) throw new ArgumentNullException("ActiveObject", "ActiveObject cannot be null"); if (!ActiveObjects.ContainsValue(ActiveObject)) throw new ArgumentException("ActiveObject", "This ActiveObject not found"); Guid id = ActiveObjects.Where(ao => ao.Value == ActiveObject).FirstOrDefault().Key; return id; }
/// <summary> /// Добавить новый объект на карту /// </summary> /// <param name="ActiveObjectState">Активный объект</param> /// <param name="Position">Координаты левой верхней точки</param> /// <param name="Id">Идентификатор (для десериализации)</param> /// <returns>Получилось ли добавить</returns> public bool AddActiveObject(MapActiveObjectState ActiveObjectState, Guid Id) { if (ActiveObjectState == null) throw new ArgumentNullException("ActiveObjectState", "ActiveObjectState cannot be null"); if (ActiveObjects.ContainsKey(Id)) return false; if (ActiveObjectState.Position.Level >= this.LevelsCount) throw new ArgumentOutOfRangeException("Position.Level", "Level cannot be out of map"); if ((ActiveObjectState.Position.X + ActiveObjectState.Tile.Size.Width >= this.Size.Width) || (ActiveObjectState.Position.Y + ActiveObjectState.Tile.Size.Height >= this.Size.Height)) throw new ArgumentOutOfRangeException("Position", "Position cannot be out of map"); if (!CheckPlaceForActiveObject(ActiveObjectState.ActiveObject, ActiveObjectState.Position)) throw new ArgumentException("ActiveObject", "ActiveObject cannot be located to this Position"); ActiveObjectState.Destroying += (sender, args) => { OnActiveObjectDestroying(args.ActiveObject); }; ActiveObjectState.Destroyed += (sender, args) => { OnActiveObjectDestroyed(args.ActiveObject); }; this.ActiveObjects.Add(Id, ActiveObjectState); AttachActiveObject(ActiveObjectState, ActiveObjectState.Position); return true; }
/// <summary> /// Добавить новый объект на карту /// </summary> /// <param name="ActiveObject">Активный объект</param> /// <param name="Position">Координаты левой верхней точки</param> /// <param name="Id">Идентификатор (для десериализации)</param> /// <returns>Идентификатор</returns> public Guid AddActiveObject(MapActiveObject ActiveObject, MapPoint Position) { if (ActiveObject == null) throw new ArgumentNullException("ActiveObject", "ActiveObject cannot be null"); if (Position.Level >= this.LevelsCount) throw new ArgumentOutOfRangeException("Position.Level", "Level cannot be out of map"); if ((Position.X + ActiveObject.Tile.Size.Width > this.Size.Width) || (Position.Y + ActiveObject.Tile.Size.Height > this.Size.Height)) throw new ArgumentOutOfRangeException("Position", "Position cannot be out of map"); if (!CheckPlaceForActiveObject(ActiveObject, Position)) throw new ArgumentException("ActiveObject", "ActiveObject cannot be located to this Position"); Guid Id = Guid.NewGuid(); MapActiveObjectState state = new MapActiveObjectState(ActiveObject, Position); state.Destroying += (sender, args) => { OnActiveObjectDestroying(args.ActiveObject); }; state.Destroyed += (sender, args) => { OnActiveObjectDestroyed(args.ActiveObject); }; this.ActiveObjects.Add(Id, state); AttachActiveObject(state, Position); return Id; }
/// <summary> /// Аргумент - активный объект /// </summary> /// <param name="Wall">Активный объект</param> public MapActiveObjectEventArgs(MapActiveObjectState ActiveObject) { this.ActiveObject = ActiveObject; }
/// <summary> /// "Приклеить" объект к карте /// </summary> /// <param name="ActiveObject">Активный объект</param> /// <param name="Position">Координаты левой верхней точки</param> private void AttachActiveObject(MapActiveObjectState ActiveObject, MapPoint Position) { ActiveObject.Locate(Position); for (UInt16 x = ActiveObject.Position.X; x < ActiveObject.Position.X + ActiveObject.Size.Width; x++) for (UInt16 y = ActiveObject.Position.Y; y < ActiveObject.Position.Y + ActiveObject.Size.Height; y++) Levels[Position.Level].Cells[x, y].AddActiveObject(ActiveObject); }
/// <summary> /// "Отклеить" объект от карты /// </summary> /// <param name="ActiveObject">Активный объект</param> private void DeAttachActiveObject(MapActiveObjectState ActiveObject) { for (UInt16 x = ActiveObject.Position.X; x < ActiveObject.Position.X + ActiveObject.Size.Width; x++) for (UInt16 y = ActiveObject.Position.Y; y < ActiveObject.Position.Y + ActiveObject.Size.Height; y++) Levels[ActiveObject.Position.Level].Cells[x, y].RemoveActiveObject(ActiveObject); }
/// <summary> /// Добавить активный объект /// </summary> /// <param name="ActiveObject">Активный объект</param> public void AddActiveObject(MapActiveObjectState ActiveObject) { if (ActiveObject == null) return; List<MapActiveObjectState> objects; if (ActiveObjects == null) { objects = new List<MapActiveObjectState>(); objects.Add(ActiveObject); } else { if (ActiveObjects.Contains(ActiveObject)) return; objects = new List<MapActiveObjectState>(ActiveObjects); objects.Add(ActiveObject); } ActiveObjects = objects.ToArray(); }
/// <summary> /// Удалить активный объект /// </summary> /// <param name="ActiveObject">Активный объект</param> public void RemoveActiveObject(MapActiveObjectState ActiveObject) { if (ActiveObject == null) return; if (ActiveObjects == null) return; if (!ActiveObjects.Contains(ActiveObject)) return; List<MapActiveObjectState> objects = new List<MapActiveObjectState>(ActiveObjects); objects.Remove(ActiveObject); ActiveObjects = objects.ToArray(); }
private FrameworkElement RenderActiveObject(MapActiveObjectState activeObject, Rect area) { if (activeObject == null) return null; if (activeObject.ActiveObject == null) return null; MapImageWPF imageSource = new MapImageWPF(activeObject.Image); Image image = new Image { Source = imageSource.Image, Stretch = Stretch.Fill }; double wallWidth = area.Width * WallPadding; double wallHeight = area.Height * WallPadding; double imageWidth = area.Width - wallWidth * 2; double imageHeight = area.Height - wallHeight * 2; Canvas.SetLeft(image, area.Left + wallWidth); Canvas.SetTop(image, area.Top + wallHeight); image.Width = imageWidth; image.Height = imageHeight; return image; }