示例#1
0
        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);
        }
示例#2
0
        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");
        }
示例#3
0
        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();
        }