Tous les articles par Philippe Lucidarme

SFML: texte et police

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment charger une police et afficher du texte.

/*!
 * \file    main.cpp
 * \brief   start SFML in full screen and display a text (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme
 * \version 1.0
 * \date    12/18/2016
 */

// SFML libraries
#include 
#include 

int main()
{
    // _____________________
    // ::: Create window :::

    // Create a window with the same pixel depth as the desktop
    sf::VideoMode desktopMode = sf::VideoMode::getDesktopMode();

    sf::RenderWindow window(sf::VideoMode(  desktopMode.width,
                                            desktopMode.height,
                                            desktopMode.bitsPerPixel),
                            "SFML part 10",
                            sf::Style::Fullscreen);


    // Enable vertical sync. (vsync)
    window.setVerticalSyncEnabled (true);

    // _________________
    // ::: Load font :::

    sf::Font font;
    if (!font.loadFromFile("../example_font.ttf"))
    {
        std::cerr << ".Error while loading font" << std::endl;
        return -1;
    }

    sf::Text text;
    text.setFont(font); // font est un sf::Font
    text.setString(L"www.lucidarme.me");
    text.setCharacterSize(60); // exprimée en pixels, pas en points !
    text.setColor(sf::Color::Black);
    text.setOrigin(text.getLocalBounds().width/2. , text.getLocalBounds().height/2.);

    std::cout << text.getLocalBounds().width << "\t" << text.getLocalBounds().height;
    // _________________
    // ::: Main loop :::

    sf::Clock timer;
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();
            if (event.type == sf::Event::KeyPressed) window.close();
        }

        // Clear the window and apply grey background
        window.clear( sf::Color(127,127,127));
        text.setPosition(window.getSize().x/2. , window.getSize().y/2.);
        window.draw(text);
        // Update display and wait for vsync
        window.display();
    }
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_010

<- Retour au menu du tutoriel sur SFML

SFML: music et sons

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment jouer de la musique et des sons.

/*!
 * \file    main.cpp
 * \brief   Music and sound examples (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme
 * \version 1.0
 * \date    12/20/2016
 */

#include 
#include 


// Wait for ms milliseconds
void delay_ms(int ms)
{
    sf::Clock Timer;
    while (Timer.getElapsedTime().asMilliseconds()5;vol--)
    {
        music.setVolume(vol);
        delay_ms(50);
    }

    // Stop music
    std::cout << "Stop music" << std::endl;
    music.stop();
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_009

<- Retour au menu du tutoriel sur SFML

SFML: shader 'effet eau'

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment créer un effet eau sur un sprite grâce aux shaders.

/*!
 * \file    main.cpp
 * \brief   apply a water effect shader to a sprite (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme (from https://github.com/SFML/SFML/wiki/Source:-HeatHazeShader)
 * \version 1.0
 * \date    12/19/2016
 */

// SFML libraries
#include 
#include 
#include 


int main()
{
    // _____________________
    // ::: Create window :::

    // Create a window with the same pixel depth as the desktop
    sf::VideoMode desktopMode = sf::VideoMode::getDesktopMode();

    sf::RenderWindow window(sf::VideoMode(  desktopMode.width,
                                            desktopMode.height,
                                            desktopMode.bitsPerPixel),
                            "SFML part 8",
                            sf::Style::Fullscreen);

    // Enable vertical sync. (vsync)
    window.setVerticalSyncEnabled (true);



    // ____________________
    // ::: Load texture :::

    // Create texture from PNG file
    sf::Texture texture;
    if (!texture.loadFromFile("../sfml-icon-small.png"))
    {
        std::cerr << "Error while loading texture" << std::endl;
        return -1;
    }
    // Enable the smooth filter. The texture appears smoother so that pixels are less noticeable.
    texture.setSmooth(true);



    // _______________________________________
    // ::: Create sprite and apply texture :::

    // Create the sprite and apply the texture
    sf::Sprite sprite;
    sprite.setTexture(texture);
    sf::FloatRect spriteSize=sprite.getGlobalBounds();
    // Set origin in the middle of the sprite
    sprite.setOrigin(spriteSize.width/2.,spriteSize.height/2.);



    // _______________
    // ::: Shaders :::

    // Check if shaders are available
    if (!sf::Shader::isAvailable())
    {
        std::cerr << "Shader are not available" << std::endl;
        return -1;
    }

    // Load shaders
    sf::Shader shader;
    if (!shader.loadFromFile("../water.frag", sf::Shader::Fragment))
    {
        std::cerr << "Error while shaders" << std::endl;
        return -1;
    }



    // ___________________________
    // ::: Load distortion map :::

    sf::Texture distortionMap;

    if (!distortionMap.loadFromFile("../noiseWater.png"))
    {
        sf::err() << "Error while loading distortion map" << std::endl;
        return -1;
    }

    // It is important to set repeated to true to enable scrolling upwards
    distortionMap.setRepeated(true);
    // Setting smooth to true lets us use small maps even on larger images
    distortionMap.setSmooth(true);

    // Set texture to the shader
    shader.setParameter("currentTexture", sf::Shader::CurrentTexture);
    shader.setParameter("distortionMapTexture", distortionMap);

    // Shader parameters
    float level = .5f;


    // _________________
    // ::: Main loop :::

    sf::Clock timer;
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();

            // If a key is pressed
            if (event.type == sf::Event::KeyPressed)
            {
                switch (event.key.code)
                {
                // If escape is pressed, close the application
                case  sf::Keyboard::Escape : window.close(); break;
                // Process the up, down, left and right keys to modify parameters
                case sf::Keyboard::Up :     level -= .005f;    break;
                case sf::Keyboard::Down:    level += .005f;    break;
                default : break;
                }
            }
        }

        if (level>0.8) level=0.8;
        if (level<0.2) level=0.2;

        // Set shader parameters
        shader.setParameter("time", timer.getElapsedTime().asSeconds());
        shader.setParameter("level",level);

        // Clear the window and apply grey background
        window.clear( sf::Color(127,127,127));

        // Draw the sprite and apply shader
        sprite.setPosition(window.getSize().x/2.,window.getSize().y/2.);
        sprite.setScale(2,2);
        window.draw(sprite,&shader);

        // Update display and wait for vsync
        window.display();
    }
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_008

<- Retour au menu du tutoriel sur SFML

SFML: shader 'effet chaleur'

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment utiliser un effet "chaleur" sur un sprite grâce aux shaders.

/*!
 * \file    main.cpp
 * \brief   apply a heat shader to a sprite (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme (from https://github.com/SFML/SFML/wiki/Source:-HeatHazeShader)
 * \version 1.0
 * \date    12/19/2016
 */

// SFML libraries
#include 
#include 
#include 


int main()
{
    // _____________________
    // ::: Create window :::

    // Create a window with the same pixel depth as the desktop
    sf::VideoMode desktopMode = sf::VideoMode::getDesktopMode();

    sf::RenderWindow window(sf::VideoMode(  desktopMode.width,
                                            desktopMode.height,
                                            desktopMode.bitsPerPixel),
                            "SFML part 7",
                            sf::Style::Fullscreen);

    // Enable vertical sync. (vsync)
    window.setVerticalSyncEnabled (true);



    // ____________________
    // ::: Load texture :::

    // Create texture from PNG file
    sf::Texture texture;
    if (!texture.loadFromFile("../sfml-icon-small.png"))
    {
        std::cerr << "Error while loading texture" << std::endl;
        return -1;
    }
    // Enable the smooth filter. The texture appears smoother so that pixels are less noticeable.
    texture.setSmooth(true);



    // _______________________________________
    // ::: Create sprite and apply texture :::

    // Create the sprite and apply the texture
    sf::Sprite sprite;
    sprite.setTexture(texture);
    sf::FloatRect spriteSize=sprite.getGlobalBounds();
    // Set origin in the middle of the sprite
    sprite.setOrigin(spriteSize.width/2.,spriteSize.height/2.);



    // _______________
    // ::: Shaders :::

    // Check if shaders are available
    if (!sf::Shader::isAvailable())
    {
        std::cerr << "Shader are not available" << std::endl;
        return -1;
    }

    // Load shaders
    sf::Shader shader;
    if (!shader.loadFromFile("../example_001.frag", sf::Shader::Fragment))
    {
        std::cerr << "Error while shaders" << std::endl;
        return -1;
    }



    // ___________________________
    // ::: Load distortion map :::

    sf::Texture distortionMap;

    if (!distortionMap.loadFromFile("../distortion_map.png"))
    {
        sf::err() << "Error while loading distortion map" << std::endl;
        return -1;
    }

    // It is important to set repeated to true to enable scrolling upwards
    distortionMap.setRepeated(true);
    // Setting smooth to true lets us use small maps even on larger images
    distortionMap.setSmooth(true);

    // Set texture to the shader
    shader.setParameter("currentTexture", sf::Shader::CurrentTexture);
    shader.setParameter("distortionMapTexture", distortionMap);

    // Shader parameters
    float distortionFactor = .05f;
    float riseFactor = .2f;


    // _________________
    // ::: Main loop :::

    sf::Clock timer;
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();

            // If a key is pressed
            if (event.type == sf::Event::KeyPressed)
            {
                switch (event.key.code)
                {
                // If escape is pressed, close the application
                case  sf::Keyboard::Escape : window.close(); break;

                // Process the up, down, left and right keys to modify parameters
                case sf::Keyboard::Up :     distortionFactor *= 2.f;    break;
                case sf::Keyboard::Down:    distortionFactor /= 2.f;    break;
                case sf::Keyboard::Left:    riseFactor *= 2.f;          break;
                case sf::Keyboard::Right:   riseFactor /= 2.f;          break;
                default : break;
                }
            }
        }

        // Set shader parameters
        shader.setParameter("time", timer.getElapsedTime().asSeconds());
        shader.setParameter("distortionFactor", distortionFactor);
        shader.setParameter("riseFactor", riseFactor);


        // Clear the window and apply grey background
        window.clear( sf::Color(127,127,127));

        // Draw the sprite and apply shader
        sprite.setPosition(window.getSize().x/2.,window.getSize().y/2.);
        sprite.setScale(2,2);
        window.draw(sprite,&shader);

        // Update display and wait for vsync
        window.display();
    }
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_007

<- Retour au menu du tutoriel sur SFML

SFML: sprite et shaders

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment utiliser les shaders. Il s'agit de programme qui sont exécutes dans le GPU (Graphics Processing Unit). L’avantage est de libérer le processeur principal.

/*!
 * \file    main.cpp
 * \brief   apply a shaders to a sprite (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme
 * \version 1.0
 * \date    12/20/2016
 */

// SFML libraries
#include 
#include 
#include 


// Example 1 : distorsion
// Example 2 : breath
// Example 3 : shaked
// Example 4 : fade
// Example 5 : blur
//#define SHADER_FILENAME         "../example_001.frag"
//#define SHADER_FILENAME         "../example_002.frag"
//#define SHADER_FILENAME         "../example_003.frag"
//#define SHADER_FILENAME         "../example_004.frag"
#define SHADER_FILENAME         "../example_005.frag"

#define     WINDOW_WIDTH    256
#define     WINDOW_HEIGHT   256

int main()
{

    // _____________________
    // ::: Create window :::

    // Create a non resizable window
    sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "SFML Shader Example", sf::Style::Titlebar | sf::Style::Close);


    // Create a window size texture and a sprite for the shader
    sf::Texture tex;
    tex.create(WINDOW_WIDTH, WINDOW_HEIGHT);
    sf::Sprite spr(tex);

    // Enable vertical sync. (vsync)
    window.setVerticalSyncEnabled (true);



    // ____________________
    // ::: Load texture :::

    // Create texture from PNG file
    sf::Texture texture;
    if (!texture.loadFromFile("../sfml-icon-small.png"))
    {
        std::cerr << "Error while loading texture" << std::endl;
        return -1;
    }
    // Enable the smooth filter. The texture appears smoother so that pixels are less noticeable.
    texture.setSmooth(true);



    // _______________________________________
    // ::: Create sprite and apply texture :::

    // Create the sprite and apply the texture
    sf::Sprite sprite;
    sprite.setTexture(texture);
    sf::FloatRect spriteSize=sprite.getGlobalBounds();
    // Set origin in the middle of the sprite
    sprite.setOrigin(spriteSize.width/2.,spriteSize.height/2.);



    // _______________
    // ::: Shaders :::

    // Check if shaders are available
    if (!sf::Shader::isAvailable())
    {
        std::cerr << "Shader are not available" << std::endl;
        return -1;
    }

    // Load shaders
    sf::Shader shader;
    if (!shader.loadFromFile(SHADER_FILENAME, sf::Shader::Fragment))
    {
        std::cerr << "Error while shaders" << std::endl;
        return -1;
    }




    // _________________
    // ::: Main loop :::

    sf::Clock time;
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();

            // If escape is pressed, close the application
            if (event.type == sf::Event::KeyPressed && event.key.code==sf::Keyboard::Escape) window.close();
        }

        // Set shader parameters
        shader.setParameter("time", time.getElapsedTime().asSeconds());

        // Clear the window and apply grey background
        window.clear( sf::Color(127,127,127));

        // Draw the sprite and apply shader
        sprite.setPosition(window.getSize().x/2.,window.getSize().y/2.);
        window.draw(sprite,&shader);

        // Update display and wait for vsync
        window.display();
    }
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_006

<- Retour au menu du tutoriel sur SFML

SFML: déplacer un sprite avec le clavier

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment afficher un sprite en plein écran et le déplacer avec les flêches du clavier:

/*!
 * \file    main.cpp
 * \brief   move a sprite with the keyboard (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme
 * \version 1.0
 * \date    12/18/2016
 */

// SFML libraries
#include 
#include 
#include 

// Sprite speed (high values = high speed)
#define         SPRITE_SPEED        5

int main()
{
    // _____________________
    // ::: Create window :::

    // Create a window with the same pixel depth as the desktop
    sf::VideoMode desktopMode = sf::VideoMode::getDesktopMode();

    sf::RenderWindow window(sf::VideoMode(  desktopMode.width,
                                            desktopMode.height,
                                            desktopMode.bitsPerPixel),
                            "SFML part 3",
                            sf::Style::Fullscreen);

    // Enable vertical sync. (vsync)
    window.setVerticalSyncEnabled (true);
    // When a key is pressed, sf::Event::KeyPressed will be true only once
    window.setKeyRepeatEnabled(false);


    // ____________________
    // ::: Load texture :::

    // Create texture from PNG file
    sf::Texture texture;
    if (!texture.loadFromFile("../../img/sfml-icon-small.png"))
    {
        std::cerr << "Error while loading texture" << std::endl;
        return -1;
    }
    // Enable the smooth filter. The texture appears smoother so that pixels are less noticeable.
    texture.setSmooth(true);



    // _______________________________________
    // ::: Create sprite and apply texture :::

    // Create the sprite and apply the texture
    sf::Sprite sprite;
    sprite.setTexture(texture);
    sf::FloatRect spriteSize=sprite.getGlobalBounds();
    sprite.setOrigin(spriteSize.width/2.,spriteSize.height/2.);


        // _________________
    // ::: Main loop :::

    // Sprite coordinates
    int x=window.getSize().x/2.;
    int y=window.getSize().y/2.;
    
    // Flags for key pressed
    bool upFlag=false;
    bool downFlag=false;
    bool leftFlag=false;
    bool rightFlag=false;

    sf::Clock timer;
    while (window.isOpen())
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();

            // If a key is pressed
            if (event.type == sf::Event::KeyPressed)
            {
                switch (event.key.code)
                {
                // If escape is pressed, close the application
                case  sf::Keyboard::Escape : window.close(); break;

                // Process the up, down, left and right keys
                case sf::Keyboard::Up :     upFlag=true; break;
                case sf::Keyboard::Down:    downFlag=true; break;
                case sf::Keyboard::Left:    leftFlag=true; break;
                case sf::Keyboard::Right:   rightFlag=true; break;
                default : break;
                }
            }

            // If a key is released
            if (event.type == sf::Event::KeyReleased)
            {
                switch (event.key.code)
                {
                // Process the up, down, left and right keys
                case sf::Keyboard::Up :     upFlag=false; break;
                case sf::Keyboard::Down:    downFlag=false; break;
                case sf::Keyboard::Left:    leftFlag=false; break;
                case sf::Keyboard::Right:   rightFlag=false; break;
                default : break;
                }
            }
        }

        // Update coordinates
        if (leftFlag) x-=SPRITE_SPEED;
        if (rightFlag) x+=SPRITE_SPEED;
        if (upFlag) y-=SPRITE_SPEED;
        if (downFlag) y+=SPRITE_SPEED;

        // Check screen boundaries
        if (x<0) x=0;
        if (x>(int)window.getSize().x) x=window.getSize().x;
        if (y<0) y=0;
        if (y>(int)window.getSize().y) y=window.getSize().y;

        // Clear the window and apply grey background
        window.clear( sf::Color(127,127,127));

        // Rotate and draw the sprite
        sprite.setPosition(x,y);
        sprite.setRotation( timer.getElapsedTime().asSeconds() / M_PI * 90.f );
        window.draw(sprite);

        // Update display and wait for vsync
        window.display();
    }
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_004

<- Retour au menu du tutoriel sur SFML

SFML: Afficher un sprite

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment afficher un sprite en plein écran:

/*!
 * \file    main.cpp
 * \brief   start SFML in full screen and display a sprite (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme
 * \version 1.0
 * \date    12/18/2016
 */

// SFML libraries
#include 
#include 

int main()
{
    // _____________________
    // ::: Create window :::

    // Create a window with the same pixel depth as the desktop
    sf::VideoMode desktopMode = sf::VideoMode::getDesktopMode();

    sf::RenderWindow window(sf::VideoMode(  desktopMode.width,
                                            desktopMode.height,
                                            desktopMode.bitsPerPixel),
                            "SFML part 3",
                            sf::Style::Fullscreen);

    // Enable vertical sync. (vsync)
    window.setVerticalSyncEnabled (true);


    // ____________________
    // ::: Load texture :::

    // Create texture from PNG file
    sf::Texture texture;
    if (!texture.loadFromFile("../../img/sfml-icon-small.png"))
    {
        std::cerr << "Error while loading texture" << std::endl;
        return -1;
    }
    // Enable the smooth filter. The texture appears smoother so that pixels are less noticeable.
    texture.setSmooth(true);



    // _______________________________________
    // ::: Create sprite and apply texture :::

    // Create the sprite and apply the texture
    sf::Sprite sprite;
    sprite.setTexture(texture);
    sf::FloatRect spriteSize=sprite.getGlobalBounds();
    sprite.setOrigin(spriteSize.width/2.,spriteSize.height/2.);


    // _________________
    // ::: Main loop :::

    sf::Clock timer;
    while (window.isOpen())
    {
        // Display fps
        std::cout << int(1./timer.restart().asSeconds()) << " fps" << std::endl;

        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();
            if (event.type == sf::Event::KeyPressed) window.close();
        }

        // Clear the window and apply grey background
        window.clear( sf::Color(127,127,127));

        // Draw the sprite in the middle of the screen
        sprite.setPosition(window.getSize().x/2., window.getSize().y/2.);
        window.draw(sprite);

        // Update display and wait for vsync
        window.display();
    }
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_003

<- Retour au menu du tutoriel sur SFML

SFML : lister les résolutions

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Cet exemple montre comment obtenir la liste des résolutions utilisables pour le plein écran:

/*!
 * \file    main.cpp
 * \brief   Display the list of available video mode (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme
 * \version 1.0
 * \date    12/18/2016
 */

// SFML libraries
#include 
#include 

int main()
{

    // Display the list of all the video modes available for fullscreen
    std::vector modes = sf::VideoMode::getFullscreenModes();

    // Display each mode
    for (std::size_t i = 0; i < modes.size(); ++i)
    {
        sf::VideoMode mode = modes[i];
        std::cout << "Mode #" << i << "\t"
                  << mode.width << "x" << mode.height << " \t "
                  << mode.bitsPerPixel << " bpp" << std::endl;
    }

    // Get and display desktop mode
    sf::VideoMode mode = sf::VideoMode::getDesktopMode();
    std::cout << "Desktop"  << "\t"
              << mode.width << "x" << mode.height << " \t "
              << mode.bitsPerPixel << " bpp" << std::endl;

    // End of application
    return 0;
}

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_002

<- Retour au menu du tutoriel sur SFML

SFML: premier programme

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Paquets

Installer les paquets suivants:

sudo apt-get install qtcreator qt-sdk libsfml-dev

Configurer Qt

Pour compiler les applications avec la bibliothèque SFML, ajouter les lignes suivantes dans le fichier .pro:

LIBS += -lsfml-audio
LIBS += -lsfml-graphics
LIBS += -lsfml-network
LIBS += -lsfml-window
LIBS += -lsfml-system

Pour éviter les problèmes liés aux répertoires, décocher "Shadow build" dans le projet:

De la même façon, vous pouvez décocher "Run in terminal" :

Premier programme

/*!
 * \file    main.cpp
 * \brief   First example of SFML (http://www.lucidarme.me/?p=6127)
 * \author  Philippe Lucidarme (from official SFML tutorial)
 * \version 1.0
 * \date    12/18/2016
 */

// SFML libraries
#include 

int main()
{
    
    // Create a new 200x200 pixels window with a title
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML tutorial : part 1");
    
    // Create a green circle with a radius of 100. pixels
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
    
    
    // Main loop, while the window is open
    while (window.isOpen())
    {
        // Event loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // If close is requested by user, close the window
            if (event.type == sf::Event::Closed) window.close();
        }
        
        // Display sequence : clear screen, draw circle and update display
        window.clear();
        window.draw(shape);
        window.display();
    }
    
    // End of application
    return 0;
}

Ce programme devrait afficher la fenêtre suivante:

Télécharger depuis Git

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab : https://gitlab.com/philippe.lucidarme/sfml_tutorial/tree/master/part_001

<- Retour au menu du tutoriel sur SFML

SFML tutoriel

Ce tutoriel a été réalisé avec les versions logiciel suivantes:

  • XUbuntu 16.04 LTS
  • SFML 2.3.2
  • Qt Creator 3.5.1

Ce tutoriel est dédié aux développeurs qui sont déjà familiarisés avec le C/C++. Les fichiers et codes sources peuvent être téléchargés sur GitLab. Il s'agit d'une série d'exemples, chacun étant associé à un thème.

Optimisation, exemple de minimisation de fonction avec Matlab.

Voici un exemple de recherche de minimum de fonction avec avec la fonction fminsearch de Matlab :

optim

%% Optimization example
% This file is the main script
% Written by Philippe Lucidarme
% http://www.lucidarme.me
close all;
clear all;
clc;



%% Display the function fct

figure(1);
X=[-4:0.1:4]; %% The X-axis goes from the value of -5 to +5 with a step of 0.1 (100 points)
Y=[-4:0.1:4]; %% like the X-axis
[wx,wy]=meshgrid(X,Y); %% see [MATLAB documentation][1]
% Compute each point of the mesh
for i=1:size(X,2)
    for j=1:size(Y,2)
        %Z=100.*(wy - wx.^2).^2 + (1 - wx).^2;
        Z(j,i)=fct([X(i),Y(j)]);
    end
end
% Display curb
fig=surf(wx,wy,Z); %% make a surface plot with lighting
shading interp; %% optional, try to remove it.
%     hsv        - Hue-saturation-value color map.
%     hot        - Black-red-yellow-white color map.
%     gray       - Linear gray-scale color map.
%     bone       - Gray-scale with tinge of blue color map.
%     copper     - Linear copper-tone color map.
%     pink       - Pastel shades of pink color map.
%     white      - All white color map.
%     flag       - Alternating red, white, blue, and black color map.
%     lines      - Color map with the line colors.
%     colorcube  - Enhanced color-cube color map.
%     vga        - Windows colormap for 16 colors.
%     jet        - Variant of HSV.
%     prism      - Prism color map.
%     cool       - Shades of cyan and magenta color map.
%     autumn     - Shades of red and yellow color map.
%     spring     - Shades of magenta and yellow color map.
%     winter     - Shades of blue and green color map.
%     summer     - Shades of green and yellow color map.      
colormap cool; %% here you decide the colormap: hot is the one going from white to red
view(45,65);
rotate3d;
hold on;
xlabel ('x');
ylabel ('y');
title ('Optimization');




%% Optimization

% Initial point for optimization
x0 = [0,0];

% Set parameters
% optimplotfval, display the function evaluation
% iter, display algorithm status a each interation
% Call outfun at each iteration (for display)
options = optimset('PlotFcns',@optimplotfval,'Display','iter','OutputFcn', @outfun);
% Optimization algorithm
[x,FVAL,EXITFLAG,OUTPUT] = fminsearch(@fct,x0,options);


%% Display results

FVAL
OUTPUT
x
figure(1);
plot3 (x(1),x(2),fct(x),'or','MarkerSize',10,'LineWidth',5);
function y = fct( x )
% fct  function to minimize
%   x = [x,y] input vector
%   y = function output (scalar)
% Written by Philippe Lucidarme
% http://www.lucidarme.me

% Rosenbrock's function
%y = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

%y = (x(1)-4).^2 .* (x(2)-1.2).^2;

y = sinc(x(1)).*sinc(0.3*x(2));

end
function stop = outfun(x, optimValues, state)
% fct  this function is called at each step of the optimization process
%   x :             the point computed by the algorithm at the current iteration.
%   optimValues :   is a structure containing data from the current iteration.
%   state :         current state of the algorithm.
% Written by Philippe Lucidarme
% http://www.lucidarme.me

figure (1);
plot3 (x(1),x(2),optimValues.fval,'.k','MarkerSize',10);
stop=false;

Relation entre vitesse linéaire et angulaire, produit vectoriel

De la vitesse linéaire vers la vitesse angulaire


Considérons le corps C, en rotation autour du point O. La vitesse linéaire du point A est donnée par \vec{V}.

angular_linear
La vitesse angulaire autour du point O est donnée par :

\vec{\omega} = \frac {\vec{OA} \times \vec{V}} { \| \vec{OA} \| ^2 }

De la vitesse angulaire vers la vitesse linéaire

En supposant maintenant que la vitesse angulaire est connue, la vitesse linéaire au point A est donnée par:

\vec{V} = \vec{\omega} \times \vec{OA}

Exemple

example

close all;
clear all;
clc;

%% Parameters

% Coordinates of point O
O=[0;0;0];
% Coordinates of point A
A=[1;2;0];
% Coordinates of point B
B=[2;1;0];

% Speed applied at point A
VA=[0;2;0];


%% Compute angular velocity

% Compute vector OA
vOA=A-O;
% Compute angular speed around point A
wO=cross (vOA,VA)/(norm(vOA)*norm(vOA));



%% Compute linear speed at point B

vOB=B-O;
VB=cross(wO,vOB);



%% Draw system

plot3(O(1),O(2),O(3));
hold on;
line ([O(1) A(1)],[O(2) A(2)],[O(3) A(3)]);
line ([O(1) B(1)],[O(2) B(2)],[O(3) B(3)]);
text(O(1)+0.2,O(2)+0.2,O(3)+0.2,'O','FontSize',100);
text(A(1)+0.2,A(2)+0.2,A(3)+0.2,'A','FontSize',100);
text(B(1)+0.2,B(2)+0.2,B(3)+0.2,'B','FontSize',100);


% Draw speed at point A
hFA=quiver3 (A(1),A(2),A(3),VA(1),VA(2),VA(3),'Color','k','LineWidth',3,'MaxHeadSize',1.5);

% Draw speed at point O
hTO=quiver3 (O(1),O(2),O(3),wO(1),wO(2),wO(3),'Color','g','LineWidth',3,'MaxHeadSize',1.5);

% Draw speed at point B
hFB=quiver3 (B(1),B(2),B(3),VB(1),VB(2),VB(3),'Color','r','LineWidth',3,'MaxHeadSize',1.5);

% Display axis and legends
grid on;
axis square equal;
xlabel('X');
ylabel('Y');
zlabel('Z');
legend ([hFA,hTO,hFB],'Linear speed at point A','Angular velocity a point O','Linear speed at point B');

Couple, Force et produit vectoriel

Calcul du couple à partir de la force

Considérons le corps C, en rotation autour du point O. Une force \vec{F} est appliquée sur le corps C au point A.

couple_force
Le couple autour du point O est donné par le produit vectoriel entre les vecteurs \vec{OA} et \vec{F} :

\vec{\Gamma} = \vec{OA} \times \vec{F}

Calcul de la force à partir du couple

Si l'on suppose que le couple est connu, il est possible de calculer la force au point A:

\vec{F} = \frac {\vec{\Gamma} \times \vec{OA} } { \| \vec{OA} \| ^2 }

Exemple

example

close all;
clear all;
clc;

%% Parameters

% Coordinates of point O
O=[0;0;0];
% Coordinates of point A
A=[1;2;0];
% Coordinates of point B
B=[3;1;0];

% Force applied at point A
FA=[0;2;0];


%% Compute torque

% Compute vector OA
vOA=A-O;
% Compute torque at point A
TO=cross (vOA,FA);


%% Compute force at point B

vOB=B-O;
FB=cross(TO,vOB)/(norm(vOB)*norm(vOB));



%% Draw system

plot3(O(1),O(2),O(3));
hold on;
line ([O(1) A(1)],[O(2) A(2)],[O(3) A(3)]);
line ([O(1) B(1)],[O(2) B(2)],[O(3) B(3)]);
text(O(1)+0.2,O(2)+0.2,O(3)+0.2,'O','FontSize',100);
text(A(1)+0.2,A(2)+0.2,A(3)+0.2,'A','FontSize',100);
text(B(1)+0.2,B(2)+0.2,B(3)+0.2,'B','FontSize',100);


% Draw force at point A
hFA=quiver3 (A(1),A(2),A(3),FA(1),FA(2),FA(3),'Color','k','LineWidth',3,'MaxHeadSize',1.5);

% Draw torque at point O
hTO=quiver3 (O(1),O(2),O(3),TO(1),TO(2),TO(3),'Color','g','LineWidth',3,'MaxHeadSize',1.5);

% Draw force at point B
hFB=quiver3 (B(1),B(2),B(3),FB(1),FB(2),FB(3),'Color','r','LineWidth',3,'MaxHeadSize',1.5);

% Display axis and legends
grid on;
axis square equal;
xlabel('X');
ylabel('Y');
zlabel('Z');
legend ([hFA,hTO,hFB],'Force at point A','Torque at point O','Force at point B');

Installation d'Eagle 6.6 sur Ubuntu 16.04

Installer les paquets suivants :

sudo apt-get install libxrender1:i386 libxrandr2:i386 libxcursor1:i386 libfreetype6:i386 libfontconfig1:i386 libxext6:i386 libx11-6:i386 libxi6:i386 libssl1.0.0:i386 libstdc++6:i386 libgcc1:i386 libc6:i386 libc6-i386 libxfixes3:i386 libexpat1:i386 libxcb1:i386 libxdmcp6:i386 libxau6:i386

Rendre l'installer executable :

chmod +x eagle-lin-6.6.0.run

Lancer le script d'instalation :

sudo ./eagle-lin-6.6.0.run

Si lors de l'installation d'Eagle 6.5.0 sur Ubuntu 12.04 LTS 64 bits l'erreur suivante apparait :

ligne 108: /tmp/eagle-setup.9094/eagle-6.5.0/bin/eagle: Aucun fichier ou dossier de ce type

Cette erreur est due à des packages manquants et peut être facilement résolue en exécutant les commandes suivantes avant installation:

sudo apt-get install libssl1.0.0
sudo apt-get install libcrypto++9
sudo apt-get install build-essential perl gcc-multilib
sudo apt-get install ia32-libs lib32z1 lib32z1-dev

Lancer l'application:

/opt/eagle-6.6.0/bin/eagle

Ajouter l'icon dans le menu Unity puis éditer le fichier du lanceur:

gedit ~/.local/share/applications/eagle.desktop

Modifier l'icône dans le fichier:

Icon=/opt/eagle-6.6.0/bin/eagleicon50.png

Redémarrer le session pour que le changement d'icône soit pris en compte.

Installation des logiciels FEBFMT1030 sous Linux

Cet article explique comment installer les logiciels du FEBFMT1030 (carte d'évaluation). Cette installation a été ralisée avec les versions suivantes des logiciels :

  • XUbuntu 14.04 LTS

Le logiciel peut être téléchargé depuis cette page : https://www.fairchildsemi.com/product-technology/mems-module/ ou ici :

Commençons par installer les dépendances :

sudo apt-get install realpath sharutils liblapack3 build-essential

Extraire l'archive principale et l'archive secondaire Linux qui se trouve à l'intérieur. Lancer un terminal (ctrl-alt-t) et se déplacer dans le répertoire de l'archive :

 cd path/to/the/archive 

Obtenir les droits sur l'USB

Ajouter l'utilisateur courant que groupe dialout :

sudo usermod -G dialout -a $USER

Après s'être ajouté au groupe, il faut soit redémarrer la session, soit exécuter la commande suivante pour que les changements soient effectifs:

newgrp dialout

Installation du SDK

Rendre les scripts executables :

chmod +x *.sh

Lancer les scripts :

 
sudo ./mtsdk_linux_4.4.135.sh
sudo ./mfmsdk_linux_4.4.135.sh
sudo ./fcs_mfmsdk_linux_4.4.135.sh
sudo ./fcs_mtsdk_linux_4.4.135.sh 

Installation de MTManager

Extraire l'arrchive fcs_mtmanager_Release-Linux-x64_135.tar.gz, et se déplacer dans le répertoire linux-64/bin directory. Lancer le logiciel de démo :

./mtmanager

La carte de développement est supportée sur les noyaux récents (depuis le 12 juin 2015). Si votre nsystème ne supporte pas la carte, vous pouvez l'ajouter manuellement :

sudo /sbin/modprobe ftdi_sio
echo 2639 0300 | sudo tee /sys/bus/usb-serial/drivers/ftdi_sio/new_id

Si la carte est reconnue mais non utilisable, consulter la section troubleshooting dans le fichier /usr/local/fairchild/README.MTSDK

Compiler un premier programme

Ajouter les bibliothèques au linker dynamique :

sudo ldconfig /usr/local/fairchild
sudo ldconfig /usr/local/xsens

Se déplacer dans le répertoire contenant les examples :

cd /usr/local/fairchild/examples/mtsdk/

Compiler :

make

Se déplacer dans le répertoire de compilation :

cd src_cpp

Lancer l'executable :

./example

La carte est nativement montée sur le port /dev/ttyUSB0, avec une vitesse de 115200 bauds.

Caractères autorisés dans un nom de fichier

Quels sont les caractère autorisés et interdits dans un nom de fichier ? POSIX "Fully portable filenames" liste les caractères suivants

  • Lettres majuscules : A B C ... Z (déconseillé, voir ci-dessous)
  • Lettres minuscules : a b c ... z
  • Chiffres : 0 1 2 ... 9
  • Point : .
  • Underscore : _
  • Moins : -

La ponctuation ne doit pas être utilisée comme premier caractère (. - _).

Exemple :

FileName_01-03-16.txt

Téléchargements

L'application check_file_name permet de renommer automatiquement les fichiers dans tous les sous-répertoires.

Préfixe des composants électroniques

Voici la liste des préfixes (standard reference designator) pour les schémas électriques:

BTBatterie
CCondensateur
DDiode
FFusible
JPCavalier (Jumper)
LInductance
MMoteur
QTransistor
RResistance
RTThermistance
SInterrupteur, switch, bouton poussoir.
TPTest point
UCircuit intégré (IC -Inseparable assembly)
VRRésistance variable (potentiomètre or rheostat)
XConnecteur
TQuartz ou oscillateur
ZDiode Zener

Fabricants de circuits imprimés à bas coût

Voici une liste de fabricants de circuits imprimés (PCB) avec devis en ligne :

  • Multi-cb cette entreprise est basée à Poole (UK). Les circuits sont tous fabriqués en Angleterre.
    Formats supportés : Eagle CAD, Target 3001, Sprint Layout, Gerber, ODB++ et IPC-2581.
  • Beta-Layout / PCB Pool
    Formats supportés : DesignSpark PCB, Altium (PROTEL), Target, Eagle CAD (.brd), Orcad, UltiBOARD, Proteus, Sprint, Quickroute, EASY-PC, , EDWin, GC-Prevue, PCAD, Boardmaker, Pulsonix, Kicad, DipTrace, Fritzing and GERBER.
  • YouPCB : cette entreprise est basée à Toronto, Ontario au Canada. Les circuits sont fabriqués à Shenzhen en China.
    Formats supportés : Gerber.
  • FirstPCB : société basée à Hangzhou en Chine. Les circuits sont fabriqués à en Chine.
    Formats supportés : Gerber 274X , ODB++, Protel and Eagle CAD
  • DirtyPCB : société américaine avec des partenaires chinois. Les circuits sont fabriqués à Shenzhen et expédiés depuis Hong Kong.
    Formats supportés : Gerber et Eagle CAD (.brd).
  • JLCPCB
  • Eurocircuits :
  • PCBWay : société basée à Hangzhou en Chine. Les circuits sont fabriqués à Shenzhen et Hangzhou en Chine.
    Formats supportés : Gerber, Protel 99se (.pcb), DXP (.pcbdoc), CAM350 (.cam) et Eagle CAD (.brd).
  • ALLPCB : plateforme de fabrication de circuits imprimés qui travaille avec différents fabricants en Chine.
    Formats supportés : Gerber
  • Seeed Studio Fusion: Société basée en Chine avec une offre multi-services : circuits imprimés, assemblage, impression 3D ...
    Formats supportés : Gerber

Si une information ou un fabricant étaient erronés ou manquants, n'hésitez pas à me le signaler.