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