示例#1
0
        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();
                }
            }
        }