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

[Allegro C++] Grafika w tle, wyświetlanie grafiki na grafice.

Ostatnio zmodyfikowano 2011-04-10 06:23
Autor Wiadomość
thamiar
Temat założony przez niniejszego użytkownika
[Allegro C++] Grafika w tle, wyświetlanie grafiki na grafice.
» 2011-04-09 20:43:43
Witam!
Niedawno zacząłem zabawę w C++ i gdy tylko usłyszałem o czymś takim jak biblioteki graficzne, odrazu zabrałem się za poszukiwania ;)
W końcu natrafiłem na allegro wraz z poradnikiem http://cpp0x.pl/kursy/Kurs-Allegro-C++/Bitmapy/66 na tej stronce i muszę powiedzieć, że jestem pod wrażeniem możliwości jakie zapewnia owa biblioteka ;)

Do rzeczy: Natrafiłem na następujący problem! Otóż chciałbym wyświetlić grafikę na graficę (Jakkolwiek to brzmi.)
Jako najprostrzy przykład: Grafika tła:Trawa, a po niej ma poruszać się ludzik.
Udało mi się to  zrobić na chłopski rozum...tj. za każdym razem najpierw wyświetlana jest mapa, potem ludzik.
Niestety, z tego powodu ekran co jakiś czas miga na szaro...
Po drugie, jeśli chcialbym wyświetlić jakieś inne elementy tła musiałbym je za każdym razem wyświetlać... a chyba nie o to chodzi?

Dało by się to zrobić porządniej? tak aby bufor nie usuwał tła or sth?

C/C++
int ludek_x = 100, ludek_y = 100;
int frame = 0;

while( !key[ KEY_ESC ] )
{
    draw_sprite( bufor, ludek0, ludek_x, ludek_y );
    while( speed > 0 )
    {
       
        if( key[ KEY_LEFT ] ) { ludek_x--; clear_to_color( bufor, makecol( 150, 150, 150 ) );
           
            if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl0, ludek_x, ludek_y ); }
            else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl1, ludek_x, ludek_y ); }
            else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl2, ludek_x, ludek_y ); }
            else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl3, ludek_x, ludek_y ); }
           
            blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); }
        else { if( key[ KEY_RIGHT ] ) { ludek_x++; clear_to_color( bufor, makecol( 150, 150, 150 ) );
               
                if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp0, ludek_x, ludek_y ); }
                else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp1, ludek_x, ludek_y ); }
                else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp2, ludek_x, ludek_y ); }
                else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp3, ludek_x, ludek_y ); }
               
                blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); }
            else { if( key[ KEY_UP ] ) { ludek_y--; clear_to_color( bufor, makecol( 150, 150, 150 ) );
                   
                    if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg0, ludek_x, ludek_y ); }
                    else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg1, ludek_x, ludek_y ); }
                    else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg2, ludek_x, ludek_y ); }
                    else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg3, ludek_x, ludek_y ); }
                   
                    blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); }
               
                else { if( key[ KEY_DOWN ] ) { ludek_y++; clear_to_color( bufor, makecol( 150, 150, 150 ) );
                       
                        if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek0, ludek_x, ludek_y ); }
                        else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek1, ludek_x, ludek_y ); }
                        else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek2, ludek_x, ludek_y ); }
                        else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek3, ludek_x, ludek_y ); }
                       
                        blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); }
                } } }
        speed--;
       
        frame++;
        if( frame > 40 ) frame = 0;
       
    }
P-30515
ison
» 2011-04-09 20:48:11
spójrz co się dzieje jeśli w pewnym momencie frame jest równe 40, nic wtedy nie wyświetlasz - dlatego co chwilę ekran mruga ;)
zamień
C/C++
if( frame > 40 ) frame = 0;

na
C/C++
if( frame >= 40 ) frame = 0;


zreorganizuj kod bo masz bałagan, niepotrzebnie w każdym warunku wyświetlasz osobno trawę skoro możesz ją wyświetlać na początku pętli?

tak powinien wyglądać Twój kod:
C/C++
while( !key[ KEY_ESC ] )
{
    while( speed > 0 )
    {
        clear_to_color( bufor, makecol( 150, 150, 150 );
        draw_sprite( bufor, trawa, 0, 0 );
        if( key[ KEY_LEFT ] ) ludek_x--;
       
        if( key[ KEY_RIGHT ] ) ludek_x++;
       
        if( key[ KEY_UP ] ) ludek_y--;
       
        if( key[ KEY_DOWN ] ) ludek_y++;
       
        if( frame < 10 ) draw_sprite( bufor, ludek0, ludek_x, ludek_y );
        else if( frame < 20 ) draw_sprite( bufor, ludek1, ludek_x, ludek_y );
        else if( frame < 30 ) draw_sprite( bufor, ludek2, ludek_x, ludek_y );
        else draw_sprite( bufor, ludek3, ludek_x, ludek_y );
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
        speed--;
        frame++;
        if( frame >= 40 ) frame = 0;
       
    }
}
robi to samo, a prawda że wygląda czytelniej? :)

//ups, nie zauważyłem że dla każdego kierunku jest osobna animacja, co nie zmienia faktu że warto by i tak zreorganizować kod, najlepiej będzie jak będziesz zapamiętywał kierunek w zmiennej, a sprity postaci trzymał w tablicy
C/C++
BITMAP * ludek[ 4 ][ 4 ];
pierwszy wymiar tablicy mówi o kierunku a drugi o aktualnej klatce animacji
C/C++
draw_sprite( bufor, ludek[ KIERUNEK ][ KLATKA ], ludek_x, ludek_y );
P-30517
thamiar
Temat założony przez niniejszego użytkownika
» 2011-04-09 21:06:59
Super! Nie zauważyłem tego błędu z frame ;) Nie ma jak nowicjusz hehe.

Co do kodu wysłanego przez Ciebie, owszem wgląda przejrzyściej. Ale Ja wyświetlam grafiki w zależności od strzałki. Tzn ludzikl 0-3 dla lewej strzałki, ludzikp 0-3 dla prawej, ludzik dla strzałki w górę itp.

Poczatkowo wstawiałem przd pętlą...niestety nic to nie dawało.
Jednak dzięki Twojej poradzie, znalazłem błęd logiczny. Usunąłem clear_to_color( bufor, makecol( 150, 150, 150 ) ); przy każdym ludziku, wstawiając go na poczatku pętli.

Wielkie dzięki!

Btw. Jak cytować na tym forum? Standarowe [quote][/quote] nie działa.
P-30523
malan
» 2011-04-09 21:08:30
» KursyKurs STC kurs
P-30524
thamiar
Temat założony przez niniejszego użytkownika
» 2011-04-09 22:32:17
Jeszcze raz dziękuje za pomoc.
Coby nie zakładać nowego tematu, chcialbym zadać jeszcze jedno pytanie.
Otóż na trawce w polu 0,0 wstawiłem grafikę głazika o wymiarach 52x32 i chciałbym by ludzik nie mógł po nim przechodzić.
        if( key[ KEY_LEFT ] ) {if(ludek_x<=52&&ludek_y<=30); else{ludek_x--;

if( frame < 10 ) {  draw_sprite( bufor, ludekl0, ludek_x, ludek_y ); }
else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, ludekl1, ludek_x, ludek_y ); }
else if( frame >= 20 && frame < 30 ) {  draw_sprite( bufor, ludekl2, ludek_x, ludek_y ); }
else if( frame >= 30 && frame < 40 ) {  draw_sprite( bufor, ludekl3, ludek_x, ludek_y ); }

blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
}}

Działa. Tyle, że musiałbym wpisywać warunek dla każdej przeszkody oddzielnie w ifie dla wszystkich czterech klawiszy.

Da się to zrobić inaczej? Myślałem nad zrobieniem czegośw stylu tablicy dwuwymiarowej wypełnionej 0(blokada przejścia) i 1 (przejśce). Ale nie wiem, czy coś takiego zdało by egzamin, szczególnie w allegro, gdzie mogę poruszać ludzikiem w bardzo dokładny sposób.
P-30526
szyx_yankez
» 2011-04-10 06:23:53
1. Na forum panuje zasada: jeden problem = jeden temat.
2. Poczytaj o kolizjach.
P-30532
« 1 »
  Strona 1 z 1