public static void HandleCollision(Mario mario, Block collidingBlock, ref Collection <IGameObject> collidingGameObjects)
        {
            if (mario.state is DeadMarioState)
            {
                return;
            }
            Rectangle          marioRectangle          = mario.GetSizeRectangle();
            Rectangle          marioLargeRectangle     = mario.GetLargeSizeRectangle();
            Rectangle          blockRectangle          = collidingBlock.GetSizeRectangle();
            CollisionDirection direction               = DetectCollisionDirection(marioRectangle, blockRectangle);
            CollisionDirection directionLargeRectangle = DetectCollisionDirection(marioLargeRectangle, blockRectangle);

            if (directionLargeRectangle != CollisionDirection.NoCollision)
            {
                collidingGameObjects.Add(collidingBlock);
            }
            if (!(direction is CollisionDirection.NoCollision) && !(collidingBlock.state is HiddenBlockState))
            {
                if (direction is CollisionDirection.Top)
                {
                    mario.Position = new Vector2(mario.Position.X, collidingBlock.GetSizeRectangle().Y - mario.GetSizeRectangle().Height);
                    mario.state.ToIdle();
                    mario.isOnGround = true;
                }
                else if (direction is CollisionDirection.Right)
                {
                    mario.Position   = new Vector2(collidingBlock.GetSizeRectangle().X + collidingBlock.GetSizeRectangle().Width, mario.Position.Y);
                    mario.isOnGround = false;
                }
                else if (direction is CollisionDirection.Left)
                {
                    mario.Position   = new Vector2(collidingBlock.GetSizeRectangle().X - mario.GetSizeRectangle().Width, mario.Position.Y);
                    mario.isOnGround = false;
                }
                else if (direction is CollisionDirection.Bottom)
                {
                    mario.Position = new Vector2(mario.Position.X, collidingBlock.GetSizeRectangle().Y + collidingBlock.GetSizeRectangle().Height);
                    if (mario.state.isBig() || !(collidingBlock.state is BrickBlockState))
                    {
                        collidingBlock.GetHit();
                        SoundFactory.Instance.playBreakBlockSoundEffect();
                    }
                    else
                    {
                        collidingBlock.GetBump();
                        SoundFactory.Instance.playBumpBlockSoundEffect();
                    }
                    mario.physics.ApplyForce(new Vector2(ConstantNumber.BLOCK_BOUNCE_X, ConstantNumber.BLOCK_BOUNCE_Y));
                }
            }

            if ((direction is CollisionDirection.Bottom) && (collidingBlock.state is HiddenBlockState) && mario.physics.Velocity.Y < 0)
            {
                collidingBlock.GetHit();
                SoundFactory.Instance.playBreakBlockSoundEffect();
            }
        }
Exemple #2
0
        public static void HandleCollision(Mario mario, Pipe collidingPipe, ref Collection <IGameObject> collidingGameObjects)
        {
            if (mario.state.isDead())
            {
                return;
            }
            Rectangle marioRectangle      = mario.GetSizeRectangle();
            Rectangle marioLargeRectangle = mario.GetLargeSizeRectangle();

            if (collidingPipe is IPipe pipe)
            {
                Rectangle pipeRectangle = pipe.GetSizeRectangle();

                CollisionDirection direction = CollisionDetection.DetectCollisionDirection(marioRectangle, pipeRectangle);
                CollisionDirection directionLargeRectangle = CollisionDetection.DetectCollisionDirection(marioLargeRectangle, pipeRectangle);
                if (directionLargeRectangle != CollisionDirection.NoCollision)
                {
                    collidingGameObjects.Add(collidingPipe);
                }
                if (!(direction is CollisionDirection.NoCollision))
                {
                    if (direction is CollisionDirection.Top)
                    {
                        mario.Position = new Vector2(mario.Position.X, pipe.GetSizeRectangle().Y - mario.GetSizeRectangle().Height);
                        collidingGameObjects.Add(pipe);
                        mario.state.ToIdle();
                    }
                    else if (direction is CollisionDirection.Left)
                    {
                        mario.Position = new Vector2(pipe.GetSizeRectangle().X - mario.GetSizeRectangle().Width, mario.Position.Y);
                    }
                    else if (direction is CollisionDirection.Right)
                    {
                        mario.Position = new Vector2(pipe.GetSizeRectangle().X + pipe.GetSizeRectangle().Width, mario.Position.Y);
                    }
                    else if (direction is CollisionDirection.Bottom)
                    {
                        mario.Position = new Vector2(mario.Position.X, pipe.GetSizeRectangle().Y + pipe.GetSizeRectangle().Height);
                    }
                }
            }
        }
        public static void HandleCollision(Game1 game, Mario mario, IItem collidingItem, ref Collection <IGameObject> collidingGameObjects)
        {
            if (mario.state.isDead())
            {
                return;
            }
            Rectangle marioRectangle      = mario.GetSizeRectangle();
            Rectangle marioLargeRectangle = mario.GetLargeSizeRectangle();

            if (collidingItem is IItem item)
            {
                Rectangle          itemRectangle           = item.GetSizeRectangle();
                CollisionDirection direction               = CollisionDetection.DetectCollisionDirection(marioRectangle, itemRectangle);
                CollisionDirection directionLargeRectangle = CollisionDetection.DetectCollisionDirection(marioLargeRectangle, itemRectangle);

                if (!(direction is CollisionDirection.NoCollision) || !(directionLargeRectangle is CollisionDirection.NoCollision))
                {
                    if (item is FireFlowerItem)
                    {
                        FireFlowerItem temp = (FireFlowerItem)item;
                        if (temp.triggered)
                        {
                            game.HUD.GetScore(ConstantNumber.SCORE_1000);
                            mario.Evolve();
                            SoundFactory.Instance.playPowerUpSoundEffect();
                            item.Disappear();
                        }
                        else
                        {
                            if (direction is CollisionDirection.Bottom)
                            {
                                item.GetTrigger();
                                SoundFactory.Instance.playVineSoundEffect();
                            }
                        }
                    }
                    if (item is MushroomItem)
                    {
                        MushroomItem temp = (MushroomItem)item;
                        if (temp.triggered)
                        {
                            game.HUD.GetScore(ConstantNumber.SCORE_1000);
                            mario.Evolve();
                            SoundFactory.Instance.playPowerUpSoundEffect();
                            item.Disappear();
                        }
                        else
                        {
                            if (direction is CollisionDirection.Bottom)
                            {
                                item.GetTrigger();
                                SoundFactory.Instance.playVineSoundEffect();
                            }
                        }
                    }
                    if (item is PoisonMushroomItem)
                    {
                        PoisonMushroomItem temp = (PoisonMushroomItem)item;
                        if (temp.triggered)
                        {
                            mario.TakeDamage();
                            SoundFactory.Instance.playTakeDamageSoundEffect();
                            item.Disappear();
                        }
                        else
                        {
                            item.GetTrigger();
                            SoundFactory.Instance.playVineSoundEffect();
                        }
                    }
                    if (item is StarItem)
                    {
                        StarItem temp = (StarItem)item;
                        if (temp.triggered)
                        {
                            game.HUD.GetScore(ConstantNumber.SCORE_1000);
                            mario.ToStar();
                            SoundFactory.Instance.playStarMaioSong();
                            item.Disappear();
                        }
                        else
                        {
                            if (direction is CollisionDirection.Bottom)
                            {
                                item.GetTrigger();
                                SoundFactory.Instance.playVineSoundEffect();
                            }
                        }
                    }

                    if (item is CoinItem)
                    {
                        CoinItem temp = (CoinItem)item;
                        if (!temp.consumed)
                        {
                            if (temp.inBlock)
                            {
                                if (direction is CollisionDirection.Bottom)
                                {
                                    item.GetTrigger();
                                    SoundFactory.Instance.playCoinSoundEffect();
                                    game.HUD.GetCoin();
                                }
                            }
                            else
                            {
                                item.GetTrigger();
                                SoundFactory.Instance.playCoinSoundEffect();
                                game.HUD.GetCoin();
                            }
                        }
                    }

                    if (item is FlagPole flag)
                    {
                        flag.GetTrigger();
                        Game1.Instance.DisableUserControl();
                        Game1.Instance.LoadBasicCommand();
                        mario.Position = new Vector2(flag.GetSizeRectangle().X - mario.GetSizeRectangle().Width, mario.Position.Y);
                        mario.ToCreepDown();
                        SoundFactory.Instance.playFlagpoleSoundEffect();
                        if (flag.flagFallTime < 0 || collidingGameObjects.Count > 0)
                        {
                            mario.Position = new Vector2(flag.GetSizeRectangle().X - ConstantNumber.FlAG_POSITION_X_ADJUST + mario.GetSizeRectangle().Width, mario.Position.Y);
                            mario.ToLeft();
                            if (mario.standingTime < 0)
                            {
                                mario.ToRight();

                                mario.ReachDestination = true;
                            }
                            mario.standingTime--;
                        }
                    }
                }
            }
        }