Advertisement
7heSama

Collision Detection (v2.1)

Feb 25th, 2013
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.67 KB | None | 0 0
  1.         private void HandleCollisions()
  2.         {
  3.             int x = (int)Math.Floor((float)Position.X / Tile.Side);
  4.             int y = (int)Math.Floor((float)Position.Y / Tile.Side);
  5.  
  6.             TileCollision collision = level.GetCollision(x, y);
  7.  
  8.             if (collision != TileCollision.Passable)
  9.             {
  10.                 Rectangle column, row;
  11.                 Rectangle tile = level.GetBounds(x, y);
  12.  
  13.                 level.ColorColliding(x, y);
  14.  
  15.                 TileCollision leftCollision = level.GetCollision(x - 1, y);
  16.                 TileCollision rightCollision = level.GetCollision(x + 1, y);
  17.                 TileCollision topCollision = level.GetCollision(x, y - 1);
  18.                 TileCollision botCollision = level.GetCollision(x, y + 1);
  19.  
  20.                 #region row
  21.                 if (leftCollision == TileCollision.Block)
  22.                 {
  23.                     level.ColorColliding(x - 1, y);
  24.                     if (rightCollision == TileCollision.Block)
  25.                     {
  26.                         row = new Rectangle((x - 1) * Tile.Side, y * Tile.Side,
  27.                             Tile.Side * 3, Tile.Side);
  28.                         level.ColorColliding(x + 1, y);
  29.                     }
  30.                     else
  31.                     {
  32.                         row = new Rectangle((x - 1) * Tile.Side, y * Tile.Side,
  33.                             Tile.Side * 2, Tile.Side);
  34.                     }
  35.                 }
  36.                 else
  37.                 {
  38.                     if (rightCollision == TileCollision.Block)
  39.                     {
  40.                         row = new Rectangle(x * Tile.Side, y * Tile.Side,
  41.                             Tile.Side * 2, Tile.Side);
  42.                         level.ColorColliding(x + 1, y);
  43.                     }
  44.                     else
  45.                     {
  46.                         row = new Rectangle(x * Tile.Side, y * Tile.Side,
  47.                             Tile.Side, Tile.Side);
  48.                     }
  49.                 }
  50.                 #endregion
  51.  
  52.                 #region column
  53.                 if (topCollision == TileCollision.Block)
  54.                 {
  55.                     level.ColorColliding(x, y - 1);
  56.                     if (botCollision == TileCollision.Block)
  57.                     {
  58.                         column = new Rectangle(x * Tile.Side, (y - 1) * Tile.Side,
  59.                             Tile.Side, Tile.Side * 3);
  60.                         level.ColorColliding(x, y + 1);
  61.                     }
  62.                     else
  63.                     {
  64.                         column = new Rectangle(x * Tile.Side, (y - 1) * Tile.Side,
  65.                             Tile.Side, Tile.Side * 2);
  66.                     }
  67.                 }
  68.                 else
  69.                 {
  70.                     if (botCollision == TileCollision.Block)
  71.                     {
  72.                         column = new Rectangle(x * Tile.Side, y * Tile.Side,
  73.                             Tile.Side, Tile.Side * 2);
  74.                         level.ColorColliding(x, y + 1);
  75.                     }
  76.                     else
  77.                     {
  78.                         column = new Rectangle(x * Tile.Side, y * Tile.Side,
  79.                             Tile.Side, Tile.Side);
  80.                     }
  81.                 }
  82.                 #endregion
  83.  
  84.                 Vector2 verticalCross, horizontalCross;
  85.  
  86.                 //vertical
  87.                 if (momentum.X < 0)
  88.                     verticalCross.X = column.Right;
  89.                 else //if (momentum.X > 0)
  90.                     verticalCross.X = column.Left;
  91.                 verticalCross.Y = lastPos.Y + ((-(lastPos.X - verticalCross.X) / momentum.X) * momentum.Y);
  92.  
  93.                 //horizontal
  94.                 if (momentum.Y < 0)
  95.                     horizontalCross.Y = row.Bottom;
  96.                 else //if (momentum.Y > 0)
  97.                     horizontalCross.Y = row.Top;
  98.                 horizontalCross.X = lastPos.X + ((-(lastPos.Y - horizontalCross.Y) / momentum.Y) * momentum.X);
  99.  
  100.                 if ((column.Top <= verticalCross.Y && verticalCross.Y <= column.Bottom) &&
  101.                     ((verticalCross.Y < row.Top || row.Bottom < verticalCross.Y) ||
  102.                     (verticalCross.X == row.Left || row.Right == verticalCross.X)))
  103.                     BounceVert(verticalCross.X, position.Y);
  104.  
  105.                 else if (row.Left <= horizontalCross.X && horizontalCross.X <= row.Right &&
  106.                     ((horizontalCross.X < column.Left || column.Right < horizontalCross.X) ||
  107.                     (horizontalCross.Y == column.Top || column.Bottom == horizontalCross.Y)))
  108.                     BounceHorz(Position.X, horizontalCross.Y);
  109.                
  110.             }
  111.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement