Witam,
od jakiegoś czasu uczę się programować z użyciem biblioteki Allegro 4.2.3. Jakiś czas temu zetknąłem się z pojęciem kolizji (zresztą były mi wtedy potrzebne), ale nie znalazłem przejrzystego dla mnie poradnika o tym, jak się takie kolizje tworzy, więc postanowiłem zdać się na siebie :D
Oto efekt mojej pracy (fragment):
if( x + 100 > xx && y + 99 > yy && y < yy + 100 && x < xx + 100 ) x--;
if( y + 100 > yy && x + 100 > xx && x < xx + 100 && y < yy + 100 ) y--;
if( x + 100 > xx && y + 100 > yy && y < yy + 100 && x < xx + 100 ) { x = x + 2; y++; }
if( y + 100 > yy && x + 100 > xx && x < xx + 100 && y < yy + 100 ) { y = y + 2; x--; }
Dla ścisłośi: x,y - współrzędne jednego kwadratu (może się poruszać)
xx,yy - współrzędne drugiego kwadratu (ten tylko stoi w miejscu)
Celem tego fragmentu kodu jest spowodowanie, że kwadrat 1 (ten o wsp. x,y, tak będzie nazywany w dalszej części wypowiedzi) nie będzie mógł "przeniknąć" przez kwadrat 2 (wsp. xx,yy, j.w.), czyli po prostu na niego najechać.
Pozbawiony pomocy z zewnątrz, dochodziłem do tego, jak powinien wyglądać kod /* albo i nie... */ sam, toteż nie ma w nim żadnej analogi, chociaż mogę z pełnym przekonaniem stwierdzić, że kod działa poprawnie. Wyjątkiem jest sytuacja, w której kwadrat 1 "naciera" na kwadrat 2 od dołu. Są wtedy widoczne wibracje, mam przez to na myśli, że widać, jak kwadrat 1 porusza się w górę i jest szybko cofany o jeden piksel do tyłu. Mam świadomość, że takie zjawisko ma miejsce we wszystkich innych przypadkach, ale nie jest widoczne, a wy przypadku opisanym wyżej - jest.
Jeśli mam być szczery: nie, nie rozumiem jak działa program, który napisałem. Do tego co zamieściłem wyżej dochodziłem metodą prób i błędów, obserwując na bieżąco zachowanie kodu i teraz nie jestem pewien na czym opiera się jego działanie. Mimo sukcesywnej analizy kodu nie wiem dalej, co zrobić, żeby kod był poprawny. Tzn. wydaje mi się, że nie jest poprawny (chociażby ze względu na
y = y + 2; x--;
, bo przypuszczam, że w tym miejscu powinno być najzwyklejsze
y++
, ale wtedy program nie działa :C.
Tak więc zwracam się o pomoc w odnalezieniu optymalnego sposobu, lub przekierowanie na jakiś przejrzysty kurs. (Kierowany doświadczeniem, nie śmiałbym prosić o gotowca :D)