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