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:

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:

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

A częściowo na zielonym prymitywie:

    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.

0

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

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:

    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.

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.

0

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

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.

(...)
    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.

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

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.

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1