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(); }
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()); } } }
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); }