Autor Wątek: [Allegro] Podwójne buforowanie.  (Przeczytany 1341 razy)

Offline kalmah

  • Użytkownik

# Styczeń 17, 2012, 02:02:07
Witam. Chciałem spróbować swoich sił i zacząłem pisać prostą grę 2D w Allegro 4. Napisałem proste menu i wczytywanie map kafelkowych z pliku. Mapa jest przechowywana w bitmapie "mapa". W pętli gry mam taki kod:
clear_bitmap( bufor05 );
blit( mapa, bufor05, 0, 0, 0, 0, 1024, 768 );
draw_sprite( bufor05, anim2, pla2.x, pla2.y);
blit( bufor05, screen, 0, 0, 0, 0, 1024, 768 );
pla2.x i pla2.y to pola struktury będące współrzędnymi poruszanej postaci,
anim2 to bitmapa z ludkiem, a  bufor05 to bufor.
Po włączeniu gry i wczytaniu mapy, widać mapę i ludka, ale nie da się nim sterować.
Po dodaniuclear_bitmap( screen ); okazuje się, że kod działa i ludzik naprawdę się ruszał, ale wtedy pojawia się problem z miganiem ekranu i czarnymi pasami.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Santor

  • Użytkownik

# Styczeń 17, 2012, 22:12:51
Moze po prostu w zlej kolejnosci wyswietlasz wszystko? Najpierw wyswietlaj mape potem ludka potem HUD'a. I odswiezaj ekran tylko raz na pętle na jej koncu. Mam nadzieje że cos pomoglem:)

Offline Vxx

  • Użytkownik

# Styczeń 18, 2012, 09:39:06
Nie czyść ekranu tylko swój 'bufor05'.

Czyszczenie bufora -> Rysowanie na nim mapy -> Rysowanie na nim ludzików -> Blit bufora na screen -> Od nowa.

Ew. napisz sobie coś takiego:
void Swap() {
blit( Buffer, screen, 0,0,0,0, winw, winh);
clear_to_color(Buffer, makecol(100,100,250)); }
i wywołuj na końcu pętli, a wcześniej wszystko rysuj do tego bufora.
« Ostatnia zmiana: Styczeń 18, 2012, 09:44:51 wysłana przez Vxx »

Offline kalmah

  • Użytkownik

# Styczeń 18, 2012, 11:49:09
Dzięki za podpowiedzi, ale udało mi się ominąć problem robiąc tak:
bufor05 = create_video_bitmap( 1024, 768 ); zamiast zwykłej bitmapy.
while( ... ){
 //.......
 acquire_bitmap( bufor05 );
 blit( mapa, bufor05, 0, 0, 0, 0, 1024, 768 );
 draw_sprite( bufor05, anim2, pla2.x, pla2.y);
 blit( bufor05, screen, 0, 0, 0, 0, 1024, 768 );
 release_bitmap( bufor05 )
};
Teraz w żadnym miejscu nie czyszczę bufor05, ale działa tak jak chciałem, choć nie wiem dlaczego. :)

Offline quirinnos

  • Użytkownik

# Styczeń 18, 2012, 13:48:33
Ale to, imo, nie jest zbyt rozsądny sposób. Jeśli miałeś wyświetlanie w takiej kolejność jak Ci podali (czyszczenie, mapa, koleś, rzut na ekran), to musi być coś nie tak, może w innym miejscu w kodzie.