public static async void EnemiesMovement() { while (GraphicsDrawing.Running) { if (!GraphicsDrawing.FreezeState) { lock (Enemies.E) { foreach (Enemies.Enemy Enemy in Enemies.E.ToList()) { if (Enemy.Type == "Suicide" && Enemy.HP <= 0) { //Suicide enemy Enemy.Size += Enemy.Size / 15; Enemy.Rect = new RectangleF(Enemy.Rect.X - Enemy.Size / 30, Enemy.Rect.Y - Enemy.Size / 30, Enemy.Rect.Width, Enemy.Rect.Height); //Player taking damage if (new RectangleF(Enemy.Rect.X + UIElements.GraphicsOffset_X, Enemy.Rect.Y + UIElements.GraphicsOffset_Y, Enemy.Size, Enemy.Size).IntersectsWith(Player.PlayerObj)) { Player.HP -= Enemy.Damage * 5 / Player.Defence; } if (Enemy.Size > 300) { //Enemy dead //Removes enemy Enemies.E.Remove(Enemy); Enemies.E.TrimExcess(); } } if (Enemy.Type == "Summoner") { Random rand1 = new Random(); if (rand1.Next(1, 101) <= 1 && Player.Level > 0) { AddEnemy("Minion", new RectangleF(Enemy.Rect.X + Enemy.Size / 2, Enemy.Rect.Y + Enemy.Size / 2, 20, 20), 50, 1, 2, 15, 1.8f, Color.DarkOliveGreen, 220, 0.01f, Enemy.Level); } } if (Player.HP >= 0) { //Player taking damage if (new RectangleF(Enemy.Rect.X + UIElements.GraphicsOffset_X, Enemy.Rect.Y + UIElements.GraphicsOffset_Y, Enemy.Rect.Width, Enemy.Rect.Height).IntersectsWith(Player.PlayerObj)) { Player.HP -= Enemy.Damage / Player.Defence; } } else { //Player dead if (UIElements.ScreenAlpha < 250) { GraphicsDrawing.FreezeState = true; UIElements.ScreenAlpha += 5f; } } if (GraphicsDrawing.FreezeState == false) { if (Enemy.HP >= 0) { //Enemy movement float x = Player.Location.X - UIElements.GraphicsOffset_X + Player.Size / 2 - Enemy.Size / 2; float y = Player.Location.Y - UIElements.GraphicsOffset_Y + Player.Size / 2 - Enemy.Size / 2; float dx = x - Enemy.Rect.X; float dy = y - Enemy.Rect.Y; double length = Math.Sqrt(dx * dx + dy * dy); if (length >= Enemy.Speed) { //Move towards the destination Enemy.Rect = new RectangleF((float)(Enemy.Rect.X + Enemy.Speed * dx / length), (float)(Enemy.Rect.Y + Enemy.Speed * dy / length), Enemy.Size, Enemy.Size); } } else { //enemy death animation Player.XP += Enemy.XP / (Player.Level / 20f); //Level up if (Player.XP > UIElements.ScreenSize.Width) { Player.XP = 0; Player.Level += 1; UIElements.LevelUp = true; Game.LevelUpTimer(); if (Player.HP - Player.MaxHP * Player.Level / 160 < Player.HP) { Player.HP += Player.MaxHP * Player.Level / 160; } else { Player.HP = Player.MaxHP; } Player.MaxHP += Player.MaxHP * Player.Level / 160; Player.Defence += Player.Defence * Player.Level / 180; Player.Speed += 0.01f; } //Add xp particles Random rand = new Random(); if (rand.Next(0, 22) > 20) { Particles.AddXP(Color.Blue, 255, Enemy.Rect, 5, 10f); } if (Enemy.Size >= 5) { //Other enemies Enemy.Size -= Enemy.Size / 80; Enemy.Rect = new RectangleF(Enemy.Rect.X + Enemy.Size / 160, Enemy.Rect.Y + Enemy.Size / 160, Enemy.Rect.Width, Enemy.Rect.Height); if (Enemy.Alpha >= 5) { Enemy.Alpha -= 2.7f; } Enemy.Colour = Color.FromArgb((int)Enemy.Alpha, Enemy.Colour); } else { //Enemy dead //Removes enemy Enemies.E.Remove(Enemy); Enemies.E.TrimExcess(); } } } else { Thread.Sleep(50); } } } } await Task.Delay(10); } }
public static void Collisions() { while (GraphicsDrawing.Running) { try { //Bullets ArrayList lock causing lag in this Collisions loop. foreach (Projectiles.Bullet Bullet in Projectiles.Bullets.ToList()) { //null value check if (Bullet == null) { continue; } foreach (Enemies.Enemy Enemy in Enemies.E.ToList()) { //null value check if (Enemy == null) { continue; } if (Enemy.HP >= 0) { if (new RectangleF(Bullet.Rect.X + UIElements.GraphicsOffset_X, Bullet.Rect.Y + UIElements.GraphicsOffset_Y, Bullet.Size, Bullet.Size) .IntersectsWith(new RectangleF(Enemy.Rect.X + UIElements.GraphicsOffset_X, Enemy.Rect.Y + UIElements.GraphicsOffset_Y, Enemy.Rect.Width, Enemy.Rect.Height))) { Random rand1 = new Random(); Random rand2 = new Random(); if (rand1.Next(1, 1001) <= Projectiles.Bullet_CritRate) { //Enemy taking crit damage Enemy.HP -= (Bullet.Damage + Player.DmgIncrease * Projectiles.Bullet_CritDamage) / Enemy.Defence; Particles.AddDmgNum(Color.Red, 255f, new PointF(Enemy.Rect.X, Enemy.Rect.Y), 10, ((Bullet.Damage * Projectiles.Bullet_CritDamage) / Enemy.Defence)); Particles.DmgNumCoolDown.Start(); } else { //Enemy taking normal damage Enemy.HP -= (Bullet.Damage + Player.DmgIncrease) / Enemy.Defence; Particles.AddDmgNum(Color.Black, 255f, new PointF(Bullet.Rect.X + Bullet.Size / 2, Bullet.Rect.Y + Bullet.Size / 2), 8, Bullet.Damage / Enemy.Defence); Particles.DmgNumCoolDown.Start(); } Bullet.Contact = true; //Bullet penetation value Bullet.Penetration -= 0.1f; if (Bullet.Penetration <= 0) { Projectiles.Bullets.Remove(Bullet); Projectiles.Bullets.TrimExcess(); } Random rand = new Random(); float size = rand.Next(3, 6); PointF vector; vector = Projectiles.Vector[rand.Next(0, 15)]; lock (Particles.BloodParticles) { //adds blood Particles.AddBlood(Color.Red, 255, new RectangleF(Bullet.Rect.X, Bullet.Rect.Y, size, size), 1, 1); //sets directional vector //vector is random vector value //bullet.dir moves blood in direction of bullet Particles.BloodParticles.ElementAtOrDefault(Particles.BloodParticles.Count - 1).DirX = vector.X * Projectiles.BloodSpread + Bullet.DirX * Projectiles.BulletInfluenceOnBlood; Particles.BloodParticles.ElementAtOrDefault(Particles.BloodParticles.Count - 1).DirY = vector.Y * Projectiles.BloodSpread + Bullet.DirY * Projectiles.BulletInfluenceOnBlood; } } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }