[SFML]Płynna zmiana koloru...
Ostatnio zmodyfikowano 2013-04-17 18:42
ridic14 Temat założony przez niniejszego użytkownika |
[SFML]Płynna zmiana koloru... » 2013-04-17 16:53:53 Albo to jest takie proste że aż nie mogę na to wpaść albo po prostu źle do tego podchodzę... Próbuję zrobić zmianę koloru w ten sposób: sf::Color changeColor( sf::Color from, sf::Color to, float time ) { sf::Color c = from; if( c.r > to.r + 1 || c.r < to.r - 1 ) { if( c.r > to.r ) c.r -= time; if( c.r < to.r ) c.r += time; std::cout << "R: " <<( int ) c.r << " "; } if( c.g > to.g + 1 || c.g < to.g - 1 ) { if( c.g > to.g ) c.g -= time; if( c.g < to.g ) c.g += time; std::cout << "G: " <<( int ) c.g << " "; } if( c.b > to.b + 1 || c.b < to.b - 1 ) { if( c.b > to.b ) c.b -= time; if( c.b < to.b ) c.b += time; std::cout << "B: " <<( int ) c.b << " "; } std::cout << std::endl; return c; }
niestety w ten sposób raczej dużo się nie zmienia przy takim użyciu: sf::Color col = sf::Color::Green; col = changeColor( col, sf::Color::Blue );
App.clear( col );
W warunkach sprawdzam czy obecne wartości kolorów są większe czy mniejsze jeśli są w okolicach docelowego koloru to nie zmieniam. (do tego momentu kod działa tak jak bym chciał :D) Jeśli warunek jest spełniony dodaję lub odejmuję w zależności od tego co trzeba zrobić (no i to że tak powiem funkcja nie funkcjonuje tzn. działa tylko raz [funkcja wywoływana jest w pętli głównej])... Wydaje mi się że mój sposób od początku jest przegrany :D. Jeśli ktoś ma czas żeby teoretycznie omówić jakby to miało wyglądać albo nakierować co zrobić to z chęcią "posłucham" :P. //Edit |
|
pekfos |
» 2013-04-17 16:59:30 Zdecydowanie przekombinowałeś. Do liniowych gradientów używa się interpolacji liniowej (poczytaj na googlach) i zwykle zajmuje to parę linii kodu. |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2013-04-17 17:44:12 U mnie ta interpolacja prezentuje się tak: int interpolacja( int a1, int a2, int b1, int b2, int dlaArg ) { int a, b, y; a =( b2 - a2 ) /( b1 - a1 ); b =(( - a1 ) *( b2 - a2 ) -( b1 - a1 ) *( - a2 ) ) /( b2 - a1 ); y = a * dlaArg + b; return y; }
Nie wiem... chyba nie kumaty jestem bo nie wiem jak to powiązać ze zmianą koloru... |
|
pekfos |
» 2013-04-17 17:47:54 Hmm, a co to? Powinno być tak: (chyba da się to zrobić używając wyłącznie arytmetyki kolorów w SFML) (kolor docelowy - kolor poczatkowy) * (t / T) + kolor poczatkowy
|
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2013-04-17 18:07:16 Obiekty kolorów w SFML nie mają operatora '-'. Więc można by było zrobić tak: sf::Color changeColor( sf::Color from, sf::Color to, float time ) { sf::Color c = from; c.r =( to.r - from.r ) * time; c.g =( to.g - from.g ) * time; c.b =( to.b - from.b ) * time; c += from; return c; } Ale to też działa jakby chciało a nie mogło(kod działa ale nie robi tego co trzeba :D) |
|
pekfos |
» 2013-04-17 18:15:42 Co podajesz jako time? |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2013-04-17 18:18:32 Standardowo 1, sprawdzałem też z deltą czasu (czas obecny - czas pobrany w poprzedniej pętli)... |
|
pekfos |
» 2013-04-17 18:21:24 A podałem wzór.. (i podobno coś przeczytałeś) |
|
« 1 » 2 |