@@ -33,51 +33,135 @@ Rectangle::Rectangle(sf::Texture &tex) {
3333 m_size = object_size;
3434}
3535
36- bool Circle::check_collision (Object *obj) const {
36+ bool Circle::checkCollision (Object *obj) const {
3737 if (dynamic_cast <Circle *>(obj)) {
38- return check_collision (static_cast <Circle *>(obj));
38+ return checkCollision (static_cast <Circle *>(obj));
3939 } else if (dynamic_cast <Rectangle *>(obj)) {
40- return check_collision (static_cast <Rectangle *>(obj));
40+ return checkCollision (static_cast <Rectangle *>(obj));
41+ } else {
42+ return false ;
4143 }
4244}
4345
44- bool Rectangle::check_collision (Object *obj) const {
46+ bool Circle::checkCollision (Circle *obj) const {
47+ return len (obj->getPosition () - getPosition ()) < (m_radius + obj->m_radius );
48+ }
49+
50+ bool Circle::checkCollision (Rectangle *obj) const {
51+ return (getPosition ().x + m_radius >=
52+ obj->getPosition ().x - obj->getSize ().x / 2 &&
53+ getPosition ().x - m_radius <=
54+ obj->getPosition ().x + obj->getSize ().x / 2 &&
55+ getPosition ().y + m_radius >=
56+ obj->getPosition ().y - obj->getSize ().y / 2 &&
57+ getPosition ().y - m_radius <=
58+ obj->getPosition ().y + obj->getSize ().y / 2 );
59+ }
60+
61+ bool Rectangle::checkCollision (Object *obj) const {
4562 if (dynamic_cast <Circle *>(obj)) {
46- return check_collision (static_cast <Circle *>(obj));
63+ return checkCollision (static_cast <Circle *>(obj));
4764 } else if (dynamic_cast <Rectangle *>(obj)) {
48- return check_collision (static_cast <Rectangle *>(obj));
49- } else return false ;
65+ return checkCollision (static_cast <Rectangle *>(obj));
66+ } else
67+ return false ;
5068}
5169
52- bool Circle::check_collision (Circle *obj) const {
53- return len (obj->getPosition () - getPosition ()) < (m_radius + obj->m_radius );
70+ bool Rectangle::checkCollision (Circle *obj) const {
71+ return (getPosition ().x + m_size.x >=
72+ obj->getPosition ().x - obj->getRadius () / 2 &&
73+ getPosition ().x - m_size.x <=
74+ obj->getPosition ().x + obj->getRadius () / 2 &&
75+ getPosition ().y + m_size.y >=
76+ obj->getPosition ().y - obj->getRadius () / 2 &&
77+ getPosition ().y - m_size.y <=
78+ obj->getPosition ().y + obj->getRadius () / 2 );
5479}
5580
56- bool Circle::check_collision (Rectangle *obj) const {
57- return (
58- getPosition ().x + m_radius >= obj->getPosition ().x - obj->getSize ().x / 2 &&
59- getPosition ().x - m_radius <= obj->getPosition ().x + obj->getSize ().x / 2 &&
60- getPosition ().y + m_radius >= obj->getPosition ().y - obj->getSize ().y / 2 &&
61- getPosition ().y - m_radius <= obj->getPosition ().y + obj->getSize ().y / 2
62- );
81+ bool Rectangle::checkCollision (Rectangle *obj) const {
82+ return (getPosition ().x + m_size.x / 2 >=
83+ obj->getPosition ().x - obj->getSize ().x / 2 &&
84+ getPosition ().x - m_size.x / 2 <=
85+ obj->getPosition ().x + obj->getSize ().x / 2 &&
86+ getPosition ().y + m_size.y / 2 >=
87+ obj->getPosition ().y - obj->getSize ().y / 2 &&
88+ getPosition ().y - m_size.y / 2 <=
89+ obj->getPosition ().y + obj->getSize ().y / 2 );
90+ }
91+
92+ void Circle::snapCollision (Object *obj) {
93+ if (dynamic_cast <Circle *>(obj)) {
94+ snapCollision (static_cast <Circle *>(obj));
95+ } else if (dynamic_cast <Rectangle *>(obj)) {
96+ snapCollision (static_cast <Rectangle *>(obj));
97+ }
6398}
6499
65- bool Rectangle::check_collision (Circle *obj) const {
66- return (
67- getPosition ().x + m_size.x >= obj->getPosition ().x - obj->getRadius () / 2 &&
68- getPosition ().x - m_size.x <= obj->getPosition ().x + obj->getRadius () / 2 &&
69- getPosition ().y + m_size.y >= obj->getPosition ().y - obj->getRadius () / 2 &&
70- getPosition ().y - m_size.y <= obj->getPosition ().y + obj->getRadius () / 2
71- );
100+ void Circle::snapCollision (Circle *obj) {
101+ sf::Vector2f delta = obj->getPosition () - getPosition ();
102+ float new_len = m_radius + obj->m_radius ;
103+ setPosition (obj->getPosition () - delta * new_len / len (delta));
72104}
73105
74- bool Rectangle::check_collision (Rectangle *obj) const {
75- return (
76- getPosition ().x + m_size.x / 2 >= obj->getPosition ().x - obj->getSize ().x / 2 &&
77- getPosition ().x - m_size.x / 2 <= obj->getPosition ().x + obj->getSize ().x / 2 &&
78- getPosition ().y + m_size.y / 2 >= obj->getPosition ().y - obj->getSize ().y / 2 &&
79- getPosition ().y - m_size.y / 2 <= obj->getPosition ().y + obj->getSize ().y / 2
80- );
106+ void Circle::snapCollision (Rectangle *obj) {
107+ sf::Vector2f delta = obj->getPosition () - getPosition ();
108+ if (abs (delta.x ) / obj->getSize ().x < abs (delta.y ) / obj->getSize ().y ) {
109+ if (delta.y < 0 ) {
110+ return setPosition (
111+ getPosition ().x ,
112+ obj->getPosition ().y + obj->getSize ().y / 2 + m_radius + 0 .01f );
113+ } else {
114+ return setPosition (
115+ getPosition ().x ,
116+ obj->getPosition ().y - obj->getSize ().y / 2 - m_radius - 0 .01f );
117+ }
118+ } else {
119+ if (delta.x < 0 ) {
120+ return setPosition (
121+ obj->getPosition ().x + obj->getSize ().x / 2 + m_radius + 0 .01f ,
122+ getPosition ().y );
123+ } else {
124+ return setPosition (
125+ obj->getPosition ().x - obj->getSize ().x / 2 - m_radius - 0 .01f ,
126+ getPosition ().y );
127+ }
128+ }
129+ }
130+
131+ void Rectangle::snapCollision (Object *obj) {
132+ if (dynamic_cast <Circle *>(obj)) {
133+ snapCollision (static_cast <Circle *>(obj));
134+ } else if (dynamic_cast <Rectangle *>(obj)) {
135+ snapCollision (static_cast <Rectangle *>(obj));
136+ }
137+ }
138+
139+ void Rectangle::snapCollision (Circle *obj) {}
140+
141+ void Rectangle::snapCollision (Rectangle *obj) {
142+ sf::Vector2f delta = obj->getPosition () - getPosition ();
143+ if (abs (delta.x ) / (obj->getSize ().x + getSize ().x ) <
144+ abs (delta.y ) / (obj->getSize ().y + getSize ().y )) {
145+ if (delta.y < 0 ) {
146+ return setPosition (getPosition ().x , obj->getPosition ().y +
147+ obj->getSize ().y / 2 +
148+ getSize ().y / 2 + 0 .01f );
149+ } else {
150+ return setPosition (getPosition ().x , obj->getPosition ().y -
151+ obj->getSize ().y / 2 -
152+ getSize ().y / 2 - 0 .01f );
153+ }
154+ } else {
155+ if (delta.x < 0 ) {
156+ return setPosition (
157+ obj->getPosition ().x + obj->getSize ().x / 2 + getSize ().x / 2 + 0 .01f ,
158+ getPosition ().y );
159+ } else {
160+ return setPosition (
161+ obj->getPosition ().x - obj->getSize ().x / 2 - getSize ().x / 2 - 0 .01f ,
162+ getPosition ().y );
163+ }
164+ }
81165}
82166
83167void Circle::drawCollision (sf::RenderTarget *target) const {
0 commit comments