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ć? void main_menu( sf::RenderWindow * oknoAplikacji ) { bool actual_bg = true; bool work = false; double tlo_alpha = 255; sf::Texture bg; bg.loadFromFile( "resouces/menubg.png" ); sf::Texture bg2; bg2.loadFromFile( "resouces/menubg2.png" ); sf::Sprite menubg; menubg.setTexture( bg ); sf::Sprite menubg2; menubg2.setTexture( bg2 ); menubg2.setColor( sf::Color( 255, 255, 255, 0 ) ); sf::Clock zmianabg; while( oknoAplikacji->isOpen() ) { sf::Event zdarzenie; while( oknoAplikacji->pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Event::Closed ) oknoAplikacji->close(); }; if( !work ) { if( zmianabg.getElapsedTime().asSeconds() >= 20 ) { work = true; zmianabg.restart(); }; } else { if( actual_bg ) { 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 { 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(); }; };
|
|
MrPoxipol |
» 2014-03-15 16:03:28 Słowo klucz: Interpolacja liniowa i sf::Color, ew tweener. |
|
Wrzud |
» 2014-03-15 16:10:01 Nie żaden klucz tylko się programować ucz. Od timerów zacznij Wać Panie. |
|
kokon Temat założony przez niniejszego użytkownika |
» 2014-03-15 16:41:07 Od timerów to znaczy? Mam zastosowane sf::Clock: sf::Clock zmianabg;
tlo_alpha -= 255 / 100 * zmianabg.restart().asMilliseconds();
|
|
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. |
|
pekfos |
» 2014-03-15 17:14:49 tlo_alpha = 255 * sin( zmianabg.getElapsedTime().asSeconds() );
I wtedy wywal połowę programu, bo nie będzie potrzebna. |
|
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? |
|
pekfos |
» 2014-03-15 17:46:15 Jeśli rozumie, o czym my w ogóle do niego piszemy, to nie. |
|
« 1 » 2 |