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); }
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; }
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)); }
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; }
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); }