Ejemplo n.º 1
0
        // Regions
        #region Collision

        /// Whether the entities are in collision or not
        private static Boolean inCollision(Entity e1, Entity e2)
        {
            float radius = e1.radius + e2.radius;

            // Both exist + Pythagoras circle detection
            return(!e1.isDestroyed && !e2.isDestroyed && Maths.Pythagoras(e1.position, e2.position, radius));
        }
Ejemplo n.º 2
0
        private static Vector2 spawnPoint()
        {
            Vector2 pos;

            do
            {
                pos = new Vector2(Maths.random.Next(10, (int)HeadWars.ScreenDimension.X - 10), Maths.random.Next(10, (int)HeadWars.ScreenDimension.Y - 10));
            } while (Maths.Pythagoras(pos, Player.Instance.position, enemyRange));

            return(pos);
        }
Ejemplo n.º 3
0
        /// Update
        public override void Update()
        {
            IEnumerable <Entity> entities = EntityManager.nearEntities(position, (float)attractionRange.Value, (float)playerAttractionRange.Value);

            foreach (Entity e in entities)
            {
                if (e is Enemy && (e as Enemy).isDestroyed)
                {
                    // Skips this loop
                    continue;
                }

                // Bullet = Repelled | Others = Attracted
                if (e is Bullet)
                {
                    e.velocity += (e.position - position).scaleTo(.3f);

                    // If the player is near, the sound is played
                    if (Maths.Pythagoras(position, Player.Instance.position, 120))
                    {
                        Sound.blackHoleRepelling.Play(.25f, Maths.random.RandomRange(-.2f, .2f), 0);
                    }
                }
                else
                {
                    Vector2 pos = position - e.position;
                    float   len = pos.Length();

                    e.velocity += pos.scaleTo(MathHelper.Lerp(2, 0, len / (e is Player ? (float)playerAttractionRange.Value : (float)attractionRange.Value)));

                    if (e is Player)
                    {
                        Sound.blackHoleAttracting.Play(.15f, Maths.random.RandomRange(-.2f, .2f), 0);
                    }
                }
            }

            if (explode)
            {
                existenceTime -= .1f;
                if (existenceTime <= 0)
                {
                    EntityManager.New(new Explosion(Graphic.explosion, position, 80f));

                    Sound.blackHoleExplosion.Play(.8f, Maths.random.RandomRange(-.2f, .2f), 0);

                    isDestroyed = true;
                }
            }
        }
Ejemplo n.º 4
0
        /// Handler
        static void CollisionHandler()
        {
            /*
             *      Enemy x Enemy = Push
             *      Enemy x Bullet = A, B Die
             *      Enemy x BlackHole = A Die
             *      Enemy x Player = B Die
             *      Enemy x Explosion = A Die/Push
             *      Enemy x Asteroid = A, B Die
             *      BlackHole x Bullet = A Die, B Push
             *      BlackHole x Player = B Die
             *      BlackHole x Asteroid = B Die
             *      Explosion x Player = B Die
             *      Explosion x Asteroid = B Push
             *      Asteroid x Bullet = A, B Die
             *      Asteroid x Player = A Die
             *      Asteroid x Asteroid = A, B Push
             */

            // Enemy x Enemy
            for (int i = 0; i < enemies.Count; i++)
            {
                for (int j = i + 1; j < enemies.Count; j++)
                {
                    if (inCollision(enemies[i], enemies[j]))
                    {
                        enemies[i].Push(enemies[j]);
                        enemies[j].Push(enemies[i]);
                    }
                }
            }

            foreach (Enemy e in enemies)
            {
                if (e.isWorking)
                {
                    // Enemy x Bullet
                    foreach (Bullet b in bullets)
                    {
                        if (inCollision(e, b))
                        {
                            e.onHit();
                            b.isDestroyed = true;
                        }
                    }

                    // Enemy x BlackHole
                    foreach (BlackHole b in blackholes)
                    {
                        if (inCollision(e, b))
                        {
                            e.onHit(true);
                            b.explode = true;
                        }
                    }

                    // Enemy x Player
                    if (!Player.Instance.isInvisible && inCollision(e, Player.Instance))
                    {
                        Player.Instance.Kill();
                        // Break because everything was destroyed
                        break;
                    }

                    // Enemy x Explosion (Closer = Kill, otherwise push)
                    foreach (Explosion x in explosions)
                    {
                        if (Maths.Pythagoras(x.position, e.position, 45))
                        {
                            if (Maths.Pythagoras(x.position, e.position, 25))
                            {
                                e.onHit(true);
                            }
                            else
                            {
                                e.Push(x);
                            }
                        }
                    }

                    // Enemy x Asteroid
                    foreach (Asteroid a in asteroids)
                    {
                        if (inCollision(e, a))
                        {
                            e.onHit(true);
                            a.inCollision(e);
                        }
                    }
                }
            }

            foreach (BlackHole b in blackholes)
            {
                // BlackHole x Bullet
                foreach (Bullet bu in bullets)
                {
                    if (inCollision(b, bu))
                    {
                        b.onHit();
                        bu.isDestroyed = true;
                    }
                }

                // BlackHole x Player
                if (!Player.Instance.isInvisible && inCollision(b, Player.Instance))
                {
                    Player.Instance.Kill();
                    // Break because everything was destroyed
                    break;
                }

                // BlackHole x Asteroid
                foreach (Asteroid a in asteroids)
                {
                    if (inCollision(b, a))
                    {
                        a.inCollision(a);
                    }
                }
            }

            foreach (Explosion e in explosions)
            {
                // Explosion x Player
                if (!Player.Instance.isInvisible && Maths.Pythagoras(e.position, Player.Instance.position, 45))
                {
                    if (SkillManager.skillData["explosion"].isActive)
                    {
                        Player.Instance.Push(e, 20);
                    }
                    else
                    {
                        Player.Instance.Kill();
                    }
                    break;
                }

                // Explosion x Bullet
                foreach (Bullet b in bullets)
                {
                    if (inCollision(e, b))
                    {
                        b.isDestroyed = true;
                    }
                }

                // Explosion x Asteroid
                foreach (Asteroid a in asteroids)
                {
                    if (Maths.Pythagoras(e.position, a.position, 60))
                    {
                        a.Push(e, 30);
                    }
                }
            }

            foreach (Asteroid a in asteroids)
            {
                // Asteroid x Bullet
                foreach (Bullet b in bullets)
                {
                    if (inCollision(a, b))
                    {
                        a.inCollision(b);
                        b.isDestroyed = true;
                    }
                }

                // Asteroid x Player
                if (!Player.Instance.isInvisible && inCollision(a, Player.Instance))
                {
                    a.inCollision(Player.Instance);
                    Player.Instance.Push(a);
                }
            }

            // Asteroid x Asteroid
            for (int i = 0; i < asteroids.Count; i++)
            {
                for (int j = i + 1; j < asteroids.Count; j++)
                {
                    if (inCollision(asteroids[i], asteroids[j]))
                    {
                        asteroids[i].Push(asteroids[j]);
                        asteroids[j].Push(asteroids[i]);
                    }
                }
            }
        }
Ejemplo n.º 5
0
 /// Get close entities
 public static IEnumerable <Entity> nearEntities(Vector2 pos, float r, float playerR)
 {
     return(entities.Where(e => Maths.Pythagoras(pos, e.position, (e is Player ? playerR : r))));
 }