Esempio n. 1
0
        public XmasSnowflakeBranch(Boss boss, Sprite sprite) : base(sprite)
        {
            Speed = 1500f;
            _boss = boss;

            _canRushTimer = new CountdownTimer(1f + (_boss.Game.GameManager.Random.NextDouble() * 3f));
            _rushTimer    = new CountdownTimer(5f);
            _rushTimer.Stop();

            _rushing = false;
            _canRush = false;

            _angularSpeed = 2f + ((float)_boss.Game.GameManager.Random.NextDouble() * 3f);

            if (_boss.Game.GameManager.Random.NextDouble() > 0.5f)
            {
                _angularSpeed *= -1;
            }

            _destroyed = false;

            _canRushTimer.Completed += (sender, args) =>
            {
                _canRush = true;
                _rushTimer.Start();
            };

            _rushTimer.Completed += (sender, args) =>
            {
                if (!_destroyed && !TargetingPosition)
                {
                    RushToPlayer();
                }
            };

            Sprite.Origin = new Vector2(0.5f * Sprite.TextureRegion.Width, 0.5f * Sprite.TextureRegion.Height);

            // Physics
            var bbWidth         = sprite.TextureRegion.Width / 4f;
            var bbLocalPosition = new Vector2((sprite.TextureRegion.Width / 2f) - (bbWidth / 2f), 0f);
            var startX          = -sprite.TextureRegion.Width / 2f;
            var startY          = -sprite.TextureRegion.Height / 2f;
            var vertices        = new List <Vector2>()
            {
                new Vector2(startX, startY),
                new Vector2(startX + bbWidth, startY),
                new Vector2(startX + bbWidth, startY + sprite.TextureRegion.Height),
                new Vector2(startX, startY + sprite.TextureRegion.Height)
            };

            _boundingBox = new CollisionConvexPolygon(this, bbLocalPosition, vertices);
            _boss.AddHitBox(_boundingBox);

            _branchPlayerLine = new Line(Position(), _boss.GetPlayerPosition());
        }
Esempio n. 2
0
        public XmasCandyBar(Boss boss, CustomSpriterAnimator animator)
        {
            _boss     = boss;
            _animator = animator;

            _animator.Progress           = 0;
            _animator.Speed              = 1;
            _animator.AnimationFinished += AnimationFinishedHandler;

            _boundingBox = new SpriterCollisionConvexPolygon(this, "body2.png");
            _boss.AddHitBox(_boundingBox);

            _animator.Play("StretchInBorderMoving");
        }
Esempio n. 3
0
        protected override void LoadContent()
        {
            Sprite     = Game.Content.Load <Texture2D>(@"Graphics/Entities/enemy");
            _healthBar = Game.Content.Load <Texture2D>(@"Graphics/Pictures/pixel");
            Center     = new Vector2(Sprite.Width / 2f, Sprite.Height / 2f);

            // Audio
            if (_deadSound == null)
            {
                _deadSound = Game.Content.Load <SoundEffect>(@"Audio/SE/boss_dead");
            }

            List <Point> vertices = new List <Point>()
            {
                new Point(0, (int)(Sprite.Height / 2.74f)),
                new Point(Sprite.Width / 2, 0),
                new Point(Sprite.Width, (int)(Sprite.Height / 2.74f)),
                new Point(Sprite.Width / 2, Sprite.Height)
            };

            CollisionBox = new CollisionConvexPolygon(this, Vector2.Zero, vertices);

            Position = new Vector2(
                Config.GameArea.X / 2f,
                Config.GameArea.Y / 2f);

            //Get all the xml files
            foreach (var source in Directory.GetFiles(@"Content\XML", "*.xml", SearchOption.AllDirectories))
            {
                //store the name
                _patternNames.Add(source);

                //load the pattern
                BulletPattern pattern = new BulletPattern();
                pattern.ParseXML(source);
                _myPatterns.Add(pattern);
            }

            _currentPattern = GameplayScreen.Rand.Next(0, _patternNames.Count);
            AddBullet(true);

            base.LoadContent();
        }
Esempio n. 4
0
        public Laser(XmasHell game, Line line, float scale = 1f)
        {
            _game = game;
            _line = line;
            _used = true;

            LoadContent();
            _scale = new Vector2(scale, line.Distance() / _laserTexture.Height);

            var vertices = new List <Vector2>
            {
                Vector2.Zero,
                new Vector2(_laserTexture.Width, 0),
                new Vector2(_laserTexture.Width, _laserTexture.Height),
                new Vector2(0, _laserTexture.Height)
            };

            _hitbox = new CollisionConvexPolygon(this, -_origin, vertices);
            _game.GameManager.CollisionWorld.AddBossBulletHitbox(_hitbox);
        }
Esempio n. 5
0
        public Bullet(DnK game, Texture2D sprite, Vector2 position, Vector2 direction, float velocity)
            : base(game, sprite, position, direction, velocity)
        {
            Rotation  = 0;
            Center    = new Vector2(Sprite.Width / 2f, Sprite.Height / 2f);
            _distance = 0;

            WaveMode = false;

            List <Point> vertices = new List <Point>()
            {
                new Point(0, 0),
                new Point(sprite.Width, 0),
                new Point(sprite.Width, sprite.Height),
                new Point(0, sprite.Height),
            };

            CollisionBox = new CollisionConvexPolygon(this, Vector2.Zero, vertices);

            Power = Improvements.ShootPowerData[PlayerData.ShootPowerIndex].Key;
        }
Esempio n. 6
0
        public XmasCandyBar(Boss boss, Sprite sprite) : base(sprite)
        {
            _boss = boss;

            // Physics
            var bbWidth  = sprite.TextureRegion.Width;
            var startX   = -sprite.TextureRegion.Width / 2f;
            var startY   = -sprite.TextureRegion.Height / 2f;
            var vertices = new List <Vector2>()
            {
                new Vector2(startX, startY),
                new Vector2(startX + bbWidth, startY),
                new Vector2(startX + bbWidth, startY + sprite.TextureRegion.Height),
                new Vector2(startX, startY + sprite.TextureRegion.Height)
            };

            var relativePosition = new Vector2(0, sprite.TextureRegion.Height / 2f);

            _boundingBox = new CollisionConvexPolygon(this, relativePosition, vertices);
            _boss.Game.GameManager.CollisionWorld.AddBossHitBox(_boundingBox);
        }
Esempio n. 7
0
        // Create multiple collision boxes from BossStructure
        private void ComputeCollisionBoxes()
        {
            CollisionBoxes.Clear();
            _collisionBoxesHp.Clear();

            // TODO: Handle the case where there is 2 vertices with Y = 0
            var vertices       = _structure.GetVertices();
            var bottomVertices = new List <Vector2>(); // the lowest vertex for each step
            var topVertices    = new List <Vector2>(); // the highest vertex for each step
            var currentStep    = 0f;

            for (var i = 0; i < vertices.Length; i++)
            {
                // Bottom part
                if (vertices[i].Y >= 0)
                {
                    if (vertices[i].X > currentStep)
                    {
                        bottomVertices.Add(vertices[i - 1]);
                        bottomVertices.Add(vertices[i]);
                    }
                }
                // Top part
                else
                {
                    if (vertices[i].X < currentStep)
                    {
                        topVertices.Add(vertices[i - 1]);
                        topVertices.Add(vertices[i]);
                    }
                }

                currentStep = vertices[i].X;
            }

            if (bottomVertices.Count != topVertices.Count)
            {
                // Left part
                if (bottomVertices.First().Y.Equals(0f))
                {
                    topVertices.Add(vertices[vertices.Length - 1]);
                    topVertices.Add(bottomVertices.First());
                    topVertices.Reverse();
                }
                // Right part
                else if (bottomVertices.Last().Y.Equals(0f))
                {
                    topVertices.Reverse();
                    topVertices.Add(bottomVertices.Last());
                }
            }
            else
            {
                topVertices.Reverse();
            }

            if (bottomVertices.Count != topVertices.Count)
            {
                return;
            }

            for (var i = 1; i < bottomVertices.Count; i += 2)
            {
                var boxVertices = new List <Vector2>
                {
                    bottomVertices[i],
                    bottomVertices[i - 1],
                    topVertices[i - 1],
                    topVertices[i]
                };

                var collisionBox = new CollisionConvexPolygon(this, Vector2.Zero, boxVertices);
                CollisionBoxes.Add(collisionBox);
                _collisionBoxesHp.Add(collisionBox, 100f);
            }
        }
Esempio n. 8
0
        private void Split(CollisionConvexPolygon box)
        {
            var newPolygonShape = _structure.Split(box);
            var center          = box.GetCenterInWorldSpace();

            // TODO: Part is dead?
            // A boss part is dead when its center is dead?
            // or when the number of sub-parts is less than a number?
            if (center.X > (Size.X / 2f - 2 * _step) + Position.X - Origin.X &&
                center.X < (Size.X / 2f + 2 * _step) + Position.X - Origin.X)
            {
                TakeDamage(99999);
            }
            else
            {
                var boxLocalPosition = box.GetLocalPosition();

                // Left (1) or right (-1) part?
                var factor = (boxLocalPosition.X > Origin.X) ? 1 : -1;

                // If the break out part is not large enough => we don't create another part
                if (newPolygonShape.Vertices != null && newPolygonShape.GetArea() > Config.MinBossPartArea)
                {
                    var bossPart = new BossPart(
                        GameRef, _bossRef, _players, _moverManager, null, _color,
                        _health, 0, 25f, null, newPolygonShape
                        );

                    bossPart.Initialize();

                    var bossPartSize     = newPolygonShape.GetSize();
                    var boxWorldPosition = box.GetWorldPosition();

                    // Compute new boss part's world position
                    var worldPosition = Vector2.Zero;
                    worldPosition.Y = boxWorldPosition.Y - boxLocalPosition.Y;

                    // Left part
                    if (factor == 1)
                    {
                        worldPosition.X = boxWorldPosition.X - bossPartSize.X;
                    }
                    // Right part
                    else if (factor == -1)
                    {
                        worldPosition.X = boxWorldPosition.X + _step;
                    }

                    // Update world position according to parent rotation
                    bossPart.Scale    = Scale;
                    bossPart.Rotation = Rotation;

                    var newLocalPosition = Vector2.Zero;
                    newLocalPosition.X = (Position.X - Origin.X) + (boxLocalPosition.X);
                    newLocalPosition.Y = (Position.Y - Origin.Y);

                    if (factor == -1)
                    {
                        newLocalPosition.X -= bossPartSize.X;
                    }
                    else
                    {
                        newLocalPosition.X += _step;
                    }

                    var newOrigin = newPolygonShape.GetCenter();
                    newLocalPosition += newOrigin;

                    var rotationOrigin = Position;
                    newLocalPosition = Vector2.Transform(newLocalPosition - rotationOrigin, Matrix.CreateRotationZ(Rotation)) + rotationOrigin;

                    bossPart.Origin   = newOrigin;
                    bossPart.Position = newLocalPosition;
                    _bossRef.Parts.Add(bossPart);

                    // Give to this new BossPart an impulsion to (pseudo) random direction due to explosion
                    var random = (float)(GameRef.Rand.NextDouble() * (1f - 0.75f)) + 0.75f;
                    bossPart.ApplyImpulse(new Vector2(factor, random * factor), new Vector2(random / 5f));
                    ApplyImpulse(new Vector2(-factor, random * -factor), new Vector2(random / 5f));
                }

                // Remove destroyed bounding boxes
                if (factor == -1)
                {
                    CollisionBoxes.RemoveAll(bb => bb.GetCenter().X < boxLocalPosition.X);
                }
                else
                {
                    CollisionBoxes.RemoveAll(bb => bb.GetCenter().X > boxLocalPosition.X);
                }

                // This is the bounding that the player has destroyed, so we remove it from the list
                CollisionBoxes.Remove(box);
            }
        }
Esempio n. 9
0
        public PolygonShape Split(CollisionConvexPolygon collisionBox)
        {
            var collisionBoxCenter = collisionBox.GetCenter();
            var destroyAll         = false;

            /*
             * // TODO: This structure is dead only if its area is less than a specific number, not because its center is destroyed
             * // Structure is dead
             * if (collisionBoxCenter.X > (_size.X / 2f - 2 * _step) + _parent.Position.X - _parent.Origin.X &&
             *  collisionBoxCenter.X < (_size.X / 2f + 2 * _step) + _parent.Position.X - _parent.Origin.X)
             * {
             *  destroyAll = true;
             * }
             */

            // When we retrieve vertices, we need to transform them from world to local
            var newPolygonShapeVertices = new List <Vector2>();
            var newVertices             = _polygonShape.Vertices.ToList();

            if (!destroyAll)
            {
                // The part to remove is at left
                if (collisionBoxCenter.X < _size.X / 2f)
                {
                    var leftVertices = newVertices.FindAll(vertex => vertex.X <= collisionBoxCenter.X);

                    newPolygonShapeVertices.AddRange(leftVertices);

                    foreach (var vertex in leftVertices)
                    {
                        newVertices.Remove(vertex);
                    }

                    /*
                     * foreach (var box in CollisionBoxes)
                     * {
                     *  var center = box.GetCenter();
                     *
                     *  if (center.X <= minX + _parent.Position.X - _parent.Origin.X)
                     *  {
                     *      ParticleExplosion(center);
                     *      toDelete.Add(box);
                     *  }
                     * }
                     *
                     * foreach (var collisionElement in toDelete)
                     * {
                     *  var box = (CollisionConvexPolygon) collisionElement;
                     *  CollisionBoxes.Remove(box);
                     *  _leftCollisionBoxes.Remove(box);
                     * }
                     */
                }
                // The part to remove is at right
                else if (collisionBoxCenter.X > _size.X / 2f)
                {
                    var rightVertices = newVertices.FindAll(vertex => vertex.X >= collisionBoxCenter.X);

                    newPolygonShapeVertices.AddRange(rightVertices);

                    foreach (var vertex in rightVertices)
                    {
                        newVertices.Remove(vertex);
                    }

                    /*
                     * foreach (CollisionElement box in CollisionBoxes)
                     * {
                     *  var center = box.GetCenter();
                     *
                     *  if (center.X >= maxX + _parent.Position.X - _parent.Origin.X)
                     *  {
                     *      ParticleExplosion(center);
                     *      toDelete.Add(box);
                     *  }
                     * }
                     *
                     * foreach (var collisionElement in toDelete)
                     * {
                     *  var box = (CollisionConvexPolygon) collisionElement;
                     *  CollisionBoxes.Remove(box);
                     *  _rightCollisionBoxes.Remove(box);
                     * }
                     */
                }
            }

            /*
             * else
             * {
             *
             *  foreach (var center in CollisionBoxes.Select(box => box.GetCenter()))
             *  {
             *      ParticleExplosion(center);
             *  }
             *
             *  _leftCollisionBoxes.Clear();
             *  _rightCollisionBoxes.Clear();
             *  CollisionBoxes.Clear();
             * }
             */

            /*
             * var vertices = new List<Vector2>();
             * vertices.AddRange(_bottomLeftVertices);
             * vertices.AddRange(_bottomRightVertices);
             * vertices.AddRange(_topRightVertices);
             * vertices.AddRange(_topLeftVertices);
             */
            _polygonShape.UpdateVertices(newVertices.ToArray());

            /*
             * if (_leftCollisionBoxes.Contains(collisionBox))
             *  _leftCollisionBoxes.Remove(collisionBox);
             * else if (_rightCollisionBoxes.Contains(collisionBox))
             *  _rightCollisionBoxes.Remove(collisionBox);
             *
             * CollisionBoxes.Remove(collisionBox);
             */

            var newPolygonShapeVerticesArray = newPolygonShapeVertices.ToArray();

            if (newPolygonShapeVertices.Count > 0)
            {
                var newVerticesOriginPosition = newPolygonShapeVertices[0];
                for (int i = 0; i < newPolygonShapeVerticesArray.Length; i++)
                {
                    newPolygonShapeVerticesArray[i].X -= newVerticesOriginPosition.X;
                }
            }
            else
            {
                newPolygonShapeVerticesArray = null;
            }

            return(new PolygonShape(_gameRef, newPolygonShapeVerticesArray));
        }