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

[Allegro] Buforowanie a rysowanie

Ostatnio zmodyfikowano 2009-01-03 10:54
Autor Wiadomość
Damien
Temat założony przez niniejszego użytkownika
[Allegro] Buforowanie a rysowanie
» 2008-12-31 16:40:46
Witam wszystkich. Mój problem wygląda następująco. Kurs allegro z tej stronki skończyłem wczoraj ;D Mam zamiar napisać grę w której będziemy rysować świat dla idących ludzików. No właśnie... przy podwójnym buforowaniu bufor jest czyszczony a ja chcę żeby na nim zostały tworzone rysunki w tyn celu tworzę np. mały prostokąt o współrzędnych myszki przy kliknięciu lpm. Próbowałem już kilka sposobów i żaden nie jest dobry tzn przy jednym miga, przy drugim po od kliknięciu lpm rysunek znika itd... Na razie to wygląda tak, że na ekranie odtwarzana jest animacja chodzenia ludzika(human) a ma wyglądać że bez przerywania animacji sobie rysuję. Oto fragment kodu:

C/C++
void game()
{
    int bit_x = 100;
    play_sample( lv1sound, 255, 127, 1000, 1 );
    while( !key[ KEY_ESC ] )
    {
        while( mouse_b == 1 )
        {
           
        }
        for( int i = 0; i <= 9; i++ )
        {
            clear_to_color( bufor, makecol( 255, 255, 255 ) );
            masked_blit( human, bufor, bit_x, 2, 100, 100, 100, 180 );
            blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
            bit_x = bit_x + 265;
            rest( 100 );
        }
        if( bit_x <= 2750 ) bit_x = 100;
       
    }
}

PS. Wesołego nowego roku :)
P-3120
DejaVu
» 2008-12-31 17:01:29
Jeśli cokolwiek rysujesz w programie to jego budowa musi wyglądać tak:
C/C++
while( !key[ ESC ] )
{
    //1. wyczyść bufor
   
    //2. rysuj po buforze 
   
    //3. wyświetl bufor na ekran
} //while

Warto zaznaczyć, że w ptk 2. nie mogą być zastosowane żadne pętle do animacji, bo wyświetli się wszystko na sobie. Jeśli chcesz zrobić animację musisz zrobić coś takiego:
C/C++
int licznik = 0; //zmienna PRZED pętlą while(...)
//...

//Ptk 2:
licznik++;
switch( licznik % 4 )
{
case 0:
    //rysuj klatke #1
break:
case 1:
    //rysuj klatke #2
    break;
case 2:
    //rysuj klatke #3
    break;
case 3:
    //rysuj klatke #4
    break;
}
P-3123
lynx
» 2008-12-31 18:15:05
To zastosuj sobie po 3 buforowanie. :) W pierwszym jest rysowana mapa przez użytkownika. W 2 rysowany jest pierwszy bufor, wraz z ludzikiem, animacjami, i czyszceniem. Natomist w 3 bufor to ekran na którym wyświetlany jest 2 bufor. :)
P-3130
Damien
Temat założony przez niniejszego użytkownika
» 2008-12-31 19:20:29
Dziękuję obu panom za pomoc. Teraz wszystko działa jak należy :)
P-3134
Damien
Temat założony przez niniejszego użytkownika
» 2009-01-01 23:22:06
Witam ponownie.
Żeby nie zakładać nowego tematu piszę w tym ;) Więc problem jest taki: jedna bitmapa odpowiada za bohatera z nią powiązane są wszystkie wydarzenia itp. Jakim sposobem zrobić żeby wyświetlało mi tego bohatera w różnych miejscach ale żeby zdarzenia dotyczyły tylko tego wybranego np. jest wyświetlanych 10 (to wiem jak zrobić) i jeden z nich podchodzi do krawędzi i upada. W jaki sposób zrobić żeby upadanie dotyczyło tylko tego jednego a nie ich wszystkich?? Jest na to jakiś
w miarę łatwy sposób który nie wymaga dużych zmian w kodzie?? :)
P-3186
DejaVu
» 2009-01-02 02:36:46
Załóż osobny temat, bo to nie dotyczy ani buforowania ani rysowania tylko technicznego rozwiązania problemu poruszana kilku obiektów niezależnie.
P-3192
Damien
Temat założony przez niniejszego użytkownika
» 2009-01-02 21:27:06
Aha. Co do tego potrójnego buforowania. W tym rozwiązaniu które podał Pietrzuch. Zrobiłem tak że jak coś skończymy rysować to bufor z rysunkiem zaczyna spadać (czyli efekt taki że rysunek poddawany jest grawitacji), spadanie odbywa się na drodze zmiany pozycji y bufora z rysunkiem. Nieruchome tło musi być na innym buforze więc umieściłem je na drugim. No i teraz rysunek jest zawsze za tłem np za budynkiem. Jest jakiś sposób żeby był zawsze na wierzchu?? Byłbym  zadowolony np z takiego polecenia które kopiowałoby wszystko danym kolorze z jednego bufora na drugi. Istnieje coś takiego?
Ps. Mam nadzieję że wyraziłem swój problem zrozumiale :)
P-3240
lynx
» 2009-01-02 21:46:47
Jest jakiś sposób żeby był zawsze na wierzchu??
Jest i to bardzo prosty. Z tego co wyczytałem wnioskuję, że ty najpierw rysujesz w drugim buforze:
[li]1. bufor 3[/li]
[li]2. tlo[/li]
[li]3. ludziki i animacje[/li]
Wystarczy że zamienisz odpowiednio kolejność rysowania(1 z 2) w buforze 2 i wszystko będzie ok. :)
P-3244
« 1 » 2
  Strona 1 z 2 Następna strona