Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro, C++] Kolizje bitmap

Ostatnio zmodyfikowano 2014-03-13 17:47
Autor Wiadomość
Fofokus
Temat założony przez niniejszego użytkownika
[Allegro, C++] Kolizje bitmap
» 2014-03-11 19:42:26
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):
C/C++
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)

P-106122
Nekronomik
» 2014-03-11 20:19:53
https://www.youtube.com/watch?v=3je9kyxONjg&list=PLFA57DCB4BAB29222&index=12
A może zrób pierw kolizje kwadrat-mysz , skoro ta jest za trudna.
P-106126
Fofokus
Temat założony przez niniejszego użytkownika
» 2014-03-12 19:06:15
No dobra,

oto efekt pracy:
C/C++
if(( ax + 100 ) > bx && ax <( bx + 100 ) &&( ay + 100 ) > by && ay <( by + 100 ) )
{
    ax = X;
    ay = Y;
} else
{
    X = ax;
    Y = ay;
}
ax, ay - wsp. kwadratu nr 1
bx, by - wsp. kwadratu nr 2
Program zapisuje współrzędne obiektu z każdym obiegiem pętli tak długo, jak obiekt nie wejdzie na "zakazaną strefę" czyli na kwadrat, z którym koliduje. Wtedy odsyła obiekt do zapamiętanych współrzędnych.
Pytanie do kolegi, który pisał wyżej: czy to jest już poprawnie napisana kolizja? Nie znalazłem tego w żadnym poradniku, tylko wpadłem na ten pomysł przemierzając dzisiaj miasto i przyznam, że byłem z siebie dość zadowolony, kiedy okazało się, że to działa, więc chciałbym wiedzieć, czy rzeczywiście tak się to powinno robić. A może ten sposób ma jakieś wady/może istnieją lepsze sposoby?
Będę wdzięczny za odpowiedź, ewentualnie za jakieś poprawki :)
P-106203
Nekronomik
» 2014-03-13 11:19:08
Jeśli twoja kolizja działa tak jak powinna to znaczy że jest poprawna, możesz ją jeszcze tylko bardziej rozbudować.
Co do wad, to nazwy zmiennych jak ax, bx, ay, by, X, Y zaczną ci robić bałagan tzn. zaczniesz się gubić, zwłaszcza jak dojdzie ci więcej kolizji.
P-106247
Fofokus
Temat założony przez niniejszego użytkownika
» 2014-03-13 17:47:56
OK, dzięki piękne za pomoc :). Temat do zamknięcia.
P-106275
« 1 »
  Strona 1 z 1