Пример #1
0
        public static void DetectCollision(FireballObject fireball)
        {
            List <IGameObject> gameObjects = new List <IGameObject>(Game1.Instance.currentState.Level.GetObjects());

            gameObjects.AddRange(Game1.Instance.currentState.Level.BigFloorRectangles);
            List <IEnemy> enemies           = new List <IEnemy>(Game1.Instance.currentState.Level.GetEnemies());
            Rectangle     fireballRectangle = fireball.GetHitBox();

            foreach (IGameObject collidedObject in gameObjects)
            {
                Rectangle collidedObjectRectangle = collidedObject.GetHitBox();
                if (fireballRectangle.Intersects(collidedObjectRectangle))
                {
                    if (collidedObject is IBlock)
                    {
                        FireballBlockCollisionResponder.FireballCollideWithBlock(fireball, collidedObject);
                    }
                    else if (collidedObject is IPipe)
                    {
                        FireballPipeCollisionResponder.FireballCollideWithPipe(fireball, (IPipe)collidedObject, Game1.Instance.currentState.Level);
                    }
                }
            }
            foreach (IEnemy enemy in enemies)
            {
                Rectangle enemyRectangle = enemy.GetHitBox();
                if (fireballRectangle.Intersects(enemyRectangle))
                {
                    Game1.Instance.currentState.Level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y));
                    FireballEnemyCollisionResponder.FireballCollideWithEnemy(fireball, enemy);
                }
            }
        }
        public static void FireballCollideWithBlock(FireballObject fireball, IGameObject block)
        {
            Level      level             = Game1.Instance.currentState.Level;
            Rectangle  fireballRectangle = fireball.GetHitBox();
            Rectangle  blockRectangle    = block.GetHitBox();
            IBlock     castBlock         = (IBlock)block;
            ICollision collisionSide     = CollisionSideDetector.DetectCollisionSide(fireballRectangle, blockRectangle);

            if (castBlock.State is HiddenItemBlockState)
            {
                return;
            }

            if (collisionSide is TopCollision)
            {
                fireball.Position = new Vector2(fireball.Position.X, fireball.Position.Y - collisionSide.CollisionIntersection.Height);
                fireball.BounceOffGround();
            }
            else if (collisionSide is RightCollision)
            {
                level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y));
                fireball.Explode();
            }
            else if (collisionSide is LeftCollision)
            {
                level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y));
                fireball.Explode();
            }
            else if (collisionSide is BottomCollision)
            {
                level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y));
                fireball.PhysicsObject.dy = 10.0F;
            }
        }
        public static void FireballCollideWithPipe(FireballObject fireball, IPipe pipe, Level level)
        {
            Rectangle  fireballRectangle = fireball.GetHitBox();
            Rectangle  pipeRectangle     = pipe.GetHitBox();
            ICollision collisionSide     = CollisionSideDetector.DetectCollisionSide(fireballRectangle, pipeRectangle);

            if (collisionSide is TopCollision)
            {
                fireball.BounceOffGround();
            }
            else
            {
                level.AddObject(new FireballExpolsion((int)fireball.Position.X, (int)fireball.Position.Y));
                fireball.Explode();
            }
        }