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

Kolizja obrazu z przekątną innego obrazu [ALLEGRO 5]

Ostatnio zmodyfikowano 2012-08-21 14:28
Autor Wiadomość
Temes
Temat założony przez niniejszego użytkownika
Kolizja obrazu z przekątną innego obrazu [ALLEGRO 5]
» 2012-08-21 12:27:44
Już kiedyś poruszałem ten temat. Przeczytałem również artykuły, które mi podaliście, lecz nadal tego nie rozumiem i nie umiem zastosować.

Wpierw przedstawię obrazy:

1. Niebieska kropka i cień to gracz (32x32). Zielona kafelka to mapa oznaczona jako "1" w tabeli Map[x][x] (64x32):
http://desmond.imageshack.us/Himg696/scaled.php?server=696&filename=39923043.png&res=landing

2. Tak powinna wyglądać kolizja. Gracz nie powinien wyjść za zielone "pole", czyli przekątną 1/4 obrazu (przekątna 32x16):
http://desmond.imageshack.us/Himg96/scaled.php?server=96&filename=78753931.png&res=landing

3. Niestety, nie mam pojęcia jak zrobić kolizje z przekątną obrazu, więc dzieje się tak:
http://desmond.imageshack.us/Himg715/scaled.php?server=715&filename=64779146.png&res=landing

Kod:
C/C++
// Biblioteki i deklaracje różnych operacji
ALLEGRO_DISPLAY * OknoAplikacji = al_create_display( 800, 600 );
ALLEGRO_BITMAP * Ghost = al_load_bitmap( "Media/Players/ghost.png" ); // Gracz
ALLEGRO_BITMAP * Wall = al_load_bitmap( "Media/Terrain/grass_01.png" ); // Zielone pole
ALLEGRO_BITMAP * Black = al_load_bitmap( "Media/Backgrounds/black.png" ); // Czarne tło

ALLEGRO_KEYBOARD_STATE StatusKlawiatury1; // klawiatura

int Mapa[ 2 ][ 2 ] = {
    1, 1,
    1, 1
};
int PrzesunX = - 368; //Zmienne odpowiadajace za poruszanie sie ekranu
int PrzesunY = - 284;

// No i glowna petla gry, ktora wyswietla wszystko

do {
    al_draw_bitmap( Black, 0, 0, 0 );
    for( int i = 1; i <= 2; i++ ) {
        for( int ii = 1; ii <= 2; ii++ ) {
            if( Mapa[ i ][ ii ] == 1 ) al_draw_bitmap( Wall, ii * 64 - PrzesunX, i * 32 - PrzesunY, 0 );
           
        }
    }
    al_draw_bitmap( Ghost, 368, 284, 0 );
    al_flip_display();
    al_get_keyboard_state( & StatusKlawiatury1 );
    if( al_key_down( & StatusKlawiatury1, ALLEGRO_KEY_RIGHT ) ) {
        PrzesunX += 2;
        al_rest( 0.1 );
    }
    if( al_key_down( & StatusKlawiatury1, ALLEGRO_KEY_LEFT ) ) {
        PrzesunX -= 2;
        al_rest( 0.1 );
    }
    if( al_key_down( & StatusKlawiatury1, ALLEGRO_KEY_UP ) ) {
        PrzesunY -= 2;
        al_rest( 0.1 );
    }
    if( al_key_down( & StatusKlawiatury1, ALLEGRO_KEY_DOWN ) ) {
        PrzesunY += 2;
        al_rest( 0.1 );
    }
} while( !al_key_down( & StatusKlawiatury1, ALLEGRO_KEY_ENTER ) );

PS. Nie wiem czemu, ale gra powinna wyswietlic 4 kafelki (zielone pola), a wyswietla jeden...

W powyższym kodzie nie ma kolizji, gdyż nie wiem jak to napisać...

Proszę o pomoc, gdyż to stoi mi na drodze, aby zacząć tworzyć grę... Bardzo chcę się tego nauczyć, aby wykorzystać w przyszłości.
P-63169
DejaVu
» 2012-08-21 12:37:09
Kolizje z obiektami obróconymi nie należą do łatwych. Jedną z możliwych metod jest napisanie algorytmu do wykrywania kolizji linia/linia. Do tego dokładasz algorytm wykrywający kolizje obiektów zbudowanych z linii, a potem jeszcze algorytm wykrywający czy okręgi kolidują ze sobą, no i na końcu algorytm ogólny do wykrywania kolizji na dużej scenie. Druga opcja to poświęcić kilka dni na naukę biblioteki Box2D i nauczyć się z niej korzystać to z miejsca dostaniesz obsługę fizyki i obsługę kolizji, a grę nadal możesz napisać taką jaką chcesz (no i znajomością biblioteki też możesz się pochwalić).
P-63172
waxx
» 2012-08-21 14:28:19
jesli chodzi o obrocone obiekty to musisz zaimplementowac kolizje OBB

http://www.sfml-dev.org/wiki/en/sources/simple_collision_detection

tu masz gotowy kod do sfmla, starczy sie wczytac i przerobic do swoich potrzeb
P-63184
« 1 »
  Strona 1 z 1