Example #1
0
        public void Collided(Collision collision, World world, Particles particles)
        {
            var go = collision.GameObject;

            if (go is Rocket || go is PlasmaBullet)
            {
                for (int h = 0; h < 100; h++)
                    particles.Emit(ParticleManager.Explosion, (go.Position + Position) / 2f, Chaos.GetVector2InCircle(3f));
                if (go is Rocket)
                    HP -= 7;
                else
                    HP -= 3;
                if (HP <= 0)
                    IsDestroyed = true;
            }

            if (go is Asteroid)
            {
                if (collision.Time > 0)
                    Response.Apply(this, collision);
                for (int i = 0; i < collision.GameObject.Collisions.Count; i++)
                    if (collision.GameObject.Collisions[i].GameObject == this)
                    {
                        CollisionPool.Instance.PutObject(collision.GameObject.Collisions[i]);
                        collision.GameObject.Collisions[i] = null;
                    }
                collision.GameObject.Collisions.RemoveAll(c => c == null);
            }
        }
Example #2
0
 public Ship CreateShip(Vector2 position, World world)
 {
     Ship ship = _ships.GetObject();
     ship.Reset(position, world);
     AddObject(ship);
     return ship;
 }
Example #3
0
 public EnemyShip CreateEnemyShip(Vector2 position, World world, Ship target)
 {
     EnemyShip enemyShip = _enemyShips.GetObject();
     enemyShip.Reset(position, world, target);
     AddObject(enemyShip);
     return enemyShip;
 }
Example #4
0
        public void Reset(Vector2 position, World world, Ship target)
        {
            _target = target;
            base.Reset(position, world);

            _weapon = new PlasmaGun(this);
        }
Example #5
0
 public virtual void Update(World world, Particles particles)
 {
     Position += Speed;
     Position = new Vector2(
         (Position.X + Game.WorldWidth) % Game.WorldWidth,
         (Position.Y + Game.WorldHeight) % Game.WorldHeight);
     Rotation += RotationSpeed;
 }
Example #6
0
 public override void Update(World world, Particles particles)
 {
     base.Update(world, particles);
     if (_state >= 1f) { IsDestroyed = true; return; }
     Size = Lerp.OfFloat(_particleParameters.Sizes, _state * (_particleParameters.Sizes.Length - 1));
     Color = Lerp.OfColor(_particleParameters.Colors, _state * (_particleParameters.Colors.Length - 1));
     Alpha = Lerp.OfFloat(_particleParameters.Alphas, _state * (_particleParameters.Alphas.Length - 1));
     _state += _step;
 }
Example #7
0
        public void Reset(Vector2 position, World world)
        {
            DrawHP = true;
            _world = world;

            _weapon = new SinGun(this);
            _weaponAlt = new RocketLauncher(this);

            Mass = 20f;
            Position = position;
            Size = 48;
        }
Example #8
0
 public void Update(World world, Particles particles)
 {
     for (int i = 0; i < _particles.Count; i++)
     {
         _particles[i].Update(world, particles);
         if ((_particles[i]).IsDestroyed)
         {
             _particlePool.PutParticle((Particle)_particles[i]);
             _particles[i] = null;
         }
     }
     _particles.RemoveAll(p => p == null);
 }
Example #9
0
 public void Update(World world, Particles particles)
 {
     for (int i = 0; i < _gameObjects.Count; i++)
     {
         var obj = _gameObjects[i];
         obj.Update(world, particles);
         if (obj.IsDestroyed)
         {
             obj.ResetGameObject();
             Game.Objects.ReleaseObject(obj);
             _gameObjects[i] = null;
         }
     }
     _gameObjects.RemoveAll(o => o == null);
 }
Example #10
0
        public static void Detect(List<GameObject>[,] clusters, World gameObjects)
        {
            for (int k = 0; k < gameObjects.Count; k++)
            {
                for (int i = 0; i < gameObjects[k].Collisions.Count; i++)
                    CollisionPool.Instance.PutObject(gameObjects[k].Collisions[i]);
                gameObjects[k].Collisions.Clear();
            }

            int ww = clusters.GetLength(1);
            int wh = clusters.GetLength(0);

            // обход по кластерам
            for (int wj = 0; wj < wh; wj++)
                for (int wi = 0; wi < ww; wi++)
                {
                    // обход по окресности кластера 3x3
                    for (int k = 0; k < 5; k++)
                    {
                        int di = 0;
                        int dj = 0;
                        switch (k)
                        {
                            case 0: di = 0; dj = 0; break;
                            case 1: di = 1; dj = -1; break;  // . . 1
                            case 2: di = 1; dj = 0; break;   // . 0 2
                            case 3: di = 1; dj = 1; break;   // . 4 3
                            case 4: di = 0; dj = 1; break;
                        }
                        int clui = (wi + di + ww) % ww;
                        int cluj = (wj + dj + wh) % wh;
                        float fx = (wi + di - clui) * Game.ClusterSize;
                        float fy = (wj + dj - cluj) * Game.ClusterSize;
                        // обсчёт столкновений 9 кластеров
                        for (int j = 0; j < clusters[cluj, clui].Count; j++)
                            for (int i = k == 0 ? j : 0; i < clusters[wj, wi].Count; i++)
                            {
                                if (cluj == wj && clui == wi && i == j)  // skip self
                                    continue;
                                var go1 = clusters[cluj, clui][j];
                                var go2 = clusters[wj, wi][i];
                                float dx = go2.Position.X - go1.Position.X - fx;
                                float dy = go2.Position.Y - go1.Position.Y - fy;
                                float dv = go2.Speed.X - go1.Speed.X;
                                float du = go2.Speed.Y - go1.Speed.Y;
                                float rr = go2.Size / 2 + go1.Size / 2;
                                if (dv == 0f || du == 0f)
                                {
                                    float ol2 = rr * rr - dx * dx - dy * dy;
                                    if (ol2 > 0)
                                    {
                                        go1.Collisions.Add(CollisionPool.Instance.GetObject(go2, ol2, 0f, new Vector2(dx, dy)));
                                        go2.Collisions.Add(CollisionPool.Instance.GetObject(go1, ol2, 0f, new Vector2(-dx, -dy)));
                                    }
                                }
                                else
                                {
                                    float a = dv * dv + du * du;
                                    float b = 2f * (dv * dx + du * dy);
                                    float c = dx * dx + dy * dy - rr * rr;
                                    float disc = b * b - 4f * a * c;
                                    if (disc < 0)
                                        continue;
                                    float t1 = (-b + Maf.Sqrt(disc)) / (2f * a);
                                    float t2 = (-b - Maf.Sqrt(disc)) / (2f * a);

                                    float min = Math.Min(t1, t2);
                                    float max = Math.Max(t1, t2);

                                    float ol2 = rr * rr - dx * dx - dy * dy;
                                    if (min < 1f && max >= 0f)
                                    {
                                        go1.Collisions.Add(CollisionPool.Instance.GetObject(go2, ol2, min, new Vector2(dx, dy)));
                                        go2.Collisions.Add(CollisionPool.Instance.GetObject(go1, ol2, min, new Vector2(-dx, -dy)));
                                    }
                                }
                            }
                    }
                }
        }
Example #11
0
        public override void Update(World world, Particles particles)
        {
            _weapon.Update(_world);
            _weaponAlt.Update(_world);
            foreach (var col in Collisions)
                Collided(col, world, particles);
            if (_speedBonusTime > 0)
            {
                _boost = 2.0f;
                _speedBonusTime--;
                if (_acceleration > 0)
                    particles.Emit(ParticleManager.EngineNitro, Position - new Vector2(10f * Maf.Sin(Rotation), -10f * Maf.Cos(Rotation)), Speed - _acceleration * new Vector2(8f * Maf.Sin(Rotation), -8f * Maf.Cos(Rotation)) + Chaos.GetVector2InCircle());
            }
            else
            {
                _boost = 1.0f;
                if (_acceleration > 0)
                    particles.Emit(ParticleManager.EngineFire, Position - new Vector2(10f * Maf.Sin(Rotation), -10f * Maf.Cos(Rotation)), Speed - _acceleration * new Vector2(8f * Maf.Sin(Rotation), -8f * Maf.Cos(Rotation)) + Chaos.GetVector2InCircle());
            }

            base.Update(world, particles);
            Speed *= .99f;
        }
Example #12
0
 private void Collided(Collision col, World world, Particles particles)
 {
     if (col.GameObject is SpeedBonus)
     {
         _speedBonusTime = 1000;
     }
     if (col.GameObject is Medkit)
         HP = MaxHP;
     if (col.GameObject is PlasmaBullet)
         HP -= 3;
     if (col.GameObject is Rocket)
         HP -= 7;
     if (HP <= 0)
     {
         var t = this.GetType();
         Game.WinShip(t);
         for (int i = 0; i < _world.Count; i++)
         {
             var ship = _world[i] as Ship;
             if (ship != null && ship.HP < 0)
             {
                 ship.HP = ship.MaxHP;
                 ship.Position = Chaos.GetVector2InRectangle(Game.WorldWidth, Game.WorldHeight);
             }
         }
     }
 }
Example #13
0
 private void Collided(Collision col, World world, Particles particles)
 {
     if (col.GameObject is Ship)
         IsDestroyed = true;
 }
Example #14
0
 public override void Update(World world, Particles particles)
 {
     foreach (var col in Collisions)
         Collided(col, world, particles);
     base.Update(world, particles);
 }
Example #15
0
        public override void Update(World world, Particles particles)
        {
            var d_pos = _target.Position - Position;
            float dx = ((d_pos.X + Game.WorldWidth / 2) % Game.WorldWidth) - Game.WorldWidth / 2;
            float dy = ((d_pos.Y + Game.WorldHeight / 2) % Game.WorldHeight) - Game.WorldHeight / 2;

            var directionTargetBegin = new Vector2(dx, dy);
            var nrm_directionTargetBegin = directionTargetBegin;
            nrm_directionTargetBegin.Normalize();

            //var time_Speed = directionTarget.Length()
            //    / (
            //        Vector2.Dot(_target.Speed, new Vector2(-nrm_directionTarget.X, -nrm_directionTarget.Y))
            //        + Vector2.Dot(Speed, nrm_directionTarget)
            //    );

            //var directionTargetEnd = directionTargetBegin * Speed / (Speed - _target.Speed);
            //var nrm_directionTargetEnd = directionTargetEnd;
            //nrm_directionTargetEnd.Normalize();

            var time_weapon = directionTargetBegin.Length() / (_weapon.Speed + Vector2.Dot(Speed, nrm_directionTargetBegin));

            TargetPos = _target.Position + time_weapon * (_target.Speed - Speed);

            var t = directionTargetBegin - time_weapon * (Speed - _target.Speed);
            float ang = Maf.Atan2(t.Y, t.X);

            Rotation = ang + MathHelper.PiOver2;

            var dir = new Vector2(Maf.Cos(ang), Maf.Sin(ang));
            var nrm = new Vector2(dir.Y, -dir.X);
            var accel = Vector2.Dot(nrm_directionTargetBegin, dir);
            var strafe = Vector2.Dot(nrm_directionTargetBegin, nrm);

            //var distanceVector = new Vector2(directionTarget.X - time_Speed * (Speed.X - _target.Speed.X), directionTarget.Y - time_Speed * (Speed.Y - _target.Speed.Y));

            float distance_length = (directionTargetBegin).Length();
            //if (HP < (MaxHP / 2))
            //{
            //    ;
            //}
            //else
            if (distance_length > 600.0f)
            {
                SpeedUp(accel);
                Strafe(strafe);
                //ShootAlt(Input.InputDigitalState.Released);
            }
            else if (distance_length > 400.0f)
            {
                _strafe = Chaos.GetFloat(-.2f, .2f);
                _accel = Chaos.GetFloat(-.05f, .05f);
                SpeedUp(0.4f * accel);
                Strafe(0.4f * strafe);
                //Shoot(Input.InputDigitalState.Released);
            }
            else if (distance_length < 200.0f)
            {
                _strafe = Chaos.GetFloat(-.2f, .2f);
                _accel = Chaos.GetFloat(-.05f, .05f);
                SpeedUp(-0.2f * accel);
                Strafe(-0.2f * strafe);
                //Shoot(Input.InputDigitalState.Pressed);
            }
            else if (distance_length < 100.0f)
            {
                SpeedUp(-accel);
                Strafe(-strafe);
                //Shoot(Input.InputDigitalState.Pressed);
            }
            else
            {
                SpeedUp(_accel);
                Strafe(_strafe);
                //ShootAlt(Input.InputDigitalState.Pressed);
            }

            Shoot(Input.InputDigitalState.Pressed);

            base.Update(world, particles);
        }