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

[SFML]Płynna zmiana koloru...

Ostatnio zmodyfikowano 2013-04-17 18:42
Autor Wiadomość
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:

C/C++
sf::Color changeColor( sf::Color from, sf::Color to, float time ) // trzeci argument jest domyślnie = 1;
{
    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:
C/C++
//Pętla główna programu
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
P-80718
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.
P-80720
ridic14
Temat założony przez niniejszego użytkownika
» 2013-04-17 17:44:12
U mnie ta interpolacja prezentuje się tak:
C/C++
int interpolacja( int a1, int a2, int b1, int b2, int dlaArg )
{
    int a, b, y; ///argumenty: współczynnik kierunkowy prostej, drugi parametr ze wzoru, wartośc dla argumentu 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...
P-80726
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
P-80728
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:
C/C++
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)
 
P-80731
pekfos
» 2013-04-17 18:15:42
Co podajesz jako time?
P-80733
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)...
P-80737
pekfos
» 2013-04-17 18:21:24
C/C++
( x - y ) * 1 + y = x //a nie wartość pośrednia
A podałem wzór.. (i podobno coś przeczytałeś)
P-80738
« 1 » 2
  Strona 1 z 2 Następna strona