public static List <IntPoint> GetBumperPoly(BumpRigid me, Vector2 ePos) { Vector2 posCenter = me.PositionXNACenter2D; float xUL, xUR, xBL, xBR, yUL, yUR, yBL, yBR; xUL = xUR = xBL = xBR = yUL = yUR = yBL = yBR = 0; CookieDirection abDir = GetABCookieDirection(ePos, posCenter); CookieDirection rlDir = GetRLCookieDirection(ePos, posCenter); switch (me.Dir) { case Direction.East: case Direction.West: if (abDir == CookieDirection.FromAbove) { if (rlDir == CookieDirection.FromLeft) { return(new List <IntPoint>() { new IntPoint((int)posCenter.X, (int)posCenter.Y - fR), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y - fR + 10), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X + nR, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X + nR, (int)posCenter.Y), new IntPoint((int)posCenter.X, (int)posCenter.Y), }); } else { return(new List <IntPoint>() { new IntPoint((int)posCenter.X - dfR, (int)posCenter.Y - fR + 10), new IntPoint((int)posCenter.X, (int)posCenter.Y - fR), new IntPoint((int)posCenter.X, (int)posCenter.Y), new IntPoint((int)posCenter.X - nR, (int)posCenter.Y), new IntPoint((int)posCenter.X - nR, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X - dfR, (int)posCenter.Y + 900), }); } } else // From Bottom { if (rlDir == CookieDirection.FromLeft) { return(new List <IntPoint>() { new IntPoint((int)posCenter.X, (int)posCenter.Y), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y + 30), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X, (int)posCenter.Y + 900), }); } else { return(new List <IntPoint>() { new IntPoint((int)posCenter.X - dfR, (int)posCenter.Y + 30), new IntPoint((int)posCenter.X, (int)posCenter.Y), new IntPoint((int)posCenter.X, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X - dfR, (int)posCenter.Y + 900), }); } } break; case Direction.SouthEast: case Direction.NorthWest: if (abDir == CookieDirection.FromAbove) { return(new List <IntPoint>() { new IntPoint((int)posCenter.X - 20, (int)posCenter.Y - 20), new IntPoint((int)posCenter.X + 20, (int)posCenter.Y - fR), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y - nR), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X + 20, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X + 20, (int)posCenter.Y + 20), }); } else { //if (abDir == CookieDirection.FromBottom) { return(new List <IntPoint>() { new IntPoint((int)posCenter.X - dfR / 2, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X - dfR / 2, (int)posCenter.Y), new IntPoint((int)posCenter.X - 20, (int)posCenter.Y - 20), new IntPoint((int)posCenter.X + nR, (int)posCenter.Y + nR), new IntPoint((int)posCenter.X + nR, (int)posCenter.Y + 900), }); } } break; case Direction.South: case Direction.North: return(new List <IntPoint>() { }); break; case Direction.SouthWest: case Direction.NorthEast: if (abDir == CookieDirection.FromAbove) { return(new List <IntPoint>() { new IntPoint((int)posCenter.X - dfR, (int)posCenter.Y - fR), new IntPoint((int)posCenter.X, (int)posCenter.Y - fR), new IntPoint((int)posCenter.X + 20, (int)posCenter.Y - 20), new IntPoint((int)posCenter.X - 20, (int)posCenter.Y + 20), new IntPoint((int)posCenter.X - 20, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X - dfR, (int)posCenter.Y + 900) }); } else { return(new List <IntPoint>() { new IntPoint((int)posCenter.X - 20, (int)posCenter.Y + 20), new IntPoint((int)posCenter.X + 20, (int)posCenter.Y - 20), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y), new IntPoint((int)posCenter.X + dfR, (int)posCenter.Y + 900), new IntPoint((int)posCenter.X - 20, (int)posCenter.Y + 900), }); } break; default: throw new ArgumentOutOfRangeException(); } }
public static void AddBumpsAreaForBubble(ref List <List <IntPoint> > initialPoly, BumperEntityPoly bumper, BubbleEntityPoly bubble) { BubbleService bubbleService = bubble.CompObj as BubbleService; Vector2 bubblePos = bubbleService.PositionXNACenter; //var coveredBumps = BumpersHandler.GetCoveredBumpers(bubble, initialPoly); int fR = AreaCompPolyHandler.fR; int nR = AreaCompPolyHandler.nR; int dfR = AreaCompPolyHandler.dfR; //foreach (BumperEntityPoly bumper in coveredBumps) { BumpRigid bump = bumper.CompObj as BumpRigid; Vector2 bPos = bump.PositionXNACenter2D; CookieDirection abDir = AreaCompPolyHandler.GetABCookieDirection(bubblePos, bPos); CookieDirection rlDir = AreaCompPolyHandler.GetRLCookieDirection(bubblePos, bPos); switch (bump.Dir) { case Direction.East: case Direction.West: if (abDir == CookieDirection.FromBottom) { if (rlDir == CookieDirection.FromRight) { initialPoly = EntraSolver.GetPolySolution(initialPoly, new List <IntPoint>() { new IntPoint((int)bPos.X, (int)bPos.Y + 900), new IntPoint((int)bPos.X - fR, (int)bPos.Y + 900), new IntPoint((int)bPos.X - fR, (int)bPos.Y - 900), new IntPoint((int)bPos.X, (int)bPos.Y - 900) }, ClipType.ctUnion); } else { //initialPoly = EntraSolver.GetPolySolution(initialPoly, // new Polygon() // { // new IntPoint((int) bPos.X, // (int) bPos.Y - 900), // new IntPoint((int) bPos.X + fR, // (int) bPos.Y - 900), // new IntPoint((int) bPos.X + fR, // (int) bPos.Y + nR), // new IntPoint((int) bPos.X - 20, // (int) bPos.Y + nR), // new IntPoint((int) bPos.X - 20, // (int) bPos.Y + 20), // }, // ClipType.ctUnion); initialPoly = EntraSolver.GetPolySolution(initialPoly, new List <IntPoint>() { new IntPoint((int)bPos.X, (int)bPos.Y - 900), new IntPoint((int)bPos.X + fR, (int)bPos.Y - 900), new IntPoint((int)bPos.X + fR, (int)bPos.Y + 900), new IntPoint((int)bPos.X, (int)bPos.Y + 900) }, ClipType.ctUnion); } } else { // the bubble is above the bumps so don't add anything } break; case Direction.South: case Direction.North: break; case Direction.NorthWest: case Direction.SouthEast: if (abDir == CookieDirection.FromBottom) // From Right and Left are the same { initialPoly = EntraSolver.GetPolySolution(initialPoly, new List <IntPoint>() { new IntPoint((int)bPos.X, (int)bPos.Y + 900), new IntPoint((int)bPos.X - fR, (int)bPos.Y + 900), new IntPoint((int)bPos.X - fR, (int)bPos.Y - 900), new IntPoint((int)bPos.X, (int)bPos.Y - 900) }, ClipType.ctUnion); } break; case Direction.NorthEast: case Direction.SouthWest: if (abDir == CookieDirection.FromBottom) // From Right and Left are the same { //var poly = new Polygon() // { // new IntPoint((int) bPos.X, (int) bPos.Y - 900), // new IntPoint((int) bPos.X + fR, // (int) bPos.Y - 900), // new IntPoint((int) bPos.X + fR, (int) bPos.Y), // new IntPoint((int) bPos.X, (int) bPos.Y), // }; //EntraDrawer.DrawIntoFile(poly); //initialPoly = EntraSolver.GetPolySolution(initialPoly, // poly, // ClipType.ctUnion); var poly = new List <IntPoint>() { new IntPoint((int)bPos.X, (int)bPos.Y - 900), new IntPoint((int)bPos.X + fR, (int)bPos.Y - 900), new IntPoint((int)bPos.X + fR, (int)bPos.Y + 900), new IntPoint((int)bPos.X, (int)bPos.Y + 900), }; initialPoly = EntraSolver.GetPolySolution(initialPoly, poly, ClipType.ctUnion); EntraDrawer.DrawIntoFile(poly); } break; default: throw new ArgumentOutOfRangeException(); } } }