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