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

[SFML] Płynna zmiana przezroczystości

Ostatnio zmodyfikowano 2014-03-15 19:56
Autor Wiadomość
kokon
Temat założony przez niniejszego użytkownika
[SFML] Płynna zmiana przezroczystości
» 2014-03-15 13:12:13
Witam!
Tworzę właśnie menu główne do mojej gry. W tej chwili zajmuję się menu głównym. W tle miały być dwa obrazki, które co 20 sekund się zmieniają (jeden na 2 i z powrotem). Niestety, ta zmiana, która miała być płynnym przejściem, strasznie się przycina i brzydko wygląda mimo zastosowania timerów. Ktoś wie jak temu zaradzić?

C/C++
void main_menu( sf::RenderWindow * oknoAplikacji )
{
    bool actual_bg = true;
    bool work = false;
    double tlo_alpha = 255;
   
    //Tekstury
    sf::Texture bg;
    bg.loadFromFile( "resouces/menubg.png" );
   
    sf::Texture bg2;
    bg2.loadFromFile( "resouces/menubg2.png" );
   
    //Sprite'y
    sf::Sprite menubg;
    menubg.setTexture( bg );
   
    sf::Sprite menubg2;
    menubg2.setTexture( bg2 );
    menubg2.setColor( sf::Color( 255, 255, 255, 0 ) );
   
    //Timery
    sf::Clock zmianabg;
   
    while( oknoAplikacji->isOpen() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji->pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji->close();
           
        };
       
       
        //Background
        if( !work )
        {
            if( zmianabg.getElapsedTime().asSeconds() >= 20 )
            {
                work = true;
                zmianabg.restart();
            };
        } else
        {
            if( actual_bg )
            {
                //Tlo 1
                if( tlo_alpha > 0 )
                {
                    tlo_alpha -= 255 / 100 * zmianabg.restart().asMilliseconds();
                   
                    menubg.setColor( sf::Color( 255, 255, 255, tlo_alpha ) );
                    menubg2.setColor( sf::Color( 255, 255, 255, 255 - tlo_alpha ) );
                } else
                {
                    work = !work;
                    actual_bg = !actual_bg;
                    tlo_alpha = 0;
                    menubg.setColor( sf::Color( 255, 255, 255, tlo_alpha ) );
                    menubg2.setColor( sf::Color( 255, 255, 255, 255 - tlo_alpha ) );
                    zmianabg.restart();
                };
            } else
            {
                //Tlo 2
                if( tlo_alpha <= 255 )
                {
                    tlo_alpha += 255 / 100 * zmianabg.restart().asMilliseconds();
                   
                    menubg.setColor( sf::Color( 255, 255, 255, tlo_alpha ) );
                    menubg2.setColor( sf::Color( 255, 255, 255, 255 - tlo_alpha ) );
                } else
                {
                    work = !work;
                    actual_bg = !actual_bg;
                    tlo_alpha = 255;
                    menubg.setColor( sf::Color( 255, 255, 255, tlo_alpha ) );
                    menubg2.setColor( sf::Color( 255, 255, 255, 255 - tlo_alpha ) );
                    zmianabg.restart();
                };
            }
        };
       
       
        oknoAplikacji->clear( sf::Color::Black );
        oknoAplikacji->draw( menubg );
        oknoAplikacji->draw( menubg2 );
       
        oknoAplikacji->display();
    };
};
P-106408
MrPoxipol
» 2014-03-15 16:03:28
Słowo klucz: Interpolacja liniowa i sf::Color, ew tweener.
P-106445
Wrzud
» 2014-03-15 16:10:01
Nie żaden klucz tylko się programować ucz. Od timerów zacznij Wać Panie.
P-106448
kokon
Temat założony przez niniejszego użytkownika
» 2014-03-15 16:41:07
Od timerów to znaczy? Mam zastosowane sf::Clock:
C/C++
sf::Clock zmianabg;
//...
tlo_alpha -= 255 / 100 * zmianabg.restart().asMilliseconds();
P-106454
MrPoxipol
» 2014-03-15 17:08:48
Jak chcesz to zrobić szybko i prosto to wykorzystaj wcześniej podaną bibliotekę do tweenowania, a nie słuchaj Wrzoda.
P-106459
pekfos
» 2014-03-15 17:14:49
C/C++
tlo_alpha = 255 * sin( zmianabg.getElapsedTime().asSeconds() );
I wtedy wywal połowę programu, bo nie będzie potrzebna.
P-106462
Wrzud
» 2014-03-15 17:42:47
Czym skorupka za młodu nasiąknie, tym na starość trąci. A co jeśli sinusy wejdą mu w krew i będzie kalał nimi każdy timer?
P-106464
pekfos
» 2014-03-15 17:46:15
Jeśli rozumie, o czym my w ogóle do niego piszemy, to nie.
P-106466
« 1 » 2
  Strona 1 z 2 Następna strona