Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - DrPapino

Pages: [1]
1
Général / Compilation statique
« le: Novembre 22, 2020, 09:30:51 am »
Bonjour :)

Je sèche complètement pour faire une compilation statique du fameux cercle vert..
L'objectif est de pouvoir exporter mon .exe à n'importe quel pour qu'il puisse l'exécuter même sans SFML d'installée.

Mon setup :
- Sublime Text 3
- GCC version 6.3.0
- MinGW DW32
- Version de SFML : toutes testées mais pour l'exemple partons sur la 2.5.1 / GCC 7.3.0 MinGW (DW2) - 32-bit

mon makefile :

# The location where SFML is installed
SFML_DIR=C:/SFML

# Location where SFML libraries are located
LIBDIR=$(SFML_DIR)/lib

# Arguments to pass to the compiler
CFLAGS=-I$(SFML_DIR)/include

# Set the rule that links the executable as the default
# This is the default because it is *first* in the file,
# not because of it's name!
default: compile

# Compile the source file
compile: main.cpp
        g++ -c main.cpp $(CFLAGS) -o main.o

run: main.cpp
        set PATH=%PATH%;C:/SFML/bin; & g++ main.o -o main.exe -L$(LIBDIR) -lsfml-graphics -lsfml-window -lsfml-system -lsfml-network & main.exe


static: main.cpp
        set PATH=%PATH%;C:/SFML/bin; & g++ main.o -o main.exe -DSFML_STATIC $(CFLAGS) -L$(LIBDIR) -lsfml-graphics-s -lsfml-window-s -lsfml-system-s -lfreetype -lopengl32 -lwinmm -lgdi32
 

mon main.cpp :

#include <SFML/Graphics.hpp>
#include <iostream>

int main()
{

    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

la compilation "standard" et le run sont ok, mais la compilation statique me donne cette erreur :

main.o:main.cpp:(.text+0x7c): undefined reference to `_imp___ZN2sf6StringC1EPKcRKSt6locale'
main.o:main.cpp:(.text+0xa2): undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
main.o:main.cpp:(.text+0xde): undefined reference to `_imp___ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'
main.o:main.cpp:(.text+0x115): undefined reference to `_imp___ZN2sf11CircleShapeC1Efj'
main.o:main.cpp:(.text+0x126): undefined reference to `_imp___ZN2sf5Color5GreenE'
main.o:main.cpp:(.text+0x130): undefined reference to `_imp___ZN2sf5Shape12setFillColorERKNS_5ColorE'
main.o:main.cpp:(.text+0x142): undefined reference to `_imp___ZNK2sf6Window6isOpenEv'
main.o:main.cpp:(.text+0x162): undefined reference to `_imp___ZN2sf6Window9pollEventERNS_5EventE'
main.o:main.cpp:(.text+0x182): undefined reference to `_imp___ZN2sf6Window5closeEv'
main.o:main.cpp:(.text+0x1af): undefined reference to `_imp___ZN2sf5ColorC1Ehhhh'
main.o:main.cpp:(.text+0x1ca): undefined reference to `_imp___ZN2sf12RenderTarget5clearERKNS_5ColorE'
main.o:main.cpp:(.text+0x1dd): undefined reference to `_imp___ZN2sf12RenderStates7DefaultE'
main.o:main.cpp:(.text+0x1f1): undefined reference to `_imp___ZN2sf12RenderTarget4drawERKNS_8DrawableERKNS_12RenderStatesE'
main.o:main.cpp:(.text+0x203): undefined reference to `_imp___ZN2sf6Window7displayEv'
main.o:main.cpp:(.text+0x229): undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
main.o:main.cpp:(.text+0x273): undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
main.o:main.cpp:(.text$_ZN2sf11CircleShapeD1Ev[__ZN2sf11CircleShapeD1Ev]+0xa): undefined reference to `_imp___ZTVN2sf11CircleShapeE'
main.o:main.cpp:(.text$_ZN2sf11CircleShapeD1Ev[__ZN2sf11CircleShapeD1Ev]+0x17): undefined reference to `_imp___ZTVN2sf11CircleShapeE'
main.o:main.cpp:(.text$_ZN2sf11CircleShapeD1Ev[__ZN2sf11CircleShapeD1Ev]+0x2a): undefined reference to `_imp___ZN2sf5ShapeD2Ev'
collect2.exe: error: ld returned 1 exit status
Makefile:24: recipe for target 'static' failed
mingw32-make: *** [static] Error 1
[Finished in 0.7s with exit code 2]
[cmd: ['mingw32-make', 'static']]
[dir: C:\Users\JeanLouis\Documents\Root\SFMLTest]
[path: "C:\Program Files\Java\jdk1.8.0_231\bin;";C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Skype\Phone\;C:\WINDOWS\System32\OpenSSH\;C:\MinGW\bin;C:\Users\JeanLouis\AppData\Local\Microsoft\WindowsApps;]

2
Réseau / hebergratuit et requête http
« le: Mars 26, 2017, 09:30:19 pm »
Bonjour :)

Je trafique un peu avec les requêtes http. J'ai un petit site, où l'on rentre dans des textbox un ID (d'une ville) et un nombre (d'habitants) associé. En cliquant sur un bouton OK, les données sont envoyées par POST à une page php, qui met à jour une base SQL.

index.html :

<!DOCTYPE html>
<html>
        <head>
                <title>Page Title</title>
        </head>
        <body>
                <form method="post" action="sql.php">
                         <p>ID <input type="text" name="id" /></p>
                         <p>Habitants <input type="text" name="habitants" /></p>
                        <input type="submit" value="OK"></p>
                </form>
        </body>
</html>

sql.php :

$id = $_POST['id'];
$habitants = $_POST['habitants'];

try { $bdd = new PDO('*********'); }
catch (Exception $e) { echo fail to connect; }

$req = $bdd->prepare('UPDATE table1 SET Habitants = :habitants WHERE ID = :id');
$req->execute(array(
        'habitants' => $habitants,
        'id' => $id,
        ));

En passant par index.html, tout se passe très bien. Mais j'aimerais passer par du c++ :

main.cpp :

#include <iostream>
#include <SFML/Network.hpp>

int main()
{
    sf::Http::Request request("sql.php", sf::Http::Request::Post);
    request.setBody("id=2&habitants=123");

    sf::Http http("http://www.thinkfeelcode.hebergratuit.net");
    sf::Http::Response response = http.sendRequest(request);

    if (response.getStatus() == sf::Http::Response::Ok)
        std::cout << response.getBody() << std::endl;
    else
        std::cout << "request failed" << std::endl;
       
    return 0;
}

Et là c'est le drame. Je reçois une réponse valide, mais qui ressemble à une redirection javascript, et surtout, qui ne prend pas tout en compte le body de ma requête et qui ajoute simplement "i=1" :

<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("106f21ea7eb7ee1eeb26f3ca060f25e3");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://www.thinkfeelcode.hebergratuit.net/sql.php?i=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>

Le problème vient sans doute de mon hébergeur (hebergratuit), je ne sais pas comment le résoudre. Le problème en question ressemble fort à celui d'un sujet précédent :
https://fr.sfml-dev.org/forums/index.php?topic=20331.0

Avez-vous déjà utilisé cet hébergeur, et réussi à contourner le problème ?

Merci de vos retour. 

3
Discussions générales / Norme SFML
« le: Août 07, 2016, 04:22:27 pm »
Bonjour,

Moi je me demandais si on pouvait trouver quelque part un document qui dresse la norme de codage que Laurent a utilisé pour la SFML, voilà :)

Merci de vos réponses !

4
Général / Sublime Text - commande Linux [RÉSOLU !]
« le: Juin 21, 2016, 09:16:16 pm »
Bonjour :D

Je délaisse XCode pour Sublime Text, avec le lot de petits tracas qu'entraine cette migration :)

En fait, je n'arrive pas à compiler les lib dynamiques de SFML. Ou plutôt j'y arrive en passant direct par mon terminal, mais pas depuis Sublime Text :o

Sur mon bureau, j'ai un petit main.cpp qui ouvre une fenêtre avec SFML, et je compile no problem en utilisant les commandes suivantes, depuis mon terminal :
cd desktop
g++ -c main.cpp -I/Volumes/DATA/SFML/include
g++ main.o -o sfml -L/Volumes/DATA/SFML/lib -lsfml-graphics -lsfml-window -lsfml-system
export LD_LIBRARY_PATH=/Volumes/DATA/SFML/lib && ./sfml

propre !

Sur Sublime Text, il faut aller modifier les préférences du build. J'ai donc écrit ces trois lignes de code, pensant que ça marcherait :

"cmd" : ["g++", "-c", "${file}", "-I/Volumes/DATA/SFML/include"],
"cmd" : ["g++", "${file_path}/${file_base_name}.o", "-o", "sfml-app", "-L/Volumes/DATA/SFML/lib", "-lsfml-graphics", "-lsfml-window", "-lsfml-system"],
"cmd" : ["export LD_LIBRARY_PATH=/Volumes/DATA/SFML/lib && ./sfml-app"]

... Mais en fait non !

Du coup je comprend pas trop ??? Qu'est-ce qu'ai-je fait de mal ? ;D

5
Graphique / Brouillard de guerre avec une sf::VertexArray
« le: Octobre 07, 2015, 04:33:02 pm »
Bonjour :)

Je suis en train d'implémenter un brouillard de guerre, comme sur cette image :
https://zalifalcam.files.wordpress.com/2014/07/13.png

Trois possibilités donc :
Noir : jamais exploré
Noir-transparent : pas dans le champs de vision
Transparent : dans le champs de vision

J'ai fait ça avec une sf::VertexArray, pour l'instant, mais des fois ça foire un peu, l'écran reste transparent à certains endroits après le passage de la souris, alors qu'il ne devrait plus l'être.

int main()
{
    sf::Texture texture;
    texture.loadFromFile(blabla...);
    sf::Sprite sprite;
    sprite.setTexture(texture);
   
    sf::VertexArray vertexArray(sf::Points);
   
    // On colorie tout en noir
    for (unsigned i=0; i<480; i++)
        for (unsigned j=1; j<=360; j++)
            vertexArray.append({sf::Vector2f(i,j),sf::Color(0,0,0,255)});
   
    sf::RenderWindow window(sf::VideoMode(480,360),"SFML window",sf::Style::None);
   
    sf::Event event;
   
    sf::Vector2i mousePosition;
   
    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
           
            else if (event.type == sf::Event::KeyPressed)
            {
                if (event.key.code == sf::Keyboard::Escape)
                {
                    window.close();
                }
            }
           
            else if (event.type == sf::Event::MouseMoved)
            {
                // On colorie tout en "noir transparent" autour de l'ancienne position de la souris
                for (unsigned i=mousePosition.x-50; i<mousePosition.x+50; i++)
                    for (unsigned j=mousePosition.y-50; j<mousePosition.y+50; j++)
                        vertexArray[360*i+j].color.a = 150;
               
                // On colorie tout en transparent autour de la nouvelle position de la souris
                for (unsigned i=event.mouseMove.x-50; i<event.mouseMove.x+50; i++)
                    for (unsigned j=event.mouseMove.y-50; j<event.mouseMove.y+50; j++)
                        vertexArray[360*i+j].color.a = 0;
               
                mousePosition = sf::Mouse::getPosition(window);
            }
        }
       
        window.clear();
       
        window.draw(sprite);
        window.draw(vertexArray);
       
        window.display();
    }
   
    return 0;
}

Comment pourrais-je coder ça plus proprement ? Obligé de passer par OpenGL ?

:D

6
Bonjour,

Je code un petit HalfEdge. Voilà un code minimal :

#include <iostream>
#include <SFML/Graphics.hpp>

struct HalfEdge
{
    int x;
    int y;
    HalfEdge* next;
};

int main()
{
    std::vector<HalfEdge> m;
   
    m.resize(6);
   
    const int width = 600;
    const int height = 400;
   
    m[0] = {50,50,&m[1]};
    m[1] = {width,50,&m[2]};
    m[2] = {50,height,&m[0]};
    m[3] = {50,height,&m[4]};
    m[4] = {width,50,&m[5]};
    m[5] = {width,height,&m[3]};
   
    m.push_back({100,100,&m[0]});
   
    sf::VertexArray vertexArray(sf::Lines);
   
    for (unsigned i=0; i<m.size(); i++)
    {
        std::cout << m[i].x << "," << m[i].y << "," << m[i].next->x << "," << m[i].next->y << std::endl;
       
        vertexArray.append({sf::Vector2f(m[i].x,m[i].y),sf::Color(250,250,250,50)});
        vertexArray.append({sf::Vector2f(m[i].next->x,m[i].next->y),sf::Color(250,250,250,10)});
    }
   
    sf::RenderWindow window(sf::VideoMode(800,600), "SFML window");
   
    sf::Event event;
   
    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                window.close();
        }
       
        window.clear();
       
        window.draw(vertexArray);
       
        window.display();
    }
     
    return 0;
}
 

J'observe un comportement plutôt étrange : quand je n'ajoute pas les points à vertexArray, l'output est le suivant (tout bon)
50,50,600,50
600,50,50,400
50,400,50,50
50,400,600,50
600,50,600,400
600,400,50,400
100,100,50,50
Alors que quand je les ajoute, ça part en cacahuète :
50,50,600,50
600,50,50,400
50,400,1112014848,1112014848
50,400,0,184220410
600,50,0,1073741824
600,400,855309050,0
100,100,0,1073741824

Est ce un problème de la SFML ou du vector, je ne sais pas trop. Mais ça me dérange :P Quelqu'un a déjà eu ce problème ?

7
Réseau / [Résolu]Envoi de texte Client->Serveur : un paquet par mot
« le: Juin 14, 2015, 09:21:32 pm »
Bonjour :)

J'ai un programme simple : le Client demande à l'utilisateur de saisir une chaine de caractère, puis le Client l'envoi au Serveur pour que celui ci l'affiche. Ça donne :

Coté Client :

#include <SFML/Network.hpp>
#include <iostream>

int main()
{
    // On ouvre un chemin vers l'adresse 127.0.0.1, port 530000
    sf::TcpSocket socket;
    socket.connect("127.0.0.1",53000);

    while (1)
    {
        // On crée un message
        std::string message;
        std::cin>>message;
       
        // On crée un paquet avec le message dedans
        sf::Packet packet;
        packet << message;
       
        // On envoie le paquet
        socket.send(packet);
    }
   
    // On ferme le chemin
    socket.disconnect();

    return 0;
}

Coté Serveur :

int main()
{
    // On écoute le port 53000
    sf::TcpListener listener;
    listener.listen(53000);

    // Si on trouve le client, on l'accepte
    sf::TcpSocket client;
    listener.accept(client);
   
    while (1)
    {
        sf::Packet packet;
   
        // On attend un packet (bloque)
        client.receive(packet);
       
        std::string data;
        packet >> data;
       
        // On l'affiche
        std::cout << "Nouveau paquet : " << data << std::endl;
    }
   
    // On arrête d'écouter le port 53000
    listener.close();
   
    return 0;
}

Le problème, c'est que quand je saisis "Hello World", le Serveur reçoit deux paquets : "Hello" et "World". Pas super pratique ! Est-ce un bug ou dois-je m'accommoder de cela ?

En tous cas, la SFML, c'est super cool 8) 8) 8)

8
Graphique / [Résolu]linker error en utilisant openGL
« le: Septembre 18, 2014, 02:19:31 pm »
Bonjour :)

Je suis sous mac, et j'aimerais commencer à utiliser openGL, j'ai écrit ce code tout simple :

#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>

int main()
{
    sf::Window window(sf::VideoMode(800,600), "Hello");
   
    glClearColor(1.0f,1.0f,1.0f,1.0f);
   
    while (window.isOpen())
    {
        sf::Event event;
       
        while (window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }
       
        glClear(GL_COLOR_BUFFER_BIT);
       
        window.display();
    }
   
    return 0;
}

Mais j'ai des erreurs de linkage pour glClearColor et glClear. Quelqu'un a-t-il eu le même problème ?

9
Bonjour,

Ce post concerne la gestion des évènements sur SFML 2.1

Je remarque une faible sensibilité à la molette de souris : lorsque je la fais tourner d'un cran, la SFML détecte bien un mouvement de molette (event.type == sf::Event::MouseWheelMoved) mais le delta enregistré est de 0. Idem avec deux, voire trois crans. Ce n'est que lorsque je donne un bon coup de molette que le delta dépasse, en valeur absolue, le 0. Je suis sur mac, je ne sais pas si les autre systèmes sont concernés par ce petit désagrément :)

Y a-t-il une solution ? Sinon, j'espère que la SFML 2.2 prendra en compte ce petit post !

Bonne journée,

10
Bonjour, j'essaie de créer une console pour mon petit programme, comme sur cette image :
http://www.legendra.com/media/screenshots/pc/baldur__s_gate/screen_10.jpg

Pour pouvoir faire des mots de différentes couleurs sur une même ligne, j'utilise un pair de sf::Text. Un deque contient ces pair, chaque élément du deque représentant une ligne.

Cette console est donc un champ de texte et pour faire défiler ce texte, il me faudrait une slidebar. Je suis donc parti sur l'idée suivante : je crée une sf::RenderTexture sur laquelle je dessine tous mes sf::Text, je passe cette renderTexture sur un sprite et ensuite, pour faire défiler mon texte, j'utiliserai la méthode setTextureRect. C'est un peu barabare, je préfèrerai ne pas avoir à passer par une renderTexture, si vous avez une autre idée je suis bien sûr preneur..

Voici donc ma classe Console :

Console.h
class Console : public sf::Drawable, public sf::Transformable
{
public:
   
    Console();
       
    void type(std::string string1, std::string string2 = " ");
   
    void setColors(sf::Color color1, sf::Color color2 = sf::Color::White);

    void clear();

    void finalize();
       
private:
   
    std::deque<std::pair<sf::Text,sf::Text> > lines;
   
    std::pair<sf::Text,sf::Text> line;
   
    sf::Font font;
       
    int lineSpacing;
   
    sf::RectangleShape textField;

    sf::RenderTexture renderTexture;
   
    sf::Sprite sprite;
   
private:
   
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
};

Console.cpp
Console::Console()
{
    font.loadFromFile("/Users/HéhéVousSaurezPaaas/Desktop/Data Files/Font/Chantelli_Antiqua.ttf.ttf");
   
    line.first.setFont(font);
   
    lineSpacing = font.getLineSpacing(12)-3; // -3 = pour rapprocher les lignes entre elles

    line.first.setCharacterSize(12);
   
    line.second.setCharacterSize(12);

    line.second.setFont(font);
   
    textField.setSize(sf::Vector2f(700,100));
   
    textField.setFillColor(sf::Color(0,0,0,175));
}


void Console::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
    states.transform *= getTransform();
   
    target.draw(textField, states);
   
    /*
    for (int i=0; i<lines.size(); i++)
    {
        target.draw(lines[i].first, states);
        target.draw(lines[i].second, states);
    }
    */


    target.draw(sprite, states);
}


void Console::type(std::string string1, std::string string2)
{
    // On commence par assigner les chaines de caractère
    line.first.setString(string1);

    if (string2 == " ")
    {
        string2.clear();
    }
   
    line.second.setString(string2);
   
    // Puis on gère les positions : si c'est la première ligne qu'on écrit
    if (lines.empty())
    {    
        // on la palce en (0,0)
        line.first.setPosition(0,0);
    }
   
    // Sinon
    else
    {
        // Il faut revenir à la ligne
        line.first.setPosition(0,lines.size()*lineSpacing);
    }
   
    line.second.setPosition(line.first.getGlobalBounds().width,line.first.getPosition().y);
   
    lines.push_back(line);
}

void Console::setColors(sf::Color color1, sf::Color color2)
{        
    lines.back().first.setColor(color1);
   
    lines.back().second.setColor(color2);
}

void Console::finalize()
{
    renderTexture.create(700,300);
   
    renderTexture.clear(sf::Color::Transparent);
   
    for (int i=0; i<lines.size(); i++)
    {
        renderTexture.draw(lines[i].first);
        renderTexture.draw(lines[i].second);
    }
   
    renderTexture.display();
   
    sprite.setTexture(renderTexture.getTexture());
}

void Console::clear()
{
    lines.clear();
}

Et un petit exemple d'utilisation :
Console console;
   
   
   
    console.type("Bonjour", "je");
   
    console.setColors(sf::Color::Yellow, sf::Color::Green);
   
    console.type("suis le ", "capitaine sur ce navire");
 console.setColors(sf::Color::Blue);

    console.finalize();

// boucle du jeu...
window.draw(console);

 

Ce code ne marche pas, bien entendu, et cette méthode finalize() et appelée à disparaitre, du moins je l'espère.. Après des tests, j'ai compris que la partie "renderTexture.clear, renderTexture.draw, renderTexture.display()" devait se faire à chaque boucle, il serait donc logique de faire ces étapes dans la fonction draw mais puisqu'elle est const, je suis un peu embêté.

Tel quel, ce code donne un texte très flou, c'est même pas du flou en fait, c'est plus des barres, de même longueur et de même couleur que les mots. Pas vraiment exploitable, donc ^^

Comment faire ?

Merci de vos réponses.

11
Bonjour,

Voilà voilà, quand j'ai vu que la version finale de SFML était sortie je me suis précipité, vous pensez !

Je n'ai donc supprimé aucun fichier de mon ordinateur, j'ai juste remplacé les fichiers à remplacer, soit :
- Les frameworks,
- Les bibliothèques externes,
- Les templates

Seulement voilà, quand je lance mes anciens projets, qui tournaient sous SFML 2 RC, ou que j'en crée de nouveaux (et dans ce cas, je n'oublie pas de sélectionner " C++98 with GCC and libstdc++ and target 10.5 " dans les options du nouveau projet), j'ai toujours la même erreur de compilation, qui semble avoir un lien avec sf::RenderWindow, allez savoir ;D Je mets une capture d'écran, je pense que c'est mieux, je ne comprends même pas la nature de l'erreur en fait. Je précise que je tourne sous X Code 4.2.

Please Help !

Mr Pchoun.

[attachment deleted by admin]

12
Graphique / Priorité d'affichage et gestion de profondeur
« le: Avril 21, 2013, 03:36:04 am »
Hello tout le monde :)

Alors voilà, je suis en train de faire un petit moteur 2d en SFML (non isométrique), et au fur et à mesure que les choses avancent je commence un petit peu à me demander si ma manière de coder est la bonne. Pour l'instant je "travaille" sur des environnements relativement peu gourmands en ressources : deux ou trois personnages animés, aucune gestion de collisions, pas de pathfinding, une map en 500x500, bref.. Je peux être content de mon framerate mais j'ai peur qu'à force d'ajouter des paramètres et des calculs à mon moteur, ça ne commence à ramer sévère ! J'ai donc deux questions, l'une relative à la manière d'afficher mes sprites, l'autre portera sur la gestion de la profondeur ( même si en fait, ces deux questions sont plutôt liées )

S'agissant de la manière dont j'affiche mes sprites ( animés ou non ), j'ai une classe "GameBoard" qui possède une méthode draw, et qui prend en argument une référence vers la fenêtre active, donc sf::RenderWindow &target, et une référence vers l'horloge du programme, sf::Clock &clock. Ce plateau de jeu (GameBoard) possède dans sa section private une vector de sprite. Ces sprites ne sont pas ceux de la SFML mais une version personnalisée, ils sont dessinés sur &target au moyen d'une boucle for qui "passe " tout le vector, et sont mis à jour grâce à &clock, pour ceux qui sont animés.
Je me demandais si la boucle for est un choix judicieux ? Il est évident que la méthode draw de ma classe GameBoard a tout intérêt à être rapide puisqu'elle est appelée à chaque fin de boucle dans mon main, alors déjà que chacun de mes sprites animés a besoin d'être mis à jour, je suis pas sûr qu'une boucle avec incrémentation soit la manière de faire la plus optimisée. En même temps, je ne vois que cette solution, mais peut être que je me trompe ?

Quant à la manière dont je compte gérer la profondeur, je n'ai encore rien testé, ce sont juste des idées, et je voudrais savoir ce que vous en pensez : je compte utiliser un vector de tous les sprites, animés ou non, que j'aurais à afficher (et là je vous renvoie à la question précédente, et hop… boucle infinie, héhé ), vector qui contiendra, dans l'ordre, les sprites à afficher. Pour tout ce qui s'agira du décor (par exemple, pour les arbres ou les maisons), on est d'accord que ça ne bougera jamais, donc chaque map aura un fichier de données associé, dans lequel il sera écrit quels décors doivent être affichés en premier, en fait ils y seront tous écrits, dans le bon ordre. Pas de problème de ce côté là.
Le vrai problème vient des personnages qui eux, sont mobiles, et qui par conséquent changeront de place dans les priorités d'affichage. Il suffira d'un std::swap pour les déplacer dans le vector, mais je me demande encore comment déterminer cette priorité d'affichage. J'ai donc pensé à associer une sorte de " ligne de masquer/afficher " à chaque sprite.
Cherchez donc dans les fichiers joints, et modérez vous dans vos compliments sur mes talents de graphiste, s'il vous plait. J'en ai marre qu'on me jette des fleurs. On voit, en haut, trois sprites : le bleu, pour celui du personnage vert, le rouge, pour la maison, le orange, pour le personnage violet. Dans la vrai vie, si l'on peut dire, le personnage vert est derrière la maison, qui est elle même derrière le personnage violet. Dans mon modèle, la ligne de masquer/afficher du sprite bleu se trouve au dessus de celle de la maison et il est donc affiché en premier. Idem ensuite pour déterminer les priorités d'affichage entre sprite orange et rouge. Cette méthode me permet, dans le dessin du bas, de déterminer des priorités d'affichage dans des cas où elles ne sont forcément évidentes, puisque les sprites sont dans des positions identiques. Pourtant, il va de soi que le personnage est affiché derrière l'arbre, à gauche, tandis qu'il est devant la maison, à droite.
Mais cette méthode est à mon avis bien trop gourmande en ressources, et c'est bien ce qui m'inquiète. Ma fonction draw ferait beaucoup de test, beaucoup de calculs, parfois des "swap", et c'est sans compter les mise à jour des sprites animés, bref..

Que pensez vous de tout ça ? ;D

[attachment deleted by admin]

13
Graphique / classe Anim ( une autre ! ), des suggestions ? [SFML 2.0]
« le: Mars 05, 2013, 02:54:50 pm »
Bonjour !

Alors voilà, je viens de faire ma propre classe Anim, pour gérer les animations à l'écran. Il n'y a pour l'instant aucune fonction de pause ou même de déplacement. Considérez donc que ce code marche pour quelque chose comme une fontaine. Dans les grandes lignes, on va demander à la classe de faire un vector de textures ( chaque texture contiendra un fichier png, soit une étape du mouvement ). Ensuite, selon le temps écoulé, on va charger un élément x du vector dans un sprite, sprite qu'on va ensuite dessiner à l'écran. Ma classe est une dérivée de la classe sf::Drawable, du coup je sais pas trop si c'est bien d'utiliser des sprite à l'intérieur de ma classe, sachant que les sprites sont eux mêmes dérivés de la classe sf::Drawable.

Enfi bref, voici la bête :

Anim.cpp :

#include "Anim.h"
#include <SFML/Graphics.hpp>

/* À chaque appel de cette fonction, on charge un nouveau fichier dans m_texture, puis on place une copie de m_texture dans un nouvel
élément de Tableau. i compte le nombre de fois que l'on répète cette action, soit le nombre d'éléments de Tableau */

void Anim::addFrame(std::string chemin)
{
    sf::Texture m_texture;
    m_texture.loadFromFile(chemin);
    Tableau.push_back(m_texture);
    i++;
}

/* Simple réutilisation de la fonction setPosition de la classe sf::Sprite */
void Anim::setPosition(int x, int y)
{
    m_sprite.setPosition(x, y);
}

/* À chaque passage de la boucle while, on regarde le rapport suivant : temps écoulé/temps d'affichage de chaque image. Ce rapport,
tronqué à la première décimale grace à une pseudo conversion en entier, nous permet de nous déplacer dans Tableau. Chaque texture,
chaque élément du tableau est successivement chargé dans m_sprite, m_sprite étant ensuite affiché à l'écran par la fonction
virtuelle draw, présente dans le header de cette classe.
On remarque un décalage de 1 : juste après le lancement de clock, le rapport, encore inférieur à 1, est tronqué à sa première décimale
et vaut donc 0. Or, la première case de Tableau n'est pas la case [0] mais la case [1] puisque la première fois qu'on a modifié le
Tableau c'était après un push_back. L'erreur est ensuite corrigée dans la fonction setTexture, par a-1. Notons enfin le clock.restart() :
la fonction marche en boucle, il est donc normal de réinitialiser l'horloge une fois que l'on a dépassé le temps total d'affichage d'une
boucle */

void Anim::update()
{
    int a=((clock.getElapsedTime().asSeconds())/framerate)+1;          
    if (a>i)
    {
        clock.restart();
    }
    else if (a<=i)
    {
        m_sprite.setTexture(Tableau[a-1]);
    }
}

/* x est le temps d'affichage de chaque frame, framerate représente donc le nombre de frame par seconde */
void Anim::setFrameRate(float x)
{
    x=1/x;
    framerate=x;
}
 

Anim.h : 

#ifndef Anim_h
#define Anim_h

#include <SFML/Graphics.hpp>

class Anim : public sf::Drawable
{
public:
   
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        target.draw(m_sprite, states);
    }
    void addFrame(std::string chemin);
    void setPosition(int x, int y);
    void update();
    void setFrameRate(float x);
   
private:
   
    std::vector<sf::Texture>Tableau;
    sf::Sprite m_sprite;
    sf::Clock clock;
    unsigned int i;
    float framerate;
};

#endif
 

main.cpp :

#include <SFML/Graphics.hpp>
#include "Anim.h"

int main()

    Anim fontaine;
   
    fontaine.addFrame("/Users/blabla/0.png");
    fontaine.addFrame("/Users/blabla/1.png");
    fontaine.addFrame("/Users/blabla/2.png");
    fontaine.addFrame("/Users/blabla/3.png");
    fontaine.addFrame("/Users/blabla/4.png");

    fontaine.setFrameRate(20);
    fontaine.setPosition(300, 200);
     
    sf::RenderWindow window(sf::VideoMode(800, 600), "Fenetre");
   
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }
        window.clear();
        fontaine.update();
        window.draw(fontaine);
        window.display();
    }
    return 0;
}
 

Voilà voilà… Et donc je me demandais si vous aviez des suggestions d'améliorations à faire, enfin ma classe marche plutôt bien, mais je suis ouvert aux critiques donc je viens vous demander votre avis !

Mr Pchoun.

14
Graphique / Déplacement de sprite avec la souris [SFML 2.0][Résolu]
« le: Février 27, 2013, 08:41:32 pm »
Bonjour à tous :)

Alors voilà, je me suis mis en tête de déplacer un sprite à l'écran par un clic de la souris. Je m'explique : quand le programme se lance, le sprite est affiché en haut à gauche de l'écran ( ça lui apprendra ! ) puis quand on clique sur la souris, le sprite se déplace gaiement, d'un mouvement simple et allègre, vers l'endroit où on a cliqué.

J'utilise pour ça 3 vecteurs.
Le premier, pour la position du sprite ( on l'appelle position )
Le deuxième, pour enregistrer la position de la souris lorsqu'on a cliqué ( on l'appelle destination )
Le troisième vecteur représente quant lui le trajet à parcourir ( destination - position, qu'on appelle… vecteur. Oui, je suis pas trop inspiré là )

Il s'agit ensuite de placer notre sprite en ( destination - (1-t)vecteur )

t varie entre [0 ; 1], il est en fait le rapport du temps passé depuis le début du mouvement sur le temps total du mouvement ( calculé par le désormais célèbre v.d ). Mais jugez plutôt :


#include <SFML/Graphics.hpp>
#include <math.h>
#include <time.h>
#include <iostream>

int main ()
{
    bool moving(0);
    float a(0);
    float v(0.01);// vitesse de déplacement ( en inverse )
    float distance;
   
    sf::RenderWindow window(sf::VideoMode(800, 600), "Deplacer une ellipse");
   
    sf::Texture perso;
   
    perso.loadFromFile("/Users/blablabla/image.png");
   
    sf::Sprite mysprite(perso);
   
   
    sf::Vector2f position(0,0);
   
    sf::Vector2f vecteur(0,0);
   
    sf::Vector2f destination(0,0);

    sf::Clock clock;

   
   

    window.clear();
   
    mysprite.setPosition(position);

    window.draw(mysprite);

    window.display();
   
   
   
    while (window.isOpen())
    {
        sf::Event event;
       
        while (window.pollEvent(event))
        {
                if ((event.type == sf::Event::Closed) || (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape))
                {      
                window.close();
            }
           
            if ((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
            {
                destination.x=event.mouseButton.x;
               
                destination.y=event.mouseButton.y;

                vecteur=destination-position;
               
                moving = true;
               
                clock.restart();
               
                distance=(vecteur.x > vecteur.y ) ? vecteur.x : vecteur.y ;
            }
        }
       
       
        if (moving==true)
        {
            sf::Time elapsed = clock.getElapsedTime();
           
            a=elapsed.asSeconds();
           
            mysprite.setPosition(destination-vecteur*(1-(a/(v*distance))));
           
            position.x=(destination.x-vecteur.x*(1-(a/(v*distance))));
            position.y=(destination.y-vecteur.y*(1-(a/(v*distance))));
               
           
           
           
            if (a/(v*distance)>1)
            {
                moving=false;
                position=destination;
            }
             
           
           
        }
     
       
        window.clear();
       
        window.draw(mysprite);
       
        window.display();
       
       
    }
        return EXIT_SUCCESS;
}

Voilà voilà... " Mais ton code est parfait ", me diriez vous, et vous n'auriez pas tort ( j'espère que vous avez saisi mon humour glacé et raffiné ), quoiqu'un peu quand même.. En fait, des fois mon sprite se trompe de direction : au lieu d'aller en haut à gauche, comme je le lui dis avec la souris, ce petit rigolo part en bas à droite. Curieux, n'est ce pas ! Auriez vous une solution ?

Autre fait amusant, et pas des moindres : parfois, mon sprite va trop vite. Je pensais pourtant avoir calculé son déplacement par rapport au temps, et non par rapport aux caprices de framerate de mon ordinateur, mais il faut croire que j'ai du me planter quelque part.

Enfin voilà, si une bonne âme passe par là et qu'elle a la solution à tous mes problèmes ce serait super sympa de laisser une petite réponse !

Merci.

Bonne journée, ou bonne soirée, et joyeux noël  ;D

Mr Pchoun.

Pages: [1]