示例#1
0
        public override void Update()
        {
            base.Update();

            if (StarTimer > 0)
            {
                StarTimer--;
            }
            if (DamageTimer > 0)
            {
                DamageTimer--;
            }
            if (PowerUpTimer > 0)
            {
                PowerUpTimer--;
            }
            if (JumpTimer > 0 && IsGrounded)
            {
                JumpTimer--;
            }
            if (JumpTimer == 0)
            {
                JumpNumber = 0;
            }
            if (Position.Y < 0)
            {
                Kill(); return;
            }
            if (IsGrounded)
            {
                pointStreak = 0;
            }


            if (ActionState == MarioActionState.Crouching)
            {
                int leftCoord  = (int)Math.Floor(Position.X);
                int rightCoord = (int)Math.Ceiling(Position.X + Width);
                int yCoord     = (int)Math.Floor(Position.Y) - 1;

                PipeTileEntity te = world.GetTileEntityAt <PipeTileEntity>(leftCoord, yCoord);
                if (te != null)
                {
                    GoThroughPipe(te, Direction.Down);
                }
                else
                {
                    te = world.GetTileEntityAt <PipeTileEntity>(rightCoord, yCoord);
                    if (te != null)
                    {
                        GoThroughPipe(te, Direction.Down);
                    }
                }
            }

            UpdateStates();
        }
示例#2
0
        public override void OnCollision(int x, int y, ICollidable obj, Direction dir, World world)
        {
            base.OnCollision(x, y, obj, dir, world);

            if (obj is Mario && dir != Direction.Up)
            {
                PipeTileEntity te = world.GetTileEntityAt <PipeTileEntity>(x, y);
                if (te != null && dir == te.TransitionDirection)
                {
                    (obj as Mario).GoThroughPipe(te, dir.Reverse());
                }
            }
        }
示例#3
0
        public void GoThroughPipe(PipeTileEntity pte, Direction inDir)
        {
            if (!Visible)
            {
                return;
            }
            Visible = false;
            Direction outDir = Direction.None;
            int       destx  = pte.TransitionX;
            int       desty  = pte.TransitionY;

            if (world.GetBlockAt(destx + 1, desty) is PipeBlock)
            {
                outDir = Direction.Left;
            }
            else if (world.GetBlockAt(destx - 1, desty) is PipeBlock)
            {
                outDir = Direction.Right;
            }
            else if (world.GetBlockAt(destx, desty + 1) is PipeBlock)
            {
                outDir = Direction.Down;
            }
            else if (world.GetBlockAt(destx, desty - 1) is PipeBlock)
            {
                outDir = Direction.Up;
            }
            if (outDir != Direction.None)
            {
                world.AddEntity(new PipeMarioParticle(sprite as MarioSprite, Position, inDir, outDir, () =>
                {
                    world.CurrentRegion = world.Regions[pte.TransitionRegion];
                    Position            = new Vector2(pte.TransitionX, pte.TransitionY);
                    return(Position);
                }, () => { Visible = true; }));
            }
            else
            {
                world.AddEntity(new PipeMarioParticle(sprite as MarioSprite, Position, inDir, () =>
                {
                    world.CurrentRegion = world.Regions[pte.TransitionRegion];
                    Position            = new Vector2(pte.TransitionX, pte.TransitionY);
                    Visible             = true;
                }));
            }
            Sounds.SoundLoader.Pipe(Position);
        }