Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void HandleCollisions()
- {
- int x = (int)Math.Floor((float)Position.X / Tile.Side);
- int y = (int)Math.Floor((float)Position.Y / Tile.Side);
- TileCollision collision = level.GetCollision(x, y);
- if (collision != TileCollision.Passable)
- {
- Rectangle column, row;
- Rectangle tile = level.GetBounds(x, y);
- level.ColorColliding(x, y);
- TileCollision leftCollision = level.GetCollision(x - 1, y);
- TileCollision rightCollision = level.GetCollision(x + 1, y);
- TileCollision topCollision = level.GetCollision(x, y - 1);
- TileCollision botCollision = level.GetCollision(x, y + 1);
- #region row
- if (leftCollision == TileCollision.Block)
- {
- level.ColorColliding(x - 1, y);
- if (rightCollision == TileCollision.Block)
- {
- row = new Rectangle((x - 1) * Tile.Side, y * Tile.Side,
- Tile.Side * 3, Tile.Side);
- level.ColorColliding(x + 1, y);
- }
- else
- {
- row = new Rectangle((x - 1) * Tile.Side, y * Tile.Side,
- Tile.Side * 2, Tile.Side);
- }
- }
- else
- {
- if (rightCollision == TileCollision.Block)
- {
- row = new Rectangle(x * Tile.Side, y * Tile.Side,
- Tile.Side * 2, Tile.Side);
- level.ColorColliding(x + 1, y);
- }
- else
- {
- row = new Rectangle(x * Tile.Side, y * Tile.Side,
- Tile.Side, Tile.Side);
- }
- }
- #endregion
- #region column
- if (topCollision == TileCollision.Block)
- {
- level.ColorColliding(x, y - 1);
- if (botCollision == TileCollision.Block)
- {
- column = new Rectangle(x * Tile.Side, (y - 1) * Tile.Side,
- Tile.Side, Tile.Side * 3);
- level.ColorColliding(x, y + 1);
- }
- else
- {
- column = new Rectangle(x * Tile.Side, (y - 1) * Tile.Side,
- Tile.Side, Tile.Side * 2);
- }
- }
- else
- {
- if (botCollision == TileCollision.Block)
- {
- column = new Rectangle(x * Tile.Side, y * Tile.Side,
- Tile.Side, Tile.Side * 2);
- level.ColorColliding(x, y + 1);
- }
- else
- {
- column = new Rectangle(x * Tile.Side, y * Tile.Side,
- Tile.Side, Tile.Side);
- }
- }
- #endregion
- Vector2 verticalCross, horizontalCross;
- //vertical
- if (momentum.X < 0)
- verticalCross.X = column.Right;
- else //if (momentum.X > 0)
- verticalCross.X = column.Left;
- verticalCross.Y = lastPos.Y + ((-(lastPos.X - verticalCross.X) / momentum.X) * momentum.Y);
- //horizontal
- if (momentum.Y < 0)
- horizontalCross.Y = row.Bottom;
- else //if (momentum.Y > 0)
- horizontalCross.Y = row.Top;
- horizontalCross.X = lastPos.X + ((-(lastPos.Y - horizontalCross.Y) / momentum.Y) * momentum.X);
- if ((column.Top <= verticalCross.Y && verticalCross.Y <= column.Bottom) &&
- ((verticalCross.Y < row.Top || row.Bottom < verticalCross.Y) ||
- (verticalCross.X == row.Left || row.Right == verticalCross.X)))
- BounceVert(verticalCross.X, position.Y);
- else if (row.Left <= horizontalCross.X && horizontalCross.X <= row.Right &&
- ((horizontalCross.X < column.Left || column.Right < horizontalCross.X) ||
- (horizontalCross.Y == column.Top || column.Bottom == horizontalCross.Y)))
- BounceHorz(Position.X, horizontalCross.Y);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement