示例#1
0
        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;
            }
        }
示例#2
0
 public ChainSegment(ChainVertex vertex1, ChainVertex vertex2, float length)
 {
     Vertex1 = vertex1;
     Vertex2 = vertex2;
     Length  = length;
 }