Zdaje się, że do IntRect'ów podajesz wymiary obrazków, które są większe niż same obiekty (bo sprite'y na obrazkach są otoczone przezroczystością itp.). Idąc tym sposobem spróbuj sobie zmniejszyć prostokąt:
sf::IntRect skala(meteor.X_Skala()+10,meteor.Y_Skala()+10,meteor.X_Asteroida_tekstura()-20,meteor.Y_Asteroida_tekstura()-20);
Wartości 10 i 20 nie są tu przypadkowo użyte, definiując prostokąt, trzeba od rozmiaru odjąć dwa razy większą wartość niż dla przemieszczenia.
Jakbyś chciał lepszy, dokładniejszy system kolizji, to dość łatwo byłoby zaimplementować detekcję kolizji przy użyciu odcinków. Można też dla odcinków sprawdzić gdzie się przecinają, żeby np. w tym miejscu wyświetlić jakąś animację kolizji, np. wybuch :) Każdy obiekt sobie otoczysz odcinkami i będziesz je przesuwał i obracał razem z pozycją rysowanego sprite'a.
Tak jak pisałem, zrób to sobie na odcinkach. Zaimplementuj klasę Polygon, która będzie miała vector odcinków i dla obiektów kolizyjnych dodaj pole Polygon i w ich konstruktorach dodasz odcinki do Polygona. Przeszukałem trochę neta i coś mi się zdaje, że SFML nie ma własnych klas do obsługi takich kolizji. Trzeba mały system sobie zakodować samemu :)
W jednym projekcie tak to zrealizowałem:
Kopiuj
collisionShape.addPoint(-68.0,-4.0);
collisionShape.addPoint(-78.0,-19.0);
collisionShape.addPoint(-88.0,-13.0);
collisionShape.addPoint(-98.0,16.0);
collisionShape.addPoint(-85.0,52.0);
collisionShape.addPoint(-85.0,21.0);
collisionShape.addPoint(-81.0,7.0);
collisionShape.addPoint(-78.0,4.0);
collisionShape.addPoint(68.0,4.0);
collisionShape.addPoint(78.0,19.0);
collisionShape.addPoint(88.0,13.0);
collisionShape.addPoint(98.0,-16.0);
collisionShape.addPoint(85.0,-52.0);
collisionShape.addPoint(85.0,-21.0);
collisionShape.addPoint(81.0,-7.0);
collisionShape.addPoint(78.0,-4.0);
collisionShape.createSegments();
collisionShape to nasz polygon, createSegments idzie po wszystkich punktach i tworzy z nich odcinki, ostatni punkt łączy z pierwszym.
I tworzy kopię tych punktów, bo będzie ona potrzebna by na jej podstawie robić przekształcenia (liczby zmiennoprzecinkowe są niewdzięczne i po chwili cały obiekt się będzie rozłaził jak będziemy robić przekształcenia bezpośrednio na punktach).
W pętli gry po każdym przemieszczeniu obiektu realizowana jest metoda updateSegments:
Kopiuj
collisionShape.updateSegments(pos,rot);
Ona przesuwa i obraca kształt, nadpisuje wartości danego kształtu używając wartości niezmiennej kopii.
Kiedy chcesz sprawdzić czy zachodzi kolizja robisz to tak:
Kopiuj
if (obiekt1.collisionShape.collidesWith(obiekt2.collisionShape))
{
...
}
Metoda collidesWith sprawdza każdy odcinek obiektu 1, czy aby nie koliduje z którymś odcinkiem obiektu 2, jeśli tak to zwraca true, w przeciwnym razie false. Wzory na kolizje odcinków sobie znajdziesz bez problemu ( http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ ), jak obliczyć punkt przecięcia też znajdziesz.
Wiem, że to wydaje się skomplikowane, ale takie właśnie jest programowanie ;) Od ogółu do szczegółu.