Beispiel #1
0
        public void TestCollision(ITangible dyn, ITangible obj)
        {
            CollisionFrom direction = CollisionDirection(dyn, obj);

            if (direction != CollisionFrom.None)
            {
                collisions.Add(new Tuple <ITangible, ITangible, CollisionFrom>(dyn, obj, direction));
            }
        }
Beispiel #2
0
        public CollisionFrom CollisionDirection(ITangible obj1, ITangible obj2)
        {
            if (!level.camera.IsInView(obj1) || !level.camera.IsInView(obj2))
            {
                return(CollisionFrom.None);
            }

            CollisionFrom direction = CollisionFrom.None;

            for (double i = HotDAMN.COLLISION_RESOLUTION; i <= 1.0 && direction == CollisionFrom.None; i += HotDAMN.COLLISION_RESOLUTION)
            {
                Rectangle r1 = TweenRectangles(obj1.Hitbox.hitboxThen, obj1.Hitbox.hitboxNow, i);
                Rectangle r2 = TweenRectangles(obj2.Hitbox.hitboxThen, obj2.Hitbox.hitboxNow, i);

                Rectangle zone = Rectangle.Intersect(r1, r2);

                if (zone.IsEmpty)
                {
                    continue;
                }

                if (zone.Width + 2 < zone.Height)
                {
                    if ((zone.Left + zone.Right) / 2 < (r1.Left + r1.Right) / 2)
                    {
                        return(CollisionFrom.Left);
                    }
                    else
                    {
                        return(CollisionFrom.Right);
                    }
                }
                else
                {
                    if ((zone.Top + zone.Bottom) / 2 < (r1.Top + r1.Bottom) / 2)
                    {
                        return(CollisionFrom.Above);
                    }
                    else
                    {
                        return(CollisionFrom.Below);
                    }
                }
            }
            return(CollisionFrom.None);
        }
Beispiel #3
0
        public void Update()
        {
            levelTransition = new List <String>();
            collisions      = new List <Tuple <ITangible, ITangible, CollisionFrom> >();

            ThreadedCollisionDetection(0);

            foreach (Tuple <ITangible, ITangible, CollisionFrom> t in collisions)
            {
                ActuallyPerformCollision(t);
            }

            BlockPipe wall = new BlockPipe(
                null,
                200 * HotDAMN.SCREEN_BOUNDARY_OFFSET + (HotDAMN.WINDOW_HEIGHT / HotDAMN.GRID),
                false,
                level.camera.Viewport.Left - Hitboxes.PIPE_WIDTH + HotDAMN.SCREEN_MARIO_CUSION,
                -HotDAMN.SCREEN_BOUNDARY_OFFSET
                );
            CollisionFrom direction = CollisionDirection(level.player, wall);

            if (direction != CollisionFrom.None)
            {
                level.player.CollisionHandler.CollisionLeft(wall);
            }
            wall = new BlockPipe(
                null,
                200 * HotDAMN.SCREEN_BOUNDARY_OFFSET + (HotDAMN.WINDOW_HEIGHT / HotDAMN.GRID),
                false,
                level.camera.Viewport.Right - HotDAMN.SCREEN_MARIO_CUSION,
                -HotDAMN.SCREEN_BOUNDARY_OFFSET
                );
            direction = CollisionDirection(level.player, wall);
            if (direction != CollisionFrom.None)
            {
                level.player.CollisionHandler.CollisionRight(wall);
            }

            level.RemoveInactives(dynamics);
            level.RemoveInactives(statics);
        }
Beispiel #4
0
        public void ActuallyPerformCollision(Tuple <ITangible, ITangible, CollisionFrom> tuple)
        {
            ITangible     dyn       = tuple.Item1;
            ITangible     obj       = tuple.Item2;
            CollisionFrom direction = tuple.Item3;

            switch (direction)
            {
            case CollisionFrom.Above:
                dyn.CollisionHandler.CollisionAbove(obj);
                obj.CollisionHandler.CollisionBelow(dyn);
                break;

            case CollisionFrom.Below:
                dyn.CollisionHandler.CollisionBelow(obj);
                obj.CollisionHandler.CollisionAbove(dyn);
                break;

            case CollisionFrom.Left:
                dyn.CollisionHandler.CollisionLeft(obj);
                obj.CollisionHandler.CollisionRight(dyn);
                break;

            case CollisionFrom.Right:
                dyn.CollisionHandler.CollisionRight(obj);
                obj.CollisionHandler.CollisionLeft(dyn);
                break;

            default:
                break;
            }

            if (obj is LevelTransitionPoint && dyn is IPlayer && direction != CollisionFrom.None)
            {
                String go = ((LevelTransitionPoint)obj).Go;
                if (levelTransition.Contains(go) && ((LevelTransitionPoint)obj).IsCorrectDirection((IPlayerState)(dyn.State)))
                {
                    if (((IPlayer)dyn).AutoMove != null)
                    {
                        ((IPlayer)dyn).AutoMove.IsActive = false;
                    }
                    HUD.MARIO_STATE[HUD.currentPlayer] = (IPlayerState)(dyn.State);
                    int time = HUD.TIME;
                    if (go.IndexOf(HotDAMN.TAG_SUBLEVEL) == -1 && go.IndexOf(HotDAMN.TAG_NAME) == -1)
                    {
                        level.game.state = new SLevelIntro(level.game, go);
                    }
                    else
                    {
                        level.game.state = new SInLevel(level.game, go);
                    }
                    SoundPanel.PlaySoundEffect(Sound.pipeEffect);
                    HUD.TIME = time;
                }
                else
                {
                    levelTransition.Add(go);
                }
            }
            if (((dyn is FlagpoleFlag && obj is IPlayer) ||
                 (obj is FlagpoleFlag && dyn is IPlayer)) &&
                direction != CollisionFrom.None
                )
            {
                level.game.state = new SLevelComplete(level.game, ((SInLevel)level.game.state));
            }
            if (((dyn is Axe && obj is IPlayer) ||
                 (obj is Axe && dyn is IPlayer)) &&
                direction != CollisionFrom.None
                )
            {
                level.game.state = new SCastleComplete(level.game, ((SInLevel)level.game.state));
            }
        }