Esempio n. 1
0
        /// <summary>
        /// Update game state and all content.  Should be called once every redraw, possibly called
        /// more often than the draws but only if it exceeds time between frame draws.
        /// </summary>
        /// <param name="gameTime">Current time information of the application</param>
        protected override void Update(GameTime gameTime)
        {
            int            nVertCtr, nPolyCtr, nTestCtr;
            List <Vector2> VertList  = new List <Vector2>();
            MouseState     CurrMouse = Mouse.GetState();
            Vector2        MousePt;
            Color          NewColor;

            MousePt.X = CurrMouse.X;
            MousePt.Y = CurrMouse.Y;

            if ((CurrMouse.LeftButton == ButtonState.Pressed) && (cPriorMouse.LeftButton == ButtonState.Released))
            {
                //Mouse was just clicked, see if its in range of a vertex
                for (nPolyCtr = 0; nPolyCtr < cPolyList.Count; nPolyCtr++)
                {
                    VertList.Clear();
                    VertList.AddRange(cPolyList[nPolyCtr].GetVertexes(false));

                    for (nVertCtr = 0; nVertCtr < VertList.Count; nVertCtr++)
                    {
                        if (MGMath.IsPointInCircle(MousePt, VertList[nVertCtr], CIRCLERADIUS) == true)
                        {
                            cMousePoly    = cPolyList[nPolyCtr];
                            cMouseVertIdx = nVertCtr;

                            break;
                        }
                    }
                }

                for (nPolyCtr = 0; cMousePoly == null && nPolyCtr < cPolyList.Count; nPolyCtr++)
                {
                    if (MGMath.PointInConvexPolygon(MousePt, cPolyList[nPolyCtr].GetVertexes(false)) == true)
                    {
                        cMovePoly  = cPolyList[nPolyCtr];
                        cMoveStart = MousePt;

                        break;
                    }
                }
            }
            else if ((CurrMouse.LeftButton == ButtonState.Released) && (CurrMouse.RightButton == ButtonState.Pressed) && (cPriorMouse.RightButton == ButtonState.Released))
            {
                //Mouse was just clicked, see if its in range of a vertex
                for (nPolyCtr = 0; cMousePoly == null && nPolyCtr < cPolyList.Count; nPolyCtr++)
                {
                    if (MGMath.PointInConvexPolygon(MousePt, cPolyList[nPolyCtr].GetVertexes(false)) == true)
                    {
                        cMousePoly = cPolyList[nPolyCtr];
                        cMoveStart = MousePt;

                        break;
                    }
                }
            }

            if ((CurrMouse.LeftButton == ButtonState.Released) && (CurrMouse.RightButton == ButtonState.Released) && ((cPriorMouse.LeftButton == ButtonState.Pressed) || (cPriorMouse.RightButton == ButtonState.Pressed)))
            {
                //Mouse was just released
                cMousePoly = null;
                cMovePoly  = null;
            }

            if ((CurrMouse.LeftButton == ButtonState.Pressed) && (cMousePoly != null))
            {
                //Update the position of the selected vertex
                cMousePoly.UpdateVertex(cMouseVertIdx, MousePt);
            }

            if ((CurrMouse.LeftButton == ButtonState.Pressed) && (cMovePoly != null))
            {
                //Update the position of the selected polygon
                cMovePoly.MoveShape(MousePt - cMoveStart);
                cMoveStart = MousePt;
            }

            if ((CurrMouse.LeftButton == ButtonState.Released) && (CurrMouse.RightButton == ButtonState.Pressed) && (cMousePoly != null))
            {
                //Update the rotation of the selected vertex
                cMousePoly.RotateShape = MGMath.GetAngleFromPoints(cMoveStart, MousePt);
            }

            cPriorMouse = CurrMouse;

            //Check if the polygons are colliding and make them red
            for (nPolyCtr = 0; nPolyCtr < cPolyList.Count; nPolyCtr++)
            {
                //Reset the background color
                NewColor   = cPolyList[nPolyCtr].LineColor;
                NewColor.R = 0;

                cPolyList[nPolyCtr].LineColor = NewColor;

                for (nTestCtr = 0; nTestCtr < cPolyList.Count; nTestCtr++)
                {
                    if (nPolyCtr == nTestCtr)                       //Can't collide with itself
                    {
                        continue;
                    }

                    if (cPolyList[nPolyCtr].TestCollision(cPolyList[nTestCtr]) == true)
                    {
                        NewColor   = cPolyList[nPolyCtr].LineColor;
                        NewColor.R = 255;

                        cPolyList[nPolyCtr].LineColor = NewColor;
                    }
                }
            }

            cDevConsole.Update(gameTime);

            //Use monogame update
            base.Update(gameTime);
        }