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

[allegro] odświeżanie bitmapy

Ostatnio zmodyfikowano 2011-04-08 23:28
Autor Wiadomość
musk
Temat założony przez niniejszego użytkownika
[allegro] odświeżanie bitmapy
» 2011-04-08 11:30:18
Witam wszytkich.

Może najpierw kod a potem wyjaśnie o co biega.


C/C++
void radar::rysuj( BITMAP * buff ) {
    rotate_sprite( b_radar, b_ws, 75, 150, itofix(( rad++ ) * 256 / 360 ) );
    masked_blit( b_radar, buff, 0, 0, 250, 250, b_radar->w, b_radar->h );
    b_radar = load_bmp( "radar.bmp", default_palette );
    //clear_bitmap(b_radar);
}

W powyższej metodzie najpierw rysuje na bitmapie b_radar bitmape b_ws która ma się docelowo obracać. A późneij bitmapa b_radar jest ryswana na buforze. Rozwiązanie takie bez dodatkowego czyszczenia czy ponownego ładownia bitmapy b_radar pozostawia ślad z poprzednio narysowanej bitmapy b_ws.
Problem jest taki, że potrzebuje metodę która "wyczyści" mi bitmape b_radar, tak by bitmapa ws nie pozostawiała na niej śladu. W tej chwili rozwiązałem to w ten sposób, jednak drastycznie spadła prędkośc obracania się bitmapy b_ws. Komentując linijkę
b_radar = load_bmp( "radar.bmp", default_palette );
 a zamiast tego korzystając z
clear_bitmap( b_radar );
 Prędkość obrotów bitmapy b_ws jest już ok ale z racji takiego a nie innego działania claer_bitmap efekt jest niezadowalający. Z angielskiego za dobry nie jestem i przebijanie się przez dokumentacje nie przyniosło rowiązania. ;/ Ma ktoś jakiś pomysł?
P-30434
SeaMonster131
» 2011-04-08 15:20:16
z kodu wynika że wczytujesz bitmapę podczas rysowania, może dlatego tak wolno działa?

#ahh..sory, nie doczytałem do końca :)
P-30446
DejaVu
» 2011-04-08 17:12:59
Wolno działa bo wczytujesz co chwilę bitmapę. Wczytaj ją na gdzieś na początku programu i potem korzystaj z załadowanych danych. Z tego co zrozumiałem Twoim problemem jest właśnie to owe wolne działanie.

/edit:
A tak poza tym masz też polską dokumentację do dyspozycji, która jest tworzona przez nasz serwis:
http://cpp0x.pl/dokumentacja/Allegro-4-4/Bitmapy-rysowanie/19
P-30448
musk
Temat założony przez niniejszego użytkownika
» 2011-04-08 18:16:29
Bardziej chodziło mi o to, że na bitmapie b_radar zostaje ślad po rysowanej na niej bitmapie b_ws. Myślałem, że jest jakaś funkcja która mi przywróci ową bitmape do pierwotnego stanu. Pierwszym pomysłem było, żeby ładować na nowo czystą bitmape do b_radar ale wolniej chodziło, teraz zrobiłem prawie tak jak mówisz. Dodałem kolejną zmienną przechowującą bitmapę b_radar i wyswietlam ją masked_blit-em na tej na której jest rysowane coś.

C/C++
void radar::rysuj( BITMAP * buff ) {
    masked_blit( b_radar, buff_radar, 0, 0, 0, 0, b_radar->w, b_radar->h );
    rotate_sprite( buff_radar, b_ws, 75, 150, itofix(( rad++ ) * 256 / 360 ) );
    masked_blit( buff_radar, buff, 0, 0, 250, 250, buff_radar->w, buff_radar->h );
}

Tak to teraz wygląda. Tylko, że przez to mnożą mi się bitmapy, program staje się mniej czytelny i w ogóle. ;/ Ma ktoś pomysł jak to rozwiązać inaczej? Z góry dziękuje za wszelkie podpowiedzi. :)
P-30450
malan
» 2011-04-08 19:09:04
Przecież masz dodatkowy bufor (
buff_radar
) - nie możesz jego czyścić?
C/C++
void radar::rysuj( BITMAP * buff )
{
    masked_blit( b_radar, buff_radar, 0, 0, 0, 0, b_radar->w, b_radar->h );
    rotate_sprite( buff_radar, b_ws, 75, 150, itofix(( rad++ ) * 256 / 360 ) );
    masked_blit( buff_radar, buff, 0, 0, 250, 250, buff_radar->w, buff_radar->h );
    clear_bitmap( buff_radar );
}
Ewentualnie możesz jeszcze pisać na główny bufor (
buff
). Wydaje mi się, że zadziała poprawie.
C/C++
void radar::rysuj( BITMAP * buff )
{
    masked_blit( b_radar, buff, 0, 0, 0, 0, b_radar->w, b_radar->h );
    rotate_sprite( buff, b_ws, 75, 150, itofix(( rad++ ) * 256 / 360 ) );
}
P-30454
musk
Temat założony przez niniejszego użytkownika
» 2011-04-08 23:28:56
Problem rozwiązany. Pierwotną bitmape mam zapamiętaną i potem można to tak opisać:
1. Kopiowanie bitmapy pierwotnej na bufor tejże bitmapy.
2. Rysowanie na buforze bitmapy.
3. Kopiowanie bufora bitmapy  do głównego bufora ekranu.
4. Przejście do pkt.1.

Dlatego stosuje dodatkowy bufor bitmapy bo łatwiej mi bedzie później wyświetlać elementy na tej bitmapie.  Nie musze liczyć położenie elementów względem ekranu. Zamykam.
Dzięki za pomoc.
P-30467
« 1 »
  Strona 1 z 1