private void HandleInput() { if (Input.KeyboardHold(Keys.S)) // Select nearest vertex { var foundVertex = Vertices.IndexOf(Vertices.OrderBy(v => (v.Position - Input.MousePos.ToVector2()).LengthSquared()).First()); if (Input.MouseClick) { currentVertex = foundVertex; } if (Input.RightMouseClick) { currentShiftVertex = foundVertex; } } else // Toggle static or add segments { if (Input.MouseClick) { Vertices[currentVertex].StaticPos = Input.MousePos.ToVector2(); Vertices[currentVertex].Static = !Vertices[currentVertex].Static; } if (Input.RightMouseClick) { var newVertex = new ChainVertex(Input.MousePos.ToVector2(), (float)(Rand.NextDouble() * 8f + 4f), 0.9f, 0.5f, GRAVITY); Vertices.Add(newVertex); Segments.Add(new ChainSegment(newVertex, Vertices[currentVertex], (float)(Rand.NextDouble() * 20f + 10f))); currentVertex = Vertices.Count - 1; } } if (Input.KeyboardClick(Keys.L)) // Link / Unlink { if (currentShiftVertex != currentVertex) { if (Input.Shift) { var foundSegment = Segments.First(s => (s.Vertex1 == Vertices[currentVertex] && s.Vertex2 == Vertices[currentShiftVertex]) || (s.Vertex2 == Vertices[currentVertex] && s.Vertex1 == Vertices[currentShiftVertex])); if (foundSegment != null) { Segments.Remove(foundSegment); } } else { Segments.Add(new ChainSegment(Vertices[currentShiftVertex], Vertices[currentVertex], (float)(Rand.NextDouble() * 20f + 10f))); } } } if (Input.ScrollDown) // Change selected vertices { if (Input.Shift) { currentShiftVertex++; if (currentShiftVertex >= Vertices.Count) { currentShiftVertex = 0; } } else { currentVertex++; if (currentVertex >= Vertices.Count) { currentVertex = 0; } } } if (Input.ScrollUp) { if (Input.Shift) { currentShiftVertex--; if (currentShiftVertex < 0) { currentShiftVertex = Vertices.Count - 1; } } else { currentVertex--; if (currentVertex < 0) { currentVertex = Vertices.Count - 1; } } } if (Input.KeyboardHold(Keys.H)) // Hold current vertex to mouse { Vertices[currentVertex].Position = Input.MousePos.ToVector2(); } if (Input.KeyboardClick(Keys.Back) || Input.KeyboardClick(Keys.Delete)) // Delete current vertex { if (Vertices.Count > 1) { var vertexToDelete = Vertices[currentVertex]; foreach (var s in Segments.Where(s => s.Vertex1 == vertexToDelete || s.Vertex2 == vertexToDelete).ToList()) { Segments.Remove(s); } Vertices.Remove(vertexToDelete); if (currentVertex >= Vertices.Count) { currentVertex = Vertices.Count - 1; } } } if (Input.KeyboardClick(Keys.I)) { ShowStats = !ShowStats; } }
public ChainSegment(ChainVertex vertex1, ChainVertex vertex2, float length) { Vertex1 = vertex1; Vertex2 = vertex2; Length = length; }