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