Autor Wątek: Allegro, niedomagająca funkcja: masked_blit(...)  (Przeczytany 2471 razy)

Offline Moriturius

  • Użytkownik

# Sierpień 17, 2006, 09:40:45
Wyjaśnienie: (tego nie trzeba czytac)
Jako, że uważam, że wszystkiego trzeba w życiu spróbować postanowiłem pobawić sie przez jakiś czas z Allegro. No i natknąłem się na jakiśtam kurs w necie i na 4 lekcji juz sie pojawily problemy :)

Problem:
Mam więc bitmapę z jakimś obszarem różowym ( rgb[255, 0, 255] )  i przy uzywaniu masked_blit() oraz draw_sprite() ten obszar jest nadal widoczny kiedy mam depth=32bits, na 16 dziala bezproblemowo. Czy jest jakis sposob aby ustawic maske na 32 bitach?


Offline Mr. Spam

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

Offline Moriturius

  • Użytkownik

# Sierpień 17, 2006, 12:00:55
Ok, wynalazłem odpowiedź na moje pytanie. Ciekawi mnie tylko dlaczego od razu o tym nie pomyślałem :P

Otóż ażeby móc rysować bitmapy z przezroczystymi fragmentami należy użyć Alpha Blendingu tak jak to ma miejsce w OGL czy D3D wiec daleko szukac nie trzeba ;)

Zapewne jest jakiś lepszy sposób rozwiązania tego bo ten ma pewne wady:

car.tga - obrazek TGA z kanałem alpha

BITMAP *buffer = create_bitmap(screen->w, screen->h); // drugi bufor
BITMAP *car = load_bitmap("car.tga", NULL);

set_alpha_blender();

draw_trans_sprite(buffer, car, x, y); // wrzuc na bufor ekranu
blit(buffer, screen, 0, 0, 0, 0, screen->w, screen->h); // bufor->ekran

Jedną poważną wadą tego rozwiązania jest to że niestety nie daje sie skopiować fragmentu z danego obrazka z Alpha Blendingiem.
___________________________________

//EDIT:


A jeszcze przyszla mi jedna rzecz do glowy :P ( mam nadzieje ze za te monologi nie poleca mi minusy do karmy - ja tutaj pracuje dla ludzi ktorzy w przyszlosci beda tego szukac :D ) Otóż mozna powyzsze ograniczenie obejsc w bardzo prosty sposób:


BITMAP *buffer = create_bitmap(screen->w, screen->h); // drugi bufor
BITMAP *car = load_bitmap("car.tga", NULL);
BITMAP *frame = create_bitmap(100, 50); // bitmapa pomocnicza

set_alpha_blender();

blit(frame, car, 100, 0, 0, 0, 100, 50); // skopiuj 2 klatke animacji do frame'a
draw_trans_sprite(buffer, frame, x, y); // wrzuc na bufor ekranu

blit(buffer, screen, 0, 0, 0, 0, screen->w, screen->h); // bufor->ekran

No i tym sposobem problem został rozwiązany i nawet jesli bez udziału forumowiczów to przyda sie napewno komuś w przyszłości :)
« Ostatnia zmiana: Sierpień 17, 2006, 12:56:12 wysłana przez Moriturius »