private List <Vector2> GetParticalWayTo(Partical partical, Vector2 destination) { List <Vector2> way = new List <Vector2>(); way.Add(new Vector2(partical.rect.X, partical.rect.Y)); Vector2 node; while (true) { node = way[way.Count - 1]; if (partical.SimulateGoTo(node, destination, out node)) { way.Add(node); } else { break; } } return(way); }
private void AddDestinationAndAvoidHoles(Partical partical, Vector2 startingPoint) { while (true) { Vector2 randomDestination = GetRandomDestination(startingPoint); bool intersects = false; foreach (Vector2 node in GetParticalWayTo(partical, randomDestination)) { Rectangle particalRect = new Rectangle((int)node.X, (int)node.Y, partical.rect.Width, partical.rect.Height); intersects = CheckForParticalCollision(particalRect); if (intersects) { break; } } if (!intersects) { partical.destinationsList.Add(randomDestination); break; } } }
public ParticalManager(ParticalsMovement particalsMovement, int maxParticals, Rectangle rect, Vector2 particalSize, int randomParticalSize, int speed, Color color, Color randomColor, int opacity, int randomOpacity) { this.rect = rect; this.particalsMovement = particalsMovement; snakes = new Partical[maxParticals]; int randomColorR = 0; int randomColorG = 0; int randomColorB = 0; if (color.R > randomColor.R) { randomColorR = randomColor.R - color.R; } if (color.R < randomColor.R) { randomColorR = randomColor.R - color.R; } if (color.G > randomColor.G) { randomColorG = randomColor.G - color.G; } if (color.G < randomColor.G) { randomColorG = randomColor.G - color.G; } if (color.B > randomColor.B) { randomColorB = randomColor.B - color.B; } if (color.B < randomColor.B) { randomColorB = randomColor.B - color.B; } for (int i = 0; i < snakes.Length; i++) { int randomSize; if (randomParticalSize < 0) { randomSize = random.Next(randomParticalSize * -1); randomParticalSize *= -1; } else { randomSize = random.Next(randomParticalSize); } Vector2 startingPoint = new Vector2(rect.X + random.Next(rect.Width), rect.Y + random.Next(rect.Height)); snakes[i] = new Partical(new Rectangle((int)startingPoint.X, (int)startingPoint.Y, (int)particalSize.X + randomSize, (int)particalSize.Y + randomSize), speed, new Color(color.R + RandomColor(randomColorR), color.G + RandomColor(randomColorG), color.B + RandomColor(randomColorB)), (opacity + random.Next(randomOpacity)) / 100f);//i, 255, i //random.Next(70) / 100f); switch (particalsMovement) { case ParticalsMovement.xy: snakes[i].destinationsList.Add(new Vector2(rect.X + random.Next(rect.Width), rect.Y + random.Next(rect.Height))); snakes[i].destinationsList.Add(new Vector2(rect.X + random.Next(rect.Width), rect.Y + random.Next(rect.Height))); snakes[i].destinationsList.Add(startingPoint); break; case ParticalsMovement.y: snakes[i].destinationsList.Add(new Vector2(startingPoint.X, rect.Y + random.Next(rect.Height))); snakes[i].destinationsList.Add(new Vector2(startingPoint.X, rect.Y + random.Next(rect.Height))); snakes[i].destinationsList.Add(startingPoint); break; case ParticalsMovement.x: snakes[i].destinationsList.Add(new Vector2(rect.X + random.Next(rect.Width), startingPoint.Y)); snakes[i].destinationsList.Add(new Vector2(rect.X + random.Next(rect.Width), startingPoint.Y)); snakes[i].destinationsList.Add(startingPoint); break; } } }