Beispiel #1
0
        int r = 25; // rozrzut nabojow przy strzelaniu

        public Gun(Vector2 start, Vector2 target, TimeSpan timeStart, Faction faction, GameTime gameTime)
        {
            power      = 1;
            range      = 450f;
            speed      = 3.5f;
            position   = new Vector2(start.X, start.Y);
            this.start = new Vector2(start.X, start.Y);

            this.target = new Vector2(target.X - start.X, target.Y - start.Y);

            if (this.target != Vector2.Zero)
            {
                this.target.Normalize();
                this.target *= range;
                this.target += this.start;
                // Jakaś mała randomizacja przy strzelaniu
                Random rand = new Random();
                this.target += new Vector2(rand.Next(-r, r), rand.Next(-r, r));
            }

            //double s = Math.Sqrt(Math.Pow(this.target.X - this.start.X, 2) + Math.Pow(this.target.Y - this.start.Y, 2));


            List <Vector2> points = new List <Vector2>();
            Vector2        v      = new Vector2(target.X - start.X, target.Y - start.Y);

            points.Add(Vector2.Zero);
            if (v != Vector2.Zero)
            {
                v.Normalize();
                v *= 10;
                points.Add(new Vector2(v.X, v.Y));
                Vector2.Transform(v, Matrix.CreateRotationX(MathHelper.PiOver2));
                //points.Add(new Vector2(v.X, v.Y));
                Vector2.Transform(v, Matrix.CreateRotationX(MathHelper.Pi));
                //points.Add(new Vector2(v.X, v.Y));
            }
            boundaries    = Boundaries.CreateFromPoints(points);
            this.faction  = faction;
            timeStartMove = timeStart;
        }
Beispiel #2
0
        public static IGraph CreateAdvancedGraph(this GameMap gameMap, List <Fighter> fighters, List <Enemy> enemies, Vector2 start, Vector2 end, out Vector2 startGraph)
        {
            // Punkt startowy i końcowy na siatce o gęstości wyznaczonej przez VerticesDensity
            Vector2 startPoint = new Vector2((float)Math.Round(start.X / VerticesDensity) * VerticesDensity, (float)Math.Round(start.Y / VerticesDensity) * VerticesDensity);
            Vector2 endPoint   = new Vector2((float)Math.Round(end.X / VerticesDensity) * VerticesDensity, (float)Math.Round(end.Y / VerticesDensity) * VerticesDensity);

            // Jak dużo punktów mieści się na jednym Tile'u
            Vector2 tileDensity = new Vector2((float)Math.Ceiling(GameMap.TileShift.X / VerticesDensity), (float)Math.Ceiling(GameMap.TileShift.Y / VerticesDensity));

            // W którym miejscu na ekranie zaczyna się i kończy graf
            startGraph = new Vector2(Math.Min(startPoint.X, endPoint.X) - VerticesDensity * tileDensity.X, Math.Min(startPoint.Y, endPoint.Y) - VerticesDensity * tileDensity.Y);
            Vector2 endGraph = new Vector2(Math.Max(startPoint.X, endPoint.X) + VerticesDensity * tileDensity.X, Math.Max(startPoint.Y, endPoint.Y) + VerticesDensity * tileDensity.Y);

            // Rozmiar grafu
            Point size = new Point((int)((endGraph.X - startGraph.X) / VerticesDensity + 1), (int)((endGraph.Y - startGraph.Y) / VerticesDensity + 1));

            IGraph g = new AdjacencyMatrixGraph(false, (int)(size.X * size.Y));


            // Utworzenie granic do sprawdzania czy da się przejść

            Boundaries[] b = new Boundaries[8];

            List <Vector2> points = new List <Vector2>();

            // Lewy górny
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(Unit.BoundariesSize - VerticesDensity, -VerticesDensity));
            points.Add(new Vector2(-VerticesDensity, -Unit.BoundariesSize - VerticesDensity));
            points.Add(new Vector2(-Unit.BoundariesSize - VerticesDensity, -VerticesDensity));

            b[0] = Boundaries.CreateFromPoints(points);

            // Górny
            points.Clear();
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(Unit.BoundariesSize, -VerticesDensity));
            points.Add(new Vector2(0, -Unit.BoundariesSize - VerticesDensity));
            points.Add(new Vector2(-Unit.BoundariesSize, -VerticesDensity));

            b[1] = Boundaries.CreateFromPoints(points);

            // Prawy górny
            points.Clear();
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(VerticesDensity + Unit.BoundariesSize, -VerticesDensity));
            points.Add(new Vector2(VerticesDensity, -Unit.BoundariesSize - VerticesDensity));
            points.Add(new Vector2(VerticesDensity - Unit.BoundariesSize, -VerticesDensity));

            b[2] = Boundaries.CreateFromPoints(points);

            // Prawy
            points.Clear();
            points.Add(new Vector2(0, Unit.BoundariesSize));
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, -Unit.BoundariesSize));
            points.Add(new Vector2(VerticesDensity, -Unit.BoundariesSize));
            points.Add(new Vector2(VerticesDensity + Unit.BoundariesSize, 0));
            points.Add(new Vector2(VerticesDensity, Unit.BoundariesSize));
            b[3] = Boundaries.CreateFromPoints(points);

            // Prawy dolny
            points.Clear();
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, -Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(VerticesDensity + Unit.BoundariesSize, VerticesDensity));
            points.Add(new Vector2(VerticesDensity, VerticesDensity + Unit.BoundariesSize));
            points.Add(new Vector2(VerticesDensity - Unit.BoundariesSize, VerticesDensity));

            b[4] = Boundaries.CreateFromPoints(points);

            // Dolny
            points.Clear();
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, -Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(Unit.BoundariesSize, VerticesDensity));
            points.Add(new Vector2(0, VerticesDensity + Unit.BoundariesSize));
            points.Add(new Vector2(-Unit.BoundariesSize, VerticesDensity));

            b[5] = Boundaries.CreateFromPoints(points);

            // Lewy dolny
            points.Clear();
            points.Add(new Vector2(-Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, -Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(-VerticesDensity + Unit.BoundariesSize, VerticesDensity));
            points.Add(new Vector2(-VerticesDensity, VerticesDensity + Unit.BoundariesSize));
            points.Add(new Vector2(-VerticesDensity - Unit.BoundariesSize, VerticesDensity));

            b[6] = Boundaries.CreateFromPoints(points);

            // Lewy
            points.Clear();
            points.Add(new Vector2(0, Unit.BoundariesSize));
            points.Add(new Vector2(Unit.BoundariesSize, 0));
            points.Add(new Vector2(0, -Unit.BoundariesSize));
            points.Add(new Vector2(-VerticesDensity, -Unit.BoundariesSize));
            points.Add(new Vector2(-VerticesDensity - Unit.BoundariesSize, 0));
            points.Add(new Vector2(-VerticesDensity, Unit.BoundariesSize));

            b[7] = Boundaries.CreateFromPoints(points);


            // Tworzenie grafu, TODO: do poprawki ta pętla
            for (int i = 1; i < size.X - 1; i += 2)
            {
                for (int j = 1; j < size.Y - 1; j += 2)
                {
                    Vector2 mapPosition = new Vector2(startGraph.X + i * VerticesDensity, startGraph.Y + j * VerticesDensity);
                    bool    intersects  = false;

                    // TODO: poprawić na współrzędne mapy bo jest bzdura
                    foreach (var mo in gameMap[i - 1, j - 1].mapObjects)
                    {
                        if ((b[0] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[0] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i - 1 + (j - 1) * (size.X - 1), i + j * (size.X - 1));
                    }
                    else
                    {
                        g.DelEdge(i - 1 + (j - 1) * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i, j - 1].mapObjects)
                    {
                        if ((b[1] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[1] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i + (j - 1) * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i + 1, j - 1].mapObjects)
                    {
                        if ((b[2] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[2] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i + 1 + (j - 1) * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i + 1, j].mapObjects)
                    {
                        if ((b[3] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[3] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i + 1 + j * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i + 1, j + 1].mapObjects)
                    {
                        if ((b[4] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[4] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i + 1 + (j + 1) * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i, j + 1].mapObjects)
                    {
                        if ((b[5] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[5] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i + (j + 1) * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i - 1, j + 1].mapObjects)
                    {
                        if ((b[6] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[6] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i - 1 + (j + 1) * (size.X - 1), i + j * (size.X - 1));
                    }

                    intersects = false;
                    foreach (var mo in gameMap[i - 1, j].mapObjects)
                    {
                        if ((b[7] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    foreach (var mo in gameMap[i, j].mapObjects)
                    {
                        if ((b[7] + mapPosition).Intersects(mo.boundaries))
                        {
                            intersects = true;
                        }
                    }
                    if (!intersects)
                    {
                        g.AddEdge(i - 1 + j * (size.X - 1), i + j * (size.X - 1));
                    }
                }
            }

            return(g);
        }
Beispiel #3
0
        protected Object Collision(GameMap gameMap, List <Fighter> fighters, List <Enemy> enemies)
        {
            int i = position.GetMapPosition(gameMap).X;
            int j = position.GetMapPosition(gameMap).Y;

            for (int k = -1; k <= 1; k++)
            {
                for (int l = -1; l <= 1; l++)
                {
                    if (i + k >= 0 && j + l >= 0 && i + k < gameMap.width && j + l < gameMap.height)
                    {
                        foreach (var mo in gameMap.mapTiles[i + k][j + l].mapObjects)
                        {
                            if ((j + l) % 2 == 0)
                            {
                                if (mo.boundaries.Intersects(boundaries + position))
                                {
                                    return(mo);
                                }
                            }
                            else
                            {
                                if (mo.boundaries.Intersects(boundaries + position))
                                {
                                    return(mo);
                                }
                            }
                        }
                    }
                }
            }



            Boundaries     b;
            List <Vector2> points = new List <Vector2>();

            points.Add(new Vector2(-5, -25));
            points.Add(new Vector2(5, -25));
            points.Add(new Vector2(5, 0));
            points.Add(new Vector2(-5, 0));

            b = Boundaries.CreateFromPoints(points);

            if (faction == Faction.Enemies)
            {
                foreach (Fighter f in fighters)
                {
                    //if ((boundaries + position).Intersects(f.boundaries + f.position + new Vector2(0, -15)))
                    if (f.IsAlive && (boundaries + position).Intersects(b + f.position))
                    {
                        return(f);
                    }
                }
            }

            if (faction == Faction.Fighters)
            {
                foreach (Enemy e in enemies)
                {
                    //if ((boundaries + position).Intersects(e.boundaries + e.position + new Vector2(0,-15)))
                    if (e.IsAlive && (boundaries + position).Intersects(b + e.position))
                    {
                        return(e);
                    }
                }
            }

            return(null);
        }