Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. foreach(Entity e1 in Data.entities.OfType<Player>())
  2. {
  3. foreach(Entity e2 in Data.entities.OfType<Collidable>())
  4. {
  5. Matrix entityTransform;
  6.  
  7. entityTransform =
  8. Matrix.CreateTranslation(new Vector3(-e2.origin, 0.0f)) *
  9. Matrix.CreateRotationZ(e2.rotation) *
  10. Matrix.CreateTranslation(new Vector3(e2.position, 0.0f)) *
  11. Matrix.CreateScale(e2.scale.X, e2.scale.Y, 0.0f);
  12.  
  13. Rectangle entityRect = CalculateBoundingRectangle(new Rectangle(0, 0, e2.srcRect.Width, e2.srcRect.Height), entityTransform);
  14.  
  15. // The per-pixel check is expensive, so check the bounding rectangles
  16. // first to prevent testing pixels when collisions are impossible.
  17. if(e1.rectangle.Intersects(entityRect))
  18. {
  19. if(Sprite.IntersectPixels(e1.transform, e1.srcRect.Width, e1.srcRect.Height, e1.sprite.textureData,
  20. e2.transform, e2.srcRect.Width, e2.srcRect.Height, e2.sprite.textureData))
  21. {
  22. e1.CollisionEvent(e2, gameTime);
  23. }
  24. }
  25.  
  26. /*
  27. if (e1 != e2 && (e1.sprite.textureData != null && e2.sprite.textureData != null))
  28. {
  29. if (e1.rectangle.Intersects(e2.rectangle))
  30. {
  31. if (e1.sprite.IntersectsPixel(e1.rectangle, e1.sprite.textureData, e2.rectangle, e2.sprite.textureData))
  32. {
  33. e1.CollisionEvent(e2, gameTime);
  34. }
  35. }
  36. }
  37. */
  38. }
  39. }
  40.  
  41. Data.entities.AddRange(Data.tempEntities);
  42. Data.tempEntities.Clear();
  43. }
  44.  
  45. /*
  46. entityTransform =
  47. Matrix.CreateTranslation(new Vector3(-e2.origin, 0.0f)) *
  48. Matrix.CreateScale(e2.scale.X, e2.scale.Y, 0.0f) *
  49. Matrix.CreateRotationZ(e2.rotation) *
  50. Matrix.CreateTranslation(new Vector3(e2.position, 0.0f));
  51. */
  52.  
  53.  
  54. /// <summary>
  55. /// Calculates an axis aligned rectangle which fully contains an arbitrarily
  56. /// transformed axis aligned rectangle.
  57. /// </summary>
  58. /// <param name="rectangle">Original bounding rectangle.</param>
  59. /// <param name="transform">World transform of the rectangle.</param>
  60. /// <returns>A new rectangle which contains the trasnformed rectangle.</returns>
  61. public static Rectangle CalculateBoundingRectangle(Rectangle rectangle,
  62. Matrix transform)
  63. {
  64. // Get all four corners in local space
  65. Vector2 leftTop = new Vector2(rectangle.Left, rectangle.Top);
  66. Vector2 rightTop = new Vector2(rectangle.Right, rectangle.Top);
  67. Vector2 leftBottom = new Vector2(rectangle.Left, rectangle.Bottom);
  68. Vector2 rightBottom = new Vector2(rectangle.Right, rectangle.Bottom);
  69.  
  70. // Transform all four corners into work space
  71. Vector2.Transform(ref leftTop, ref transform, out leftTop);
  72. Vector2.Transform(ref rightTop, ref transform, out rightTop);
  73. Vector2.Transform(ref leftBottom, ref transform, out leftBottom);
  74. Vector2.Transform(ref rightBottom, ref transform, out rightBottom);
  75.  
  76. // Find the minimum and maximum extents of the rectangle in world space
  77. Vector2 min = Vector2.Min(Vector2.Min(leftTop, rightTop),
  78. Vector2.Min(leftBottom, rightBottom));
  79. Vector2 max = Vector2.Max(Vector2.Max(leftTop, rightTop),
  80. Vector2.Max(leftBottom, rightBottom));
  81.  
  82. // Return that as a rectangle
  83. return new Rectangle((int)min.X, (int)min.Y,
  84. (int)(max.X - min.X), (int)(max.Y - min.Y));
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement