private void BlastCorpsViewer_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                switch (Mode)
                {
                case MouseMode.Select:
                    BlastCorpsItem item = FindNearbyItem(e.X, e.Y);
                    if (item != selectedItem)
                    {
                        selectedItem = item;
                        OnSelectionChangedEvent(new SelectionChangedEventArgs(selectedItem, false, false));
                        Invalidate();
                    }
                    break;

                case MouseMode.Move:
                    dragItem = FindNearbyItem(e.X, e.Y);
                    if (dragItem != selectedItem)
                    {
                        selectedItem = dragItem;
                        OnSelectionChangedEvent(new SelectionChangedEventArgs(selectedItem, false, false));
                        Invalidate();
                    }
                    break;

                case MouseMode.Add:
                    break;
                }
            }
        }
 private void BlastCorpsViewer_KeyDown(object sender, KeyEventArgs e)
 {
     if (selectedItem != null)
     {
         if (e.KeyCode == Keys.Delete)
         {
             OnSelectionChangedEvent(new SelectionChangedEventArgs(selectedItem, false, true));
             selectedItem = null;
             Invalidate();
         }
     }
 }
 public ItemMovedEventArgs(BlastCorpsItem item)
 {
     this.SelectedItem = item;
 }
 public SelectionChangedEventArgs(BlastCorpsItem item, bool added, bool deleted)
 {
     this.SelectedItem = item;
     this.IsAdded      = added;
     this.IsDeleted    = deleted;
 }
        private void BlastCorpsViewer_MouseUp(object sender, MouseEventArgs e)
        {
            if (level != null && e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                switch (Mode)
                {
                case MouseMode.Move:
                    if (dragItem != null)
                    {
                        selectedItem = dragItem;
                        OnSelectionChangedEvent(new SelectionChangedEventArgs(selectedItem, false, false));
                        dragItem = null;
                        Invalidate();
                    }
                    break;

                case MouseMode.Add:
                    Int16 x = (Int16)levelX(e.X);
                    Int16 z = (Int16)levelZ(e.Y);
                    if (AddType == typeof(AmmoBox))
                    {
                        AmmoBox box = new AmmoBox(x, level.carrier.y, z, 0);
                        selectedItem = box;
                        level.ammoBoxes.Add(box);
                    }
                    else if (AddType == typeof(CommPoint))
                    {
                        CommPoint comm = new CommPoint(x, level.carrier.y, z, 0);
                        selectedItem = comm;
                        level.commPoints.Add(comm);
                    }
                    else if (AddType == typeof(RDU))
                    {
                        RDU rdu = new RDU(x, level.carrier.y, z);
                        selectedItem = rdu;
                        level.rdus.Add(rdu);
                    }
                    else if (AddType == typeof(TNTCrate))
                    {
                        TNTCrate tnt = new TNTCrate(x, level.carrier.y, z, 0, 0, 0, 0);
                        selectedItem = tnt;
                        level.tntCrates.Add(tnt);
                    }
                    else if (AddType == typeof(SquareBlock))
                    {
                        SquareBlock block = new SquareBlock(x, level.carrier.y, z, SquareBlock.Type.Block, SquareBlock.Shape.Square);
                        selectedItem = block;
                        level.squareBlocks.Add(block);
                    }
                    else if (AddType == typeof(Vehicle))
                    {
                        Vehicle vehicle = new Vehicle(0, x, level.carrier.y, z, 0);
                        selectedItem = vehicle;
                        level.vehicles.Add(vehicle);
                    }
                    else if (AddType == typeof(Building))
                    {
                        Building building = new Building(x, level.carrier.y, z, 0, 0, 0, 0, 0);
                        selectedItem = building;
                        level.buildings.Add(building);
                    }
                    OnSelectionChangedEvent(new SelectionChangedEventArgs(selectedItem, true, false));
                    Invalidate();
                    break;
                }
            }
        }
        private BlastCorpsItem FindNearbyItem(int pixelX, int pixelY)
        {
            BlastCorpsItem itemFound = null;

            if (level != null)
            {
                // find something to select
                int x    = levelX(pixelX);
                int z    = levelZ(pixelY);
                int diff = levelX(0) - levelX(4);

                foreach (AmmoBox ammo in level.ammoBoxes)
                {
                    if (Math.Abs(x - ammo.x) < diff && Math.Abs(z - ammo.z) < diff)
                    {
                        itemFound = ammo;
                        break;
                    }
                }

                foreach (CommPoint comm in level.commPoints)
                {
                    if (Math.Abs(x - comm.x) < diff && Math.Abs(z - comm.z) < diff)
                    {
                        itemFound = comm;
                        break;
                    }
                }

                foreach (RDU rdu in level.rdus)
                {
                    if (Math.Abs(x - rdu.x) < diff && Math.Abs(z - rdu.z) < diff)
                    {
                        itemFound = rdu;
                        break;
                    }
                }

                foreach (TNTCrate tnt in level.tntCrates)
                {
                    if (Math.Abs(x - tnt.x) < diff && Math.Abs(z - tnt.z) < diff)
                    {
                        itemFound = tnt;
                        break;
                    }
                }

                foreach (SquareBlock block in level.squareBlocks)
                {
                    if (Math.Abs(x - block.x) < diff && Math.Abs(z - block.z) < diff)
                    {
                        itemFound = block;
                        break;
                    }
                }

                foreach (Vehicle veh in level.vehicles)
                {
                    if (Math.Abs(x - veh.x) < diff && Math.Abs(z - veh.z) < diff)
                    {
                        itemFound = veh;
                        break;
                    }
                }

                if (Math.Abs(x - level.carrier.x) < diff && Math.Abs(z - level.carrier.z) < diff)
                {
                    itemFound = level.carrier;
                }

                foreach (Building b in level.buildings)
                {
                    if (Math.Abs(x - b.x) < diff && Math.Abs(z - b.z) < diff)
                    {
                        itemFound = b;
                        break;
                    }
                }
            }
            return(itemFound);
        }
Ejemplo n.º 7
0
        private void doPicking(int mX, int mY)
        {
            // draw to back buffer
            paintByNumber();

            // read pixel color at mouse position mX,mY
            byte[] pixel    = new byte[3];
            int[]  viewport = new int[4];
            // Y-axis flipped between OpenGL and window
            GL.GetInteger(GetPName.Viewport, viewport);
            GL.ReadPixels(mX, viewport[3] - mY - glControlViewer.Location.Y, 1, 1, PixelFormat.Rgb, PixelType.UnsignedByte, pixel);
            // reverse color mapping from RGB to type/list index
            int            type    = (int)pixel[2];
            int            index   = (int)pixel[1] + (((int)pixel[0]) << 8);
            BlastCorpsItem curItem = selectedItem;

            if (index > -1)
            {
                labelType.Text  = String.Format("Type: {0:X02}", type);
                labelIndex.Text = String.Format("Index: {0:X04}", index);
                switch (type)
                {
                case 0x20: // Ammo
                    if (index < level.ammoBoxes.Count)
                    {
                        selectedItem = level.ammoBoxes[index];
                    }
                    break;

                case 0x28: // Comm Pt.
                    if (index < level.commPoints.Count)
                    {
                        selectedItem = level.commPoints[index];
                    }
                    break;

                case 0x34: // RDU
                    if (index < level.rdus.Count)
                    {
                        selectedItem = level.rdus[index];
                    }
                    break;

                case 0x38: // TNT
                    if (index < level.tntCrates.Count)
                    {
                        selectedItem = level.tntCrates[index];
                    }
                    break;

                case 0x3C: // square blocks
                    if (index < level.squareBlocks.Count)
                    {
                        selectedItem = level.squareBlocks[index];
                    }
                    break;

                case 0x50: // vehicles
                    if (index < level.vehicles.Count)
                    {
                        selectedItem = level.vehicles[index];
                    }
                    break;

                case 0x54: // missile carrier
                    selectedItem = level.carrier;
                    break;

                case 0x5C: // buildings
                    if (index < level.buildings.Count)
                    {
                        selectedItem = level.buildings[index];
                    }
                    break;

                case 0xFF: // nothing
                    selectedItem = null;
                    break;
                }
                if (curItem != selectedItem)
                {
                    glControlViewer.Invalidate();
                }
            }
        }