diff --git a/Shared/Player.cs b/Shared/Player.cs index 5124ffe..b083302 100644 --- a/Shared/Player.cs +++ b/Shared/Player.cs @@ -37,38 +37,29 @@ namespace SemiColinGames { public Point Position { get { return position; } } - private Rectangle Bbox(Point position) { - return new Rectangle(position.X - spriteWidth, position.Y - 7, spriteWidth * 2, 26); - } - - private Aabb Box(Point position) { - return Box(position, 0); - } + public void Update(float modelTime, History input, Aabb[] collisionTargets) { + Aabb BoxOffset(Point position, int yOffset) { + return new Aabb(new Vector2(position.X, position.Y - 7 + spriteHeight + yOffset), + new Vector2(spriteWidth, spriteHeight)); + } - private Aabb Box(Point position, int yOffset) { - return new Aabb(new Vector2(position.X, position.Y - 7 + spriteHeight + yOffset), - new Vector2(spriteWidth, spriteHeight)); - } + Aabb Box(Point position) { + return BoxOffset(position, 0); + } - public void Update(float modelTime, History input, Rectangle[] collisionTargets) { Vector2 movement = HandleInput(modelTime, input); - // TODO: we shouldn't hardcode the tile sizes here. - Vector2 halfBoxSize = new Vector2(World.TileSize / 2, World.TileSize / 2); // Broad test: remove all collision targets nowhere near the player. - List candidates = new List(); + var candidates = new List(); // TODO: This is strictly larger than it needs to be. We could expand only in the actual // direction of movement. Aabb largeBox = new Aabb( new Vector2(position.X, position.Y - 7 + spriteHeight), // current player position new Vector2(spriteWidth + Math.Abs(movement.X), spriteHeight + Math.Abs(movement.Y))); - for (int i = 0; i < collisionTargets.Length; i++) { - Rectangle rect = collisionTargets[i]; - Aabb box = new Aabb( - new Vector2(rect.X + World.TileSize / 2, rect.Y + World.TileSize / 2), halfBoxSize); + foreach (var box in collisionTargets) { if (box.Intersect(largeBox) != null) { Debug.AddRect(box, Color.Green); - candidates.Add(rect); + candidates.Add(box); } } @@ -80,9 +71,7 @@ namespace SemiColinGames { Point newPosition = new Point(position.X, position.Y + dy); Aabb player = Box(newPosition); bool reject = false; - foreach (var rect in candidates) { - Aabb box = new Aabb( - new Vector2(rect.X + World.TileSize / 2, rect.Y + World.TileSize / 2), halfBoxSize); + foreach (var box in candidates) { if (box.Intersect(player) != null) { reject = true; break; @@ -96,9 +85,7 @@ namespace SemiColinGames { Point newPosition = new Point(position.X + dx, position.Y); Aabb player = Box(newPosition); bool reject = false; - foreach (var rect in candidates) { - Aabb box = new Aabb( - new Vector2(rect.X + World.TileSize / 2, rect.Y + World.TileSize / 2), halfBoxSize); + foreach (var box in candidates) { if (box.Intersect(player) != null) { reject = true; break; @@ -111,24 +98,21 @@ namespace SemiColinGames { } bool standingOnGround = false; - Aabb groundIntersect = Box(position, 1); - foreach (var rect in candidates) { - Aabb box = new Aabb( - new Vector2(rect.X + World.TileSize / 2, rect.Y + World.TileSize / 2), halfBoxSize); + Aabb groundIntersect = BoxOffset(position, 1); + foreach (var box in candidates) { if (groundIntersect.Intersect(box) != null) { standingOnGround = true; - Debug.AddRect(rect, Color.Cyan); - // break; + break; } } if (standingOnGround) { jumps = 1; ySpeed = -0.0001f; - // Debug.AddRect(playerBbox, Color.Red); + Debug.AddRect(Box(position), Color.Cyan); } else { jumps = 0; - // Debug.AddRect(playerBbox, Color.Orange); + Debug.AddRect(Box(position), Color.Orange); } if (movement.X > 0) { diff --git a/Shared/SneakGame.cs b/Shared/SneakGame.cs index 4b61005..bee7f36 100644 --- a/Shared/SneakGame.cs +++ b/Shared/SneakGame.cs @@ -93,8 +93,7 @@ namespace SemiColinGames { if (!paused) { float modelTime = (float) gameTime.ElapsedGameTime.TotalSeconds; Clock.AddModelTime(modelTime); - Rectangle[] collisionTargets = world.CollisionTargets; - player.Update(modelTime, input, collisionTargets); + player.Update(modelTime, input, world.CollisionTargets); camera.Update(player.Position); } diff --git a/Shared/World.cs b/Shared/World.cs index e46c6ad..80b59ed 100644 --- a/Shared/World.cs +++ b/Shared/World.cs @@ -83,7 +83,7 @@ namespace SemiColinGames { public const int TileSize = 16; readonly Tile[] tiles; - readonly Rectangle[] collisionTargets; + readonly Aabb[] collisionTargets; public int Width { get; private set; } public int Height { get; private set; } @@ -153,9 +153,13 @@ namespace SemiColinGames { } } tiles = tilesList.ToArray(); - collisionTargets = new Rectangle[tiles.Length]; + collisionTargets = new Aabb[tiles.Length]; + + Vector2 halfSize = new Vector2(TileSize / 2, TileSize / 2); for (int i = 0; i < tiles.Length; i++) { - collisionTargets[i] = tiles[i].Position; + Vector2 center = new Vector2( + tiles[i].Position.Left + halfSize.X, tiles[i].Position.Top + halfSize.Y); + collisionTargets[i] = new Aabb(center, halfSize); } } @@ -165,7 +169,7 @@ namespace SemiColinGames { } } - public Rectangle[] CollisionTargets { + public Aabb[] CollisionTargets { get { return collisionTargets; } } }