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.

127 lines
3.9 KiB

2 years ago
  1. package collider;
  2. import java.awt.Color;
  3. import gameobjects.*;
  4. import org.apache.logging.log4j.Logger;
  5. import org.apache.logging.log4j.LogManager;
  6. /** a {@link Collider} for Rectangles, usually used for {@link RectObject} instances.
  7. * @see gameobjects.RectObject#generateColliders()
  8. */
  9. public class RectCollider extends Collider {
  10. //double x;
  11. //double y;
  12. //double vx;
  13. //double vy;
  14. double w, h;
  15. private Color color = Color.WHITE;
  16. private static Logger logger = LogManager.getLogger(RectCollider.class);
  17. /**
  18. * initializes this RectCollider.
  19. * calls superclass constructor of {@link Collider#Collider(String, GameObject)} with params String id and GameObject o.
  20. *
  21. * @param id String unique name for this RectCollider
  22. * @param o GameObject instance this RectCollider belongs to (cannot be null)
  23. * @param w width in pixels for the collider dimensions (> 0)
  24. * @param h height in pixels for the collider dimensions (>0)
  25. */
  26. public RectCollider(String id, GameObject o, double w, double h) {
  27. super(id, o);
  28. this.w = w;
  29. this.h = h;
  30. }
  31. public String toString() {
  32. return " " + w + " " + h + " ";
  33. }
  34. /**
  35. * checks collision with other Collider, which needs to be a RectCollider, too.
  36. * @param other RectCollider (is casted) to calculate collision with
  37. * @return true if collission is detected
  38. */
  39. public boolean checkCollisionRectRect(Collider other) {
  40. RectCollider r1 = this;
  41. RectCollider r2 = (RectCollider) other;
  42. if ((((r1.getX() + r1.w / 2.) >= (r2.getX() - r2.w / 2.)) && ((r1.getX() + r1.w / 2.) <= (r2
  43. .getX() + r2.w / 2.)))
  44. || (((r2.getX() + r2.w / 2.) >= (r1.getX() - r1.w / 2.)) && ((r2.getX() + r2.w / 2.) <= (r1
  45. .getX() + r1.w / 2.)))) {
  46. if ((((r1.getY() + r1.h / 2.) >= (r2.getY() - r2.h / 2.)) && ((r1.getY() + r1.h / 2.) <= (r2
  47. .getY() + r2.h / 2.)))
  48. || (((r2.getY() + r2.h / 2.) >= (r1.getY() - r1.h / 2.)) && ((r2.getY() + r2.h / 2.) <= (r1
  49. .getY() + r1.h / 2.)))) {
  50. return true;
  51. }
  52. }
  53. return false;
  54. }
  55. /**
  56. * checks collision with other Collider, which needs to be a CircleCollider
  57. * @param other CircleCollider (is casted) to calculate collision with
  58. * @return true if collission is detected
  59. */
  60. public boolean checkCollisionRectCirc(Collider other) {
  61. RectCollider r = this;
  62. CircleCollider c = (CircleCollider) (other);
  63. double circleDistX = Math.abs(c.getX() - (r.getX() ));
  64. double circleDistY = Math.abs(c.getY() - (r.getY() ) );
  65. logger.trace("c.x:"+c.x+" "+"c.y:"+c.y+" "+"c.r:"+c.r+" "+"r.x:"+r.getX()+" "+"r.y:"+r.getY()+" "+"r.w:"+r.w+" "+"r.h:"+r.h+" "+"circleDistX:"+circleDistX+" "+"circleDistY:"+circleDistY);
  66. if (circleDistX > (r.w / 2 + c.r))
  67. return false;
  68. if (circleDistY > (r.h / 2 + c.r))
  69. return false;
  70. if (circleDistX <= (r.w / 2)) {
  71. logger.trace("Collision Rect with circle");
  72. return true;
  73. }
  74. if (circleDistY <= (r.h / 2)) {
  75. logger.trace("Collision Rect with circle (second)");
  76. return true;
  77. }
  78. double cornerDistSqr = Math.pow(circleDistX - r.w / 2, 2) + Math.pow(circleDistY - r.h / 2, 2); // Satz
  79. // des
  80. // Pythagoras
  81. return (cornerDistSqr <= c.r * c.r); // falls true zurueckgegeben: Kollision
  82. }
  83. @Override
  84. public boolean collidesWith(Collider other) {
  85. // rect circ
  86. try {
  87. return checkCollisionRectCirc(other);
  88. } catch (Exception e) {
  89. // do nothing
  90. }
  91. // rect rect
  92. try {
  93. return checkCollisionRectRect(other);
  94. } catch (Exception e) {
  95. // do nothing
  96. }
  97. try {
  98. return other.collidesWith(this);
  99. } catch (Exception e) {
  100. // do nothing
  101. }
  102. throw new RuntimeException("Collider type not implemented!");
  103. }
  104. }