Advertisement
7heSama

Collisions Dump

Jun 19th, 2013 (edited)
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.85 KB | None | 0 0
  1.         private void HandleCollisions()
  2.         {
  3.             // find neighboring tiles.
  4.             int leftTile = Owner.GetArray(Bounds.Left);
  5.             int rightTile = Owner.GetArray(Bounds.Right);
  6.             int topTile = Owner.GetArray(Bounds.Top);
  7.             int bottomTile = Owner.GetArray(Bounds.Bottom);
  8.  
  9.             // Reset flag to search for ground collision.
  10.             OnGround = false;
  11.  
  12.             // For each potentially colliding tile,
  13.             for (int y = topTile; y <= bottomTile; ++y)
  14.             {
  15.                 for (int x = leftTile; x <= rightTile; ++x)
  16.                 {
  17.                     TileCollision collision = Owner.GetCollision(x, y);
  18.  
  19.                     if (collision == TileCollision.Block || collision == TileCollision.Platform)
  20.                     {
  21.                         Rectangle tile = Owner.GetBounds(x, y);
  22.  
  23.                         if (previousBounds.Bottom <= tile.Top && Momentum.Y >= 0 && Bounds.Bottom > tile.Top
  24.                             && Bounds.Left < tile.Right && Bounds.Right > tile.Left)
  25.                         {
  26.                             Land(tile.Top - boundingBox.Height / 2f);
  27.                         }
  28.                         else if (collision == TileCollision.Block)
  29.                         {
  30.                             if (Bounds.Bottom > tile.Top)
  31.                             {
  32.                                 if (previousBounds.Right <= tile.Left)
  33.                                     Position = new Vector2(tile.Left - boundingBox.Width / 2, Position.Y);
  34.                                 if (previousBounds.Left >= tile.Right)
  35.                                     Position = new Vector2(tile.Right + boundingBox.Width / 2, Position.Y);
  36.                             }
  37.                             if (previousBounds.Top >= tile.Bottom && Momentum.Y <= 0
  38.                                 && (Bounds.Right > tile.Left && Bounds.Left < tile.Right))
  39.                             {
  40.                                 Position = new Vector2(Position.X, tile.Bottom + boundingBox.Height / 2);
  41.                                 Momentum.Y = 0.0f;
  42.                                 JumpTime = 0;
  43.                             }
  44.                         }
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.  
  50.         public void Land(float Y)
  51.         {
  52.             OnGround = true;
  53.             Momentum.Y = 0.0f;
  54.             Position = new Vector2(Position.X, Y);
  55.             JumpTime = 5;
  56.         }
  57.  
  58.  
  59.         private void HandleCollisions(Vector2 momentum)
  60.         {
  61.             int x = Owner.GetArray(Position.X);
  62.             int y = Owner.GetArray(Position.Y);
  63.  
  64.             TileCollision collision = Owner.GetCollision(x, y);
  65.  
  66.             if (collision == TileCollision.Block)
  67.             {
  68.                 Rectangle tile = Owner.GetBounds(x, y);
  69.                 Rectangle column = tile, row = tile;
  70.  
  71.                 #region cluster
  72.                 TileCollision leftCollision = Owner.GetCollision(x - 1, y);
  73.                 TileCollision rightCollision = Owner.GetCollision(x + 1, y);
  74.                 TileCollision topCollision = Owner.GetCollision(x, y - 1);
  75.                 TileCollision botCollision = Owner.GetCollision(x, y + 1);
  76.                
  77.                 if (leftCollision == TileCollision.Block)
  78.                 {
  79.                     row.Offset(-Tile.Size / 2, 0);
  80.                     row.Inflate(Tile.Size / 2, 0);
  81.                 }
  82.                 if (rightCollision == TileCollision.Block)
  83.                 {
  84.                     row.Offset(Tile.Size / 2, 0);
  85.                     row.Inflate(Tile.Size / 2, 0);
  86.                 }
  87.                 if (topCollision == TileCollision.Block)
  88.                 {
  89.                     column.Offset(0, -Tile.Size / 2);
  90.                     column.Inflate(0, Tile.Size / 2);
  91.                 }
  92.                 if (botCollision == TileCollision.Block)
  93.                 {
  94.                     column.Offset(0, Tile.Size / 2);
  95.                     column.Inflate(0, Tile.Size / 2);
  96.                 }
  97.                 #endregion
  98.  
  99.                 Vector2 verticalCross, horizontalCross;
  100.  
  101.                 //vertical
  102.                 if (momentum.X < 0)
  103.                     verticalCross.X = column.Right;
  104.                 else
  105.                     verticalCross.X = column.Left;
  106.                 verticalCross.Y = LastPos.Y + ((-(LastPos.X - verticalCross.X) / momentum.X) * momentum.Y);
  107.  
  108.                 //horizontal
  109.                 if (momentum.Y < 0)
  110.                     horizontalCross.Y = row.Bottom;
  111.                 else
  112.                     horizontalCross.Y = row.Top;
  113.                 horizontalCross.X = LastPos.X + ((-(LastPos.Y - horizontalCross.Y) / momentum.Y) * momentum.X);
  114.  
  115.                 if ((column.Top <= verticalCross.Y && verticalCross.Y <= column.Bottom) &&
  116.                     ((verticalCross.Y < row.Top || row.Bottom < verticalCross.Y) ||
  117.                     (verticalCross.X == row.Left || row.Right == verticalCross.X)))
  118.                     Bounce(new Vector2(verticalCross.X, float.NaN));
  119.  
  120.                 else if (row.Left <= horizontalCross.X && horizontalCross.X <= row.Right &&
  121.                     ((horizontalCross.X < column.Left || column.Right < horizontalCross.X) ||
  122.                     (horizontalCross.Y == column.Top || column.Bottom == horizontalCross.Y)))
  123.                     Bounce(new Vector2(float.NaN, horizontalCross.Y));
  124.             }
  125.         }
  126.  
  127.         public void Bounce(Vector2 pos)
  128.         {
  129.             if (!float.IsNaN(pos.X))
  130.             {
  131.                 Position = new Vector2(pos.X, Position.Y);
  132.                 Momentum = new Vector2(Momentum.X * -0.5f, Momentum.Y);
  133.             }
  134.             if (!float.IsNaN(pos.Y))
  135.             {
  136.                 Position = new Vector2(Position.X, pos.Y);
  137.                 Momentum = new Vector2(Momentum.X, Momentum.Y * -0.5f);
  138.             }
  139.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement