A stealth-based 2D platformer where you don't have to kill anyone unless you want to. https://www.semicolin.games
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
6.0 KiB

  1. using Microsoft.Xna.Framework;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using System;
  4. namespace SemiColinGames.Tests {
  5. [TestClass]
  6. public class GeometryTests {
  7. public void AssertVectorsAreEqual(Vector2 v1, Vector2 v2) {
  8. Assert.AreEqual(v1.X, v2.X, 1e-5);
  9. Assert.AreEqual(v1.Y, v2.Y, 1e-5);
  10. }
  11. [TestMethod]
  12. public void TestVector2Rotate() {
  13. Vector2 v = new Vector2(10, 0);
  14. AssertVectorsAreEqual(new Vector2(10, 0), v.Rotate(FMath.DegToRad(0)));
  15. AssertVectorsAreEqual(new Vector2(0, 10), v.Rotate(FMath.DegToRad(90)));
  16. AssertVectorsAreEqual(new Vector2(-10, 0), v.Rotate(FMath.DegToRad(180)));
  17. AssertVectorsAreEqual(new Vector2(0, -10), v.Rotate(FMath.DegToRad(270)));
  18. AssertVectorsAreEqual(new Vector2(10, 0), v.Rotate(FMath.DegToRad(360)));
  19. AssertVectorsAreEqual(new Vector2(0, 10), v.Rotate(FMath.DegToRad(450)));
  20. AssertVectorsAreEqual(new Vector2(0, -10), v.Rotate(FMath.DegToRad(-90)));
  21. AssertVectorsAreEqual(new Vector2(-10, 0), v.Rotate(FMath.DegToRad(-180)));
  22. AssertVectorsAreEqual(new Vector2(0, 10), v.Rotate(FMath.DegToRad(-270)));
  23. AssertVectorsAreEqual(new Vector2(10, 0), v.Rotate(FMath.DegToRad(-360)));
  24. AssertVectorsAreEqual(new Vector2(0, -10), v.Rotate(FMath.DegToRad(-450)));
  25. AssertVectorsAreEqual(new Vector2(7.0710678f, 7.0710678f), v.Rotate(FMath.DegToRad(45)));
  26. AssertVectorsAreEqual(new Vector2(8.6602540f, 5f), v.Rotate(FMath.DegToRad(30)));
  27. AssertVectorsAreEqual(new Vector2(5f, 8.6602540f), v.Rotate(FMath.DegToRad(60)));
  28. AssertVectorsAreEqual(new Vector2(-5f, 8.6602540f), v.Rotate(FMath.DegToRad(120)));
  29. AssertVectorsAreEqual(new Vector2(-8.6602540f, 5f), v.Rotate(FMath.DegToRad(150)));
  30. AssertVectorsAreEqual(new Vector2(7.0710678f, -7.0710678f), v.Rotate(FMath.DegToRad(-45)));
  31. AssertVectorsAreEqual(new Vector2(8.6602540f, -5f), v.Rotate(FMath.DegToRad(-30)));
  32. AssertVectorsAreEqual(new Vector2(5f, -8.6602540f), v.Rotate(FMath.DegToRad(-60)));
  33. AssertVectorsAreEqual(new Vector2(-5f, -8.6602540f), v.Rotate(FMath.DegToRad(-120)));
  34. AssertVectorsAreEqual(new Vector2(-8.6602540f, -5f), v.Rotate(FMath.DegToRad(-150)));
  35. }
  36. [TestMethod]
  37. public void TestIntersectSegmentNotColliding() {
  38. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  39. Assert.IsNull(box.IntersectSegment(new Vector2(-16, -16), new Vector2(32, 0)));
  40. }
  41. [TestMethod]
  42. public void TestIntersectSegmentHit() {
  43. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  44. var point = new Vector2(-16, 4);
  45. var delta = new Vector2(32, 0);
  46. Hit? maybeHit = box.IntersectSegment(point, delta);
  47. Assert.IsNotNull(maybeHit);
  48. Hit hit = (Hit) maybeHit;
  49. Assert.AreEqual(box, hit.Collider);
  50. Assert.AreEqual(0.25, hit.Time);
  51. Assert.AreEqual(point.X + delta.X * hit.Time, hit.Position.X);
  52. Assert.AreEqual(point.Y + delta.Y * hit.Time, hit.Position.Y);
  53. Assert.AreEqual((1.0f - hit.Time) * -delta.X, hit.Delta.X);
  54. Assert.AreEqual((1.0f - hit.Time) * -delta.Y, hit.Delta.Y);
  55. Assert.AreEqual(-1, hit.Normal.X);
  56. Assert.AreEqual(0, hit.Normal.Y);
  57. }
  58. [TestMethod]
  59. public void TestIntersectSegmentFromInsideBox() {
  60. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  61. var point = new Vector2(-4, 4);
  62. var delta = new Vector2(32, 0);
  63. Hit? maybeHit = box.IntersectSegment(point, delta);
  64. Assert.IsNotNull(maybeHit);
  65. Hit hit = (Hit) maybeHit;
  66. Assert.AreEqual(box, hit.Collider);
  67. Assert.AreEqual(0.0, hit.Time);
  68. Assert.AreEqual(-4, hit.Position.X);
  69. Assert.AreEqual(4, hit.Position.Y);
  70. Assert.AreEqual(-delta.X, hit.Delta.X);
  71. Assert.AreEqual(-delta.Y, hit.Delta.Y);
  72. Assert.AreEqual(-1, hit.Normal.X);
  73. Assert.AreEqual(0, hit.Normal.Y);
  74. }
  75. [TestMethod]
  76. public void TestIntersectSegmentWithPadding() {
  77. AABB box = new AABB(new Vector2(0, 0), new Vector2(8, 8));
  78. var point = new Vector2(-16, 4);
  79. var delta = new Vector2(32, 0);
  80. int padding = 4;
  81. Hit? maybeHit = box.IntersectSegment(point, delta, new Vector2(padding, padding));
  82. Assert.IsNotNull(maybeHit);
  83. Hit hit = (Hit) maybeHit;
  84. Assert.AreEqual(box, hit.Collider);
  85. Assert.AreEqual(0.125, hit.Time);
  86. Assert.AreEqual(point.X + delta.X * hit.Time, hit.Position.X);
  87. Assert.AreEqual(point.Y + delta.Y * hit.Time, hit.Position.Y);
  88. Assert.AreEqual((1.0f - hit.Time) * -delta.X, hit.Delta.X);
  89. Assert.AreEqual((1.0f - hit.Time) * -delta.Y, hit.Delta.Y);
  90. Assert.AreEqual(-1, hit.Normal.X);
  91. Assert.AreEqual(0, hit.Normal.Y);
  92. }
  93. [TestMethod]
  94. public void TestIntersectSegmentFromTwoDirections() {
  95. AABB box = new AABB(new Vector2(0, 0), new Vector2(32, 32));
  96. var farPos = new Vector2(64, 0);
  97. var farToNearDelta = new Vector2(-32, 0);
  98. Assert.IsNull(box.IntersectSegment(farPos, farToNearDelta));
  99. var nearPos = new Vector2(32, 0);
  100. var nearToFarDelta = new Vector2(32, 0);
  101. Assert.IsNull(box.IntersectSegment(nearPos, nearToFarDelta));
  102. }
  103. [TestMethod]
  104. public void TestIntersectSegmentXAxisAligned() {
  105. AABB box = new AABB(new Vector2(0, 0), new Vector2(16, 16));
  106. var pos = new Vector2(-32, 0);
  107. var delta = new Vector2(64, 0);
  108. Hit? maybeHit = box.IntersectSegment(pos, delta);
  109. Assert.IsNotNull(maybeHit);
  110. Hit hit = (Hit) maybeHit;
  111. Assert.AreEqual(0.25, hit.Time);
  112. Assert.AreEqual(-1, hit.Normal.X);
  113. Assert.AreEqual(0, hit.Normal.Y);
  114. }
  115. [TestMethod]
  116. public void TestIntersectSegmentYAxisAligned() {
  117. AABB box = new AABB(new Vector2(0, 0), new Vector2(16, 16));
  118. var pos = new Vector2(0, -32);
  119. var delta = new Vector2(0, 64);
  120. Hit? maybeHit = box.IntersectSegment(pos, delta);
  121. Assert.IsNotNull(maybeHit);
  122. Hit hit = (Hit) maybeHit;
  123. Assert.AreEqual(0.25, hit.Time);
  124. Assert.AreEqual(0, hit.Normal.X);
  125. Assert.AreEqual(-1, hit.Normal.Y);
  126. }
  127. }
  128. }