Table of Contents

Classe Filter par Nothingness0x.

La classe Filter a pour but d'appliquer des filtres à vos fenêtres. Pratique lors d'une transition pour baisser la luminosité petit à petit jusqu'à un noir complet puis la remettre à la normale, ou encore pour simuler la nuit qui tombe par exemple.

A noter que j'utilise lors de ce test une image complétement noir de la taille de ma fenêtre (ici 800×600). Utiliser une image d'une autre couleur pour produire un autre type d'effet est bien sur envisageable. (Par exemple créer un effet de flash à l'aide d'un filtre blanc).

Je m'éxuse d'avance pour les commentaires dans un anglais peut-être pas parfait, mais qui je pense reste compréhensible. Bref voici le code :

filter.h

#ifndef FILTER_H_INCLUDED
#define FILTER_H_INCLUDED
 
class Filter{
 
    private :
 
    sf::Sprite m_filter;
    sf::Clock m_clockFilter;
    float m_filterDelay; //The delay bewteen two alpha removing
    float m_alphaChanger; //Number of alpha decrease or increase at each frame (1 : Slow, 2.5 : Medium, 5 : Fast)
    float m_alphaColor; //Current Alpha color of the filter
    bool m_filterIn; //To know if we have to do a fade out or a fade in
    bool m_runFade; //Activate the fade
 
 
    public :
 
    Filter();
    Filter::Filter(sf::Image &imageFilter,float newAlphaChanger); //newAlphaChanger is the speed of the filter application
    ~Filter();
 
    void runFilter(); //Do a fade out or a fade in using the filter
 
    sf::Sprite getFilter()const; //Display the filter
    float getAlphaColor() const; //Return the current alpha color of the filter
    float getAlphaChanger() const; //Return the time between two alpha changing
 
 
    void setFilterDelay(float newDelay);
 
    void setFilter(sf::Image &newFilter); //Change the filter
    void setAlphaColor(float newAlphaColor); //Change manually alpha color if you want a constent filter
    void setAlphaChanger(float newAlphaChanger); //To change the rapidity of the fade in or the fade out
 
    void changeFade(bool fade); //Change a fade in to a fade out or a fade out to a fade in
 
};
 
#endif // FILTER_H_INCLUDED

filter.cpp

#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
 
#include"filter.h"
 
 
 
Filter::Filter()
{
 
}
 
Filter::Filter(sf::Image &imageFilter,float newAlphaChanger)
{
    m_filter.SetImage(imageFilter);
    m_filterDelay=0.01;
    m_alphaChanger=newAlphaChanger;
    m_runFade=false;
    m_alphaColor=0;
    m_filter.SetColor(sf::Color(255,255,255,m_alphaColor));
}
 
Filter::~Filter()
{
 
}
 
 
 
void Filter::runFilter()
{
    if((m_filterIn) && (m_runFade))
    {
        if((m_alphaColor<=255) && (m_clockFilter.GetElapsedTime()>m_filterDelay))
        {
            m_filter.SetColor(sf::Color(255,255,255,m_alphaColor+=m_alphaChanger));
            m_clockFilter.Reset();
        }
 
        if(m_alphaColor>255)
        {
            m_filter.SetColor(sf::Color(255,255,255,m_alphaColor=255));
            m_runFade=false;
        }
    }
    else if((!m_filterIn) && (m_runFade))
    {
        if((m_alphaColor>=0) && (m_clockFilter.GetElapsedTime()>m_filterDelay))
        {
            m_filter.SetColor(sf::Color(255,255,255,m_alphaColor-=m_alphaChanger));
            m_clockFilter.Reset();
        }
 
        if(m_alphaColor<0)
        {
            m_filter.SetColor(sf::Color(255,255,255,m_alphaColor=0));
            m_runFade=false;
        }
    }
}
 
 
sf::Sprite Filter::getFilter()const
{
    return m_filter;
}
 
float Filter::getAlphaColor() const
{
    return m_alphaColor;
}
 
float Filter::getAlphaChanger() const
{
    return m_alphaChanger;
}
 
 
 
void Filter::setFilterDelay(float newDelay)
{
    m_filterDelay=newDelay;
}
 
void Filter::setFilter(sf::Image &newFilter)
{
    m_filter.SetImage(newFilter);
}
 
void Filter::setAlphaColor(float newAlphaColor)
{
    m_filter.SetColor(sf::Color(255,255,255,newAlphaColor));
}
 
void Filter::setAlphaChanger(float newAlphaChanger)
{
    m_alphaChanger=newAlphaChanger;
}
 
void Filter::changeFade(bool fade)
{
    m_runFade=true;
 
    if(fade)
    {
        m_alphaColor=0;
        m_filter.SetColor(sf::Color(255,255,255,m_alphaColor));
        m_filterIn=true;
    }
    else
    {
        m_alphaColor=255;
        m_filter.SetColor(sf::Color(255,255,255,m_alphaColor));
        m_filterIn=false;
    }
}

main.cpp

#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
 
 
#include "filter.h"
 
int main()
{
    sf::RenderWindow App(sf::VideoMode(800 , 600, 32), "Filter");
 
    sf::Image imageFilter;
    if (!imageFilter.LoadFromFile("images/filter/blackfilter.png"))
    {
        // Error
    }
 
 
    Filter gameFilter(imageFilter,1);
 
 
    while(App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if (Event.Type == sf::Event::Closed)
            App.Close();
 
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::A))
            gameFilter.changeFade(true);
 
 
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Z))
            gameFilter.changeFade(false);
        }
 
 
        App.Clear(sf::Color::Red);
 
        gameFilter.runFilter();
        App.Draw(gameFilter.getFilter());
 
 
        App.Display();
    }
    return 0;
}

Voilà, j'ai volontairement peint la fenêtre en rouge pour bien pouvoir observer l'application du filtre en appuyant sur A pour le mettre et Z pour l'enlever. Il y a bien sur beaucoup d'autres utilisations possible autrement qu'à l'aide d'évenements, mais c'était pour faire une démonstration rapide de l'utilité de la classe.

Rappel : Il faut charger une image noir de la taille de votre fenêtre (ici 800×600) faite tout bêtement sur paint pour le bon fonctionnement de ce test. Je ne fournis pas ici l'image utilisée pour le test étant donné la facilité pour se procurer la même.

 
fr/sources/filter.txt · Last modified: 2009/12/28 14:22 by nothingness0x
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki