Esempio n. 1
0
        private void PictureBox_MouseDown(Object sender, MouseEventArgs e)
        {
            Control ctlSelected = (Control)sender;

            // Start drag drop

            LevelData ldat = new LevelData();
            IMapItem mi = (IMapItem)ctlSelected.Tag;
            ldat.ami = new IMapItem[] { mi };
            ldat.txMouse = e.X / 16.0;
            ldat.tyMouse = e.Y / 16.0;
            ldat.Grid.Width = mi.Grid.Width;
            ldat.Grid.Height = mi.Grid.Height;
            DoDragDrop(ldat, DragDropEffects.Copy);
        }
Esempio n. 2
0
        LevelData PrepareLevelData(int x, int y, Size sizTile, IMapItem[] ami)
        {
            // Figure out relative spacing

            double txMin = double.MaxValue;
            double tyMin = double.MaxValue;
            foreach (IMapItem mi in ami) {
                if (mi.tx < txMin)
                    txMin = mi.tx;
                if (mi.ty < tyMin)
                    tyMin = mi.ty;
            }

            LevelData ldat = new LevelData();
            ldat.Grid.Width = 0.0000001f;
            ldat.Grid.Height = 0.0000001f;

            for (int imi = 0; imi < ami.Length; imi++) {
                IMapItem mi = (IMapItem)ami[imi];

                // Keep track of the maximum gridding required by the various items
                // NOTE: all the grids must be evenly divisible into the largest grid
                // or final placement of the items will have the indivisible ones
                // realigning themselves.

                ldat.Grid.Width = Math.Max(ldat.Grid.Width, mi.Grid.Width);
                ldat.Grid.Height = Math.Max(ldat.Grid.Height, mi.Grid.Height);
            }

            // Offset tx/yMin so the clones will be grid-aligned

            txMin -= Math.IEEERemainder(txMin, ldat.Grid.Width);
            tyMin -= Math.IEEERemainder(tyMin, ldat.Grid.Height);

            // Now clone the map items and readjust tile coordinates
            // for origin of 0,0 (or as close as we can get and still be grid-aligned)

            ldat.ami = new IMapItem[ami.Length];
            for (int imi = 0; imi < ami.Length; imi++) {
                IMapItem mi = (IMapItem)ami[imi].Clone();
                ldat.ami[imi] = mi;
                mi.tx -= txMin;
                mi.ty -= tyMin;
            }

            // Figure out mouse position relative to this origin

            int xOrigin = (int)(txMin * sizTile.Width);
            int yOrigin = (int)(tyMin * sizTile.Height);
            ldat.txMouse = (double)(x - xOrigin) / (double)sizTile.Width;
            ldat.tyMouse = (double)(y - yOrigin) / (double)sizTile.Height;

            // All done

            return ldat;
        }
Esempio n. 3
0
        void PlaceMapItems(Point ptMouse, LevelData ldat)
        {
            // Figure out where we want to place these map items

            PointF ptOrigin;
            PointF[] aptPlace = GetPlacementPoints2(ptMouse, ldat, out ptOrigin);

            // Set their positions

            IMapItem[] ami = new IMapItem[ldat.ami.Length];
            for (int imi = 0; imi < ldat.ami.Length; imi++) {
                ami[imi] = (IMapItem)ldat.ami[imi].Clone();
                ami[imi].tx = aptPlace[imi].X;
                ami[imi].ty = aptPlace[imi].Y;
            }

            // Add them to the level, make them selected

            m_lvld.AddMapItems(ami);
            ArrayList alsmiSelected = new ArrayList();
            alsmiSelected.AddRange(ami);
            m_lvld.Selection = alsmiSelected;
            Globals.PropertyGrid.SelectedObjects = (Object[])alsmiSelected.ToArray(typeof(Object));
        }
Esempio n. 4
0
        PointF[] GetPlacementPoints2(Point ptMouse, LevelData ldat, out PointF ptOrigin)
        {
            Size sizTile = GetTileSize();
            double txOrigin = (ptMouse.X / (double)sizTile.Width) - ldat.txMouse;
            if (txOrigin < 0)
                txOrigin = 0;
            double tyOrigin = (ptMouse.Y / (double)sizTile.Height) - ldat.tyMouse;
            if (tyOrigin < 0)
                tyOrigin = 0;

            // Keep the new positions on the grid

            txOrigin = Math.Floor((txOrigin + ldat.Grid.Width / 2) / ldat.Grid.Width) * ldat.Grid.Width;
            tyOrigin = Math.Floor((tyOrigin + ldat.Grid.Height / 2) / ldat.Grid.Height) * ldat.Grid.Height;

            PointF[] aptPlace = new PointF[ldat.ami.Length];
            for (int imi = 0; imi < ldat.ami.Length; imi++) {
                double tx = txOrigin + ldat.ami[imi].tx;
                if (tx > m_lvld.Width - 1)
                    tx = m_lvld.Width - 1;
                double ty = tyOrigin + ldat.ami[imi].ty;
                if (ty > m_lvld.Height - 1)
                    ty = m_lvld.Height - 1;
                aptPlace[imi] = new PointF((float)tx, (float)ty);
            }

            ptOrigin = new PointF((float)txOrigin, (float)tyOrigin);
            return aptPlace;
        }
Esempio n. 5
0
        public void Paste()
        {
            // IMapItems present?

            IDataObject data = Clipboard.GetDataObject();
            if (!data.GetDataPresent(typeof(IMapItem[])))
                return;

            // For some reason the clipboard data object won't return a LevelData

            LevelData ldat = new LevelData();
            ldat.ami = (IMapItem[])data.GetData(typeof(IMapItem[]));
            Rectangle rc = GetBoundingRect(ldat.ami);
            Size sizTile = GetTileSize();
            ldat.txMouse = (double)rc.Width / (double)sizTile.Width;
            ldat.tyMouse = (double)rc.Height / (double)sizTile.Height;

            ldat.Grid.Width = 0.0000001f;
            ldat.Grid.Height = 0.0000001f;
            foreach (IMapItem mi in ldat.ami) {
                ldat.Grid.Width = Math.Max(mi.Grid.Width, ldat.Grid.Width);
                ldat.Grid.Height = Math.Max(mi.Grid.Height, ldat.Grid.Height);
            }

            // Place map items

            Point ptViewCenter = new Point(ClientSize.Width / 2, ClientSize.Height / 2);
            Point ptMouse = ViewToWorld(new Point(ptViewCenter.X - AutoScrollPosition.X, ptViewCenter.Y - AutoScrollPosition.Y));
            PlaceMapItems(ptMouse, ldat);
        }
        private void PictureBox_MouseDown(Object sender, MouseEventArgs e)
        {
            Control ctlSelected = (Control)sender;

            if (!Globals.IsKit()) {
                if (e.Button == MouseButtons.Right) {
                    contextMenuTiles.Show(ctlSelected, new Point(e.X, e.Y));
                    return;
                }
            }

            Tile tile = (Tile)((PictureBox)sender).Tag;
            Globals.PropertyGrid.SelectedObject = tile.GetTemplate(m_tmpdActive);

            // Start drag drop

            LevelData ldat = new LevelData();
            IMapItem mi = (IMapItem)ctlSelected.Tag;
            ldat.ami = new IMapItem[] { mi };
            Size sizTile = m_tmpdActive.TileSize;
            ldat.txMouse = e.X / (double)sizTile.Width;
            ldat.tyMouse = e.Y / (double)sizTile.Height;
            ldat.Grid.Width = mi.Grid.Width;
            ldat.Grid.Height = mi.Grid.Height;
            DoDragDrop(ldat, DragDropEffects.Copy);
        }