private WorldObjectChange ApplyObjectChange(WorldObjectChange objectChange) { WorldObjectChange newChange = null; List <Rect> updateRects = new List <Rect>() { objectChange.OriginalObject.VisualRectangle }; if (objectChange.ChangeType == WorldObjectChangeType.Addition) { newChange = new WorldObjectChange(objectChange.OriginalObject, objectChange.OriginalObject.X, objectChange.OriginalObject.Y, objectChange.OriginalObject.GameObjectId, WorldObjectChangeType.Deletion); _world.ObjectData.Remove(objectChange.OriginalObject); _selectedObject = null; ClearSelectionRectangle(); } else if (objectChange.ChangeType == WorldObjectChangeType.Deletion) { newChange = new WorldObjectChange(objectChange.OriginalObject, objectChange.OriginalObject.X, objectChange.OriginalObject.Y, objectChange.OriginalObject.GameObjectId, WorldObjectChangeType.Addition); _world.ObjectData.Add(objectChange.OriginalObject); _selectedObject = objectChange.OriginalObject; SetSelectionRectangle(_selectedObject.CalcBoundBox()); } else if (objectChange.ChangeType == WorldObjectChangeType.Update) { newChange = new WorldObjectChange(objectChange.OriginalObject, objectChange.OriginalObject.X, objectChange.OriginalObject.Y, objectChange.OriginalObject.GameObjectId, WorldObjectChangeType.Update); objectChange.OriginalObject.X = objectChange.X; objectChange.OriginalObject.Y = objectChange.Y; objectChange.OriginalObject.GameObjectId = objectChange.GameId; objectChange.OriginalObject.GameObject = _gameObjectService.GetObject(objectChange.GameId); updateRects.Add(objectChange.OriginalObject.CalcVisualBox(true)); _selectedObject = objectChange.OriginalObject; SetSelectionRectangle(_selectedObject.CalcBoundBox()); } Update(updateRects); return(newChange); }
private void HandleObjectMove(MouseEventArgs e) { Point movePoint = Snap(e.GetPosition(WorldRenderSource)); if (_selectedObject != null && _isDragging) { Point diffPoint = Snap(new Point(movePoint.X - originalTilePoint.X, movePoint.Y - originalTilePoint.Y)); List <Rect> updateRects = new List <Rect>(); Rect oldRect = _selectedObject.VisualRectangle; if (oldRect.Right >= LevelRenderer.BITMAP_WIDTH) { oldRect.Width = oldRect.Width - (oldRect.Right - LevelRenderer.BITMAP_WIDTH); } if (oldRect.Bottom >= LevelRenderer.BITMAP_HEIGHT) { oldRect.Height = oldRect.Height - (oldRect.Bottom - LevelRenderer.BITMAP_HEIGHT); } updateRects.Add(oldRect); int newX = (int)((originalTilePoint.X + diffPoint.X) / 16); int newY = (int)((originalTilePoint.Y + diffPoint.Y) / 16); if (newX == _selectedObject.X && newY == _selectedObject.Y) { return; } if (newX >= Level.BLOCK_WIDTH) { newX = Level.BLOCK_WIDTH - 1; } if (newY >= Level.BLOCK_HEIGHT) { newY = Level.BLOCK_HEIGHT - 1; } _selectedObject.X = newX; _selectedObject.Y = newY; _selectedObject.CalcBoundBox(); _selectedObject.CalcVisualBox(true); Rect updateArea = _selectedObject.VisualRectangle; if (updateArea.Right >= LevelRenderer.BITMAP_WIDTH) { updateArea.Width = updateArea.Width - (updateArea.Right - LevelRenderer.BITMAP_WIDTH); } if (updateArea.Bottom >= LevelRenderer.BITMAP_HEIGHT) { updateArea.Height = updateArea.Height - (updateArea.Bottom - LevelRenderer.BITMAP_HEIGHT); } updateRects.Add(updateArea); SetSelectionRectangle(_selectedObject.BoundRectangle); Update(updateRects); } int blockX = (int)movePoint.X / 16, blockY = (int)movePoint.Y / 16; PointerXY.Text = "X: " + blockX.ToString("X2") + " Y: " + blockY.ToString("X2"); }
private void HandleObjectClick(MouseButtonEventArgs e) { Point tilePoint = e.GetPosition(WorldRenderSource); List <Rect> updatedRects = new List <Rect>(); if (e.LeftButton == MouseButtonState.Pressed || e.RightButton == MouseButtonState.Pressed) { if (e.RightButton == MouseButtonState.Pressed) { _selectedObject = _world.ObjectData.Where(o => o.BoundRectangle.Contains(tilePoint.X, tilePoint.Y)).FirstOrDefault(); if (_selectedObject != null && ObjectSelector.SelectedObject != null) { _historyService.UndoWorldObjects.Push(new WorldObjectChange(_selectedObject, _selectedObject.X, _selectedObject.Y, _selectedObject.GameObjectId, WorldObjectChangeType.Update)); updatedRects.Add(_selectedObject.VisualRectangle); _selectedObject.GameObject = ObjectSelector.SelectedObject; _selectedObject.CalcBoundBox(); updatedRects.Add(_selectedObject.CalcVisualBox(true)); } else { if (ObjectSelector.SelectedObject != null && _world.ObjectData.Count < 14) { WorldObject newObject = new WorldObject(); newObject.X = (int)(tilePoint.X / 16); newObject.Y = (int)(tilePoint.Y / 16); newObject.GameObject = ObjectSelector.SelectedObject; newObject.GameObjectId = ObjectSelector.SelectedObject.GameId; newObject.CalcBoundBox(); _world.ObjectData.Add(newObject); _historyService.UndoWorldObjects.Push(new WorldObjectChange(newObject, newObject.X, newObject.Y, newObject.GameObjectId, WorldObjectChangeType.Addition)); Update(newObject.CalcVisualBox(true)); } } } else { _selectedObject = _world.ObjectData.Where(o => o.BoundRectangle.Contains(tilePoint.X, tilePoint.Y)).FirstOrDefault(); if ((Keyboard.Modifiers & ModifierKeys.Shift) > 0 || (Keyboard.Modifiers & ModifierKeys.Control) > 0) { if (_selectedObject != null && !_selectedObject.GameObject.IsStartObject) { ObjectSelector.SelectedObject = _selectedObject.GameObject; } } } if (_selectedObject != null) { _dragStartPoint = tilePoint; SetSelectionRectangle(_selectedObject.BoundRectangle); originalTilePoint = new Point(_selectedObject.X * 16, _selectedObject.Y * 16); _isDragging = true; _historyService.UndoWorldObjects.Push(new WorldObjectChange(_selectedObject, _selectedObject.X, _selectedObject.Y, _selectedObject.GameObjectId, WorldObjectChangeType.Update)); } else { ClearSelectionRectangle(); } Update(updatedRects); } //UpdateSpriteStatus(); }