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

[Allegro, C++] Kolizje

Ostatnio zmodyfikowano 2011-09-21 21:41
Autor Wiadomość
Wrzochu
Temat założony przez niniejszego użytkownika
[Allegro, C++] Kolizje
» 2011-08-29 19:39:28
Witam, od dłuższego czasu nie mogę się uporać z problemem kolizji. Mam mapę kafelkową po której poruszają się "samochody", no i teraz jeżeli nie ruszam mapy to kolizje mi wykrywa i działa wszystko cacy... natomiast jak tylko zacznę nią ruszać kolizja jakby przestała działać..

Tutaj jak mapa nie ruszana :
Tu jak tylko zacznę ruszać: 

Do sterowania mapą używam:
C/C++
if(( key[ KEY_RIGHT ] ) &&( mapa_x < 80 ) ) { mapa_x = mapa_x + 1; } else
if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else
if(( key[ KEY_DOWN ] ) &&( mapa_y < 90 ) ) { mapa_y = mapa_y + 1; } else
if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }

A do wykrywania kolizji:
C/C++
if(( kierunek == 0 ) &&( getpixel( bufor,( autoo_x + 10 ) -( mapa_x * 20 ),( autoo_y5 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ||
(( kierunek == 1 ) &&( getpixel( bufor,( autoo_x + 25 ) -( mapa_x * 20 ),( autoo_y + 10 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ) ||
(( kierunek == 2 ) &&( getpixel( bufor,( autoo_x + 10 ) -( mapa_x * 20 ),( autoo_y + 25 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ) ||
(( kierunek == 3 ) &&( getpixel( bufor,( autoo_x - 5 ) -( mapa_x * 20 ),( autoo_y + 10 ) -( mapa_y * 20 ) ) != makecol( 0, 0, 0 ) ) ) )

Gdzie kierunek to w jaką stronę ma jechać samochód. Wydaje mi się, że problem może być z tym, że współrzędne auta są przesuwane po 1 pikselu a sterowanie mapy po 20... Bo tak mam w funkcji która wyświetla mape:
C/C++
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 120; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 120; licznik_y++ )
        {
            blit( teren, bufor,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 8 ) * 20,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 8 ) * 20,
            licznik_x * 20, licznik_y * 20, 20, 20 );
        }
    }
};

Ale już sam nie wiem,
Mam nadzieje że jasno naświetliłem problem i, że komuś uda się mi pomóc,
Z góry dzięki za wszelką pomoc.
P-40191
SeaMonster131
» 2011-08-29 23:17:28
Powiem szczerze, że nie mam pojęcia co źle jest, ale zauważyłem tylko, że brakuje Ci jednego nawiasu w if'ie. I z tego wywnioskowałem, że kolizja może działać jedynie kiedy kierunek jest równy 1. Tą pierwszą linijke w if'ie musisz dać w nawias, tak jak zrobiłeś to z pozostałymi. Nie wiem czy to coś da, ale wydaje mi sie, że to błąd ;)
P-40203
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-08-30 00:03:40
NO fakt przeoczyłem to, ale niestety niczego to nie zmienia i dalej nie działa to tak jak powinno :/
P-40206
malan
» 2011-08-30 00:10:41
Nie może tutaj zastosować kolizji dwóch prostokątów?
C/C++
if( pozycja_auta1_x >= pozycja_auta2_x && pozycja_auta1_x <= pozycja_auta2_x + szerokosc_auta_2 &&
pozycja_auta1_y >= pozycja_auta2_y && pozycja_auta1_y <= pozycja_auta2_y + wysokosc_auta_2 )
{
    // Kolizja!
    switch( kierunek )
    {
        //...
    }
}
P-40208
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-08-30 00:21:30
A jeśli obiektów jest bardzo dużo ? To mam wypisywać wszystkie możliwe kolizje ?
P-40209
lynx
» 2011-08-30 00:25:20
do tego są tablice/ kontenery, klasy/struktury i pętla for. :)

w tablicy trzymasz obiekty wysztkie. Każdy obiekt ma swoje współrzędne na mapie. pętlą for lecisz po obiektach i sprawdzasz pomiędzy nimi kolizje.
Tak najprościej chyba.
Jak się wyćwiczysz to znajdziesz jakieś rozsądniejsze algorytmy do sprawdzania kolizji. :) narazie nie będę CI ich pisał, bo to jest bardziej skomplikowane niż to co Ci napisałem powyżej i mógłbyś mieć problem by to ogarnąć.  :) poza tym niechce mi się tyle pisać. :P


/edit
a jeśli nie znasz klasy/struktur, tablic/kontenerów i pętli for. To zrobiłeś błąd biorąc się od razu za robienie gry, ale trzeba przyznać że dużo osób tak robi. :)
P-40210
Wrzochu
Temat założony przez niniejszego użytkownika
» 2011-08-30 00:28:39
Czyli ten mój "sposób" odpada i nic się z tym nie da zrobić ? Postaram się jeszcze trochę pomęczyć a jak nie wyjdzie będę kombinował z kolizjami 2 prostokątów. Dzięki za pomoc.
P-40211
lynx
» 2011-08-30 00:30:41
Cóż jeśli nie chcesz dla każdej kolizji wklepywać danych ręcznie to nie ma innego wyjścia niż trzymać wszystkie obiekty w jakimś pojemniczku i sprawdzać automatycznie te kolizje przechodząc forem. :)
P-40212
« 1 » 2 3
  Strona 1 z 3 Następna strona