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