Przezroczystość w Allegro 5

Przezroczystość w Allegro 5
0

Siemka,
Interesuje mnie, jak uzyskać dobrze wyglądającą przezroczystość w Allegro 5?
Zauważyłem, że niezależnie od wielkości przezroczystości w al_map_rgba na czarnym tle nie widać jakiejkolwiek różnicy. Gdy "pod" interesującym mnie prymitywem umieszczę np. czerwony wtedy coś się dzieje... Ale przyznam że jest to dosyć dziwne.
Chciałbym osiągnąć efekt "animacji" - pojawiania się danego prymitywu ( docelowo - tekstu) na czarnym tle. Napis byłby biały. W tym momencie korzystając z kodu:

Kopiuj
int licznik = 0;
    if( licznik < 255)
    {
        licznik++;
        al_draw_filled_rectangle(300, 20,400, 150,al_map_rgba(255,255,255,licznik));
    }

Pojawią się od razu biały biały prostokąt, nie ma efektu zmiany przezroczystości. Jest on wyświetlany częściowo na czarnym tle:

Kopiuj
    al_clear_to_color(al_map_rgb(0, 0, 0));

A częściowo na zielonym prymitywie:

Kopiuj
    al_draw_filled_rectangle(250, 100,450, 150,al_map_rgba(0,255,0,255));

. Jasność na obydwu fragmentach jest dokładnie taka sama.
Dodam, że dodany fragment programu jest umieszczony w pętli która wyświetla również inne elementy, czyści ekran itp.

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0

To co masz w warunku wykona się tylko raz dla przezroczystości 1. Dlatego nie widzisz tego co chcesz.

edytowany 2x, ostatnio: Sopelek
0

No tak, ale to akurat na ten moment było źle. Po prostu różne wersje testowałem i z bezsilności wstawiłem akurat taką.
Taka jest inna wersja:

Kopiuj
    licznik=0
    if( licznik < 255)
    {
        for (licznik=0; licznik<255; licznik++)
            al_draw_filled_rectangle(300, 20,400, 150,al_map_rgba(255,228,225,licznik));
    }

Ale efekt jest taki sam.

0

Jeszcze inaczej napiszę. Ten kod z pierwszej wiadomości, to ciało funkcji - która jest w pętli programu. Więc w każdym obiegu pętli się zwiększa ten licznik.

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0

Nie ważne czy w funkcji. I tak w twoim przypadku zawsze licznik ma wartość 0 na jej początku. Jeszcze spytam czy masz jakiś timer, bo jeśli nic nie reguluje szybkości programu i może przejść tak szybko, że nawet nie zauważysz.

edytowany 1x, ostatnio: Sopelek
0

To opiszę jednak dokładniej. Kod programu ma ponad 700 linijek, więc tylko prezentuję fragmenty z tym związane.

Kopiuj
void DrawIntro()
{
    if( licznik < 255)
    {
        al_draw_textf(font8, al_map_rgb(255, 255, 255), szer / 2, 450, ALLEGRO_ALIGN_CENTRE,
                  "licznik: %i", licznik);
        licznik++;
        al_draw_filled_rectangle(300, 20,400, 150,al_map_rgba(250,0,0,licznik));
    }
}

Jest to funkcja, która w założeniu ma zawierać animację - czyli jakieś pojawiąjące się teksty - teraz to tylko jeden prostokąt, by sprawdzić jak to działa. Dla testów też dodałem tutaj wyświetlanie licznika na środku ekranu. Ograniczenie do 255 dodałem ze względu że alpha powinno mieć wartości pomiędzy 0 a 255. A poza tym, jak się już pojawi to dalej już nic ma nie robić.
Zmienna licznik to zmienna globalna zainicjalizowana wartością 0.
Funkcję DrawIntro() wywołuję w pętli programu.

Kopiuj
(...)
    al_draw_filled_rectangle(250, 100,450, 150,al_map_rgb(0,255,0));
    DrawIntro();
(...)
    al_flip_display();

I powiem tak, że w zależności od tego jakie jest tło, różnie widać efekt zmiany przezroczystości. Timera też mam. Ale tak jak powiedziałem -to działa, ale na m.in. czarnym tle jest z tym problem.

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0

Ok. Jest bug w allegro, nie wiem czy został już naprawiony czy nie. W 5.0.9 jeszcze występuje. Mianowicie przy używaniu przezroczystości wszystkie składowe koloru trzeba pomnożyć przez alfę.
Musisz zrobić mnie więcej to co w kodzie poniżej

Kopiuj
while(licznik <= 255)
    {
        al_clear_to_color(al_map_rgb(0, 0, 0));
        float alpha = licznik * (1.0/255.0);
        al_draw_filled_rectangle(300, 20, 400, 150, al_map_rgba_f(250.0/255.0*alpha, 0, 0, alpha));
        Sleep(10);
        al_flip_display();
        ++licznik;
    }

Bug znałem jednak z tego co słyszałem występował on jedynie przy rysowaniu tekstów. Jak widać nie tylko.

edytowany 1x, ostatnio: Sopelek
0

Dziękuję za pomoc. Teraz działa odpowiednio, przynajmniej tak na szybko zdążyłem zauważyć. Przyznam, że to dość dziwny błąd, ale no cóż. Dodam, że używam wersji 5.0.9, chociaż widzę że jest dostępna stabilna wersja 5.0.10. Bo o wersja w trakcie tworzenia nie wspominam.
Jeszcze raz dziękuję za pomoc. Niestety jako gość nie mogę dać plusa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.