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 - Lolilolight

16
Graphique / [RESOLU]Petit problème (mon cube ne s'affiche pas)
« le: Novembre 05, 2013, 09:04:56 am »
Salut,

j'ai essayé de faire une librairies SFML-LIKE mais pour la 3D. (Les classes sont les même que celles de la SFML mais, elles permettrons en plus de dessiner des objets en 3D)

Tout baigne à part que (je ne sais pas pour quelle raison) opengl ne veut pas me dessiner des objets en 3D. :(

Hors que lorsque je fais des appels opengl directement dans une sf::Window ça marche, bref...

Voici un lien vers un code minimal qui reproduit le problème : http://www.partage-facile.com/JLQQ4SJ934/sfml3d.rar.html

Vous pouvez télécharger le fichier ?

17
Graphique / Petit problème avec glew.
« le: Novembre 04, 2013, 12:04:31 pm »
Salut, j'essaye de changer le module graphique de SFML pour faire de la 3D, cependant je rencontre un petit problème.

J'ai recodé les classes suivantes : Vertex, View, RenderTarget, VertexArray, RenderWindow ainsi que les classes de transformation.

Mais j'ai du aussi retaper la classe Texture dans mon projet, car, sinon, je n'ai pas accès aux ids de texture car seul la classe sf::RenderTarget y a accès vu qu'elle est amie de la classe Texture.

J'ai aussi utiliser un nouveau namespace pour pas qu'il y ai d'ambiguité entre les classes SFML et les miennes. (Mes classes sont donc, sf3::RenderTarget, sf3::Vertex, etc....)

Comme la classe Texture de la SFML utilise d'autres classes j'ai du retaper les fichiers GLCheck.hpp, TextureSaver.hpp, etc..., dans le dossier include de SFML.

Mais la classe Texture utilise aussi glew, et, j'ai donc retaper aussi les fichiers glew.h dans le dossier include de SFML.

Mais j'ai un problème, au linkage, il ne me trouve pas GLEW_ARB_texture_non_power_of_two

obj\Debug\Graphics\Texture.o||In function `ZN3sf37Texture12getValidSizeEj':|
D:\Projets-c++\SFML3D\Graphics\Texture.cpp|520|undefined reference to `_imp____GLEW_ARB_texture_non_power_of_two'
|
||=== Build finished: 1 errors, 71 warnings (0 minutes, 45 seconds) ===|
 

Pourtant j'ai bien rajouter le fichier glew.lib dans le dossier lib de SFML, et je l'ai bien linké à mon projet...


18
Graphique / Rendu avec un autre thread et matrice de vue opengl.
« le: Novembre 02, 2013, 12:28:10 pm »
Salut,
j'ai une question en ce qui concerne opengl, ou est ce que je dois charger les matrices lorsque j'effectue un rendu avec un autre thread, car, lorsque je charge les matrices dans le thread principal, cela ne marche plus lorsque j'ai lancé mon thread de rendu, j'ai donc du charger la matrice de vue dans mon thread de rendu.

#include "render3DWindow.h"
#include <SFML/OpenGL.hpp>
using namespace std;
using namespace sf;
Render3DWindow::Render3DWindow(Vec2f size, std::string title, ContextSettings settings) : Window(VideoMode(size.x, size.y), title, Style::Default, settings), view3D(size.x, size.y, 70, 500, Vec3f(0, 1,0)) {
    running = false;
    view3D.move(0, 0, 10);
}

void Render3DWindow::show () {


    running = true;
    setActive(false);
    m_thread = thread (&Render3DWindow::run, this);
    while(isOpen()) {

        sf::Event event;
        while (pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                // on stoppe le programme
                running = false;
            }
            else if (event.type == sf::Event::Resized)
            {
                // on ajuste le viewport lorsque la fenêtre est redimensionnée
                glViewport(0, 0, event.size.width, event.size.height);
            }
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
            view3D.move(view3D.getForward(), 0.1f);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
            view3D.move(view3D.getForward(), -1);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
            view3D.move(view3D.getLeft(), 1);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
             view3D.move(view3D.getLeft(), -1);
        }
    }
}
void Render3DWindow::run() {
    setActive(true);
    glEnable(GL_DEPTH_TEST);
    while (running)
    {
        // effacement les tampons de couleur/profondeur

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        ViewMatrix vm = view3D.getViewMatrix();
        float matrix[16];
        vm.getGlMatrix(matrix);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glLoadMatrixf(matrix);
        glBegin(GL_QUADS);

        glColor3ub(255,0,0); //face rouge
        glVertex3d(-1,1,1);
        glVertex3d(1,1,1);
        glVertex3d(1,-1,1);
        glVertex3d(-1,-1,1);


        glColor3ub(0,0,255); //face bleue
        glVertex3d(-1, 1, -1);
        glVertex3d(1, 1, -1);
        glVertex3d(1,-1, -1);
        glVertex3d(-1, -1, -1);

        glColor3ub(0,255,0); //face verte
        glVertex3d(1, 1, 1);
        glVertex3d(1, 1, -1);
        glVertex3d(1,-1, -1);
        glVertex3d(1, -1, 1);

        glColor3ub(255,255,0); //face jaune
        glVertex3d(-1,1,1);
        glVertex3d(-1,1,-1);
        glVertex3d(-1,-1,-1);
        glVertex3d(-1,-1,1);

        glColor3ub(0,255,255); //face cyan
        glVertex3d(1,-1,1);
        glVertex3d(1,-1,-1);
        glVertex3d(-1,-1,-1);
        glVertex3d(-1,-1,1);

        glColor3ub(255,0,255); //face magenta
        glVertex3d(1,1,1);
        glVertex3d(1,1,-1);
        glVertex3d(-1,1,-1);
        glVertex3d(-1,1,1);
        glEnd();
        display();
    }

}
 

Est ce bon comme ça ou bien il y a t'il une autre méthode ?

PS : j'ai vu ta classe view et je doute que la vue se déplace vraiment si on fait un rendu en utilisant un autre thread...., je n'ai jamais essayé mais...

19
Graphique / Chute de FPS.
« le: Octobre 14, 2013, 01:25:23 pm »
Salut.

J'ai changer mon code source pour faire un graph de scene et faire mes propre entités Drawable et Transformable, cependant, je remarque une chute de FPS, en gros, quand je dessinais mes entités à la façon SFML 1.6 avec une entité SFML de haut niveau en variable membre pour chaque entité dessinable et transformable j'avais un FPS de 60 et depuis que je suis passé au style "SFML 2" en créant mes propres entité transformable et dessinable je me retrouve avec un FPS de 6.

20
Salut.

Vu que on est que en 2D iso, donc, pas de projection, je me demandais si :

La matrice des textures avec opengl s'applique par face ou bien par texture ?

Car j'aimerais faire des rotations, redimentionnement et translation sur des images en 2D plutôt que sur des vertex, afin de tout mettre mes vertex utilisant la même texture dans une tilemap que j'envoie à opengl qui effectue ensuite les transformations sur les images.

Je pensais aussi utiliser un shader pour faire aussi un test sur la composante alpha des pixels lors du depthtest est ce que c'est possible ?



21
Salut, il y a un problème avec la classe VertexArray.

voici un code minimal qui reproduit le problème.

#include <SFML/Graphics.hpp>
#include "wall.h"
int main () {
     // création de la fenêtre
    sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
    sf::VertexArray va(sf::Points, 1);
    sf::Vertex vertex;
    vertex.position = Vector3f(100, 100, -1);
    va.append(vertex);
    // on fait tourner le programme tant que la fenêtre n'a pas été fermée
    while (window.isOpen())
    {
        // on traite tous les évènements de la fenêtre qui ont été générés depuis la dernière itération de la boucle
        sf::Event event;
        sf::View view(sf::FloatRect(0, 0, 800, 600));
        //view.move(-400, -300);
        while (window.pollEvent(event))
        {
            // fermeture de la fenêtre lorsque l'utilisateur le souhaite
            if (event.type == sf::Event::Closed)
                window.close();
        }

        // effacement de la fenêtre en noir
        window.clear(sf::Color::Black);

        cout<<"Position : "<<va[0].position.x<<" "<<va[0].position.y<<endl;
        // c'est ici qu'on dessine tout
        window.setView(view);
        window.draw(va);
        // fin de la frame courante, affichage de tout ce qu'on a dessiné
        window.display();
    }

    return 0;
}
 

Ca m'afficher 0, 0 pour la position du vertex, hors que ça devrait m'afficher 100, 100.
J'ai essayé avec toute les versions de la SFML la 2 et la 2.1 que je n'ai pas modifier mais ça ne règle pas le problème.

22
Discussions générales / La 3D.
« le: Septembre 22, 2013, 04:55:41 pm »
Salut,

je voudrais savoir si plus tard tu prévois de faire de la 3D avec SFML, j'entend par là faire des choses comme par exemple une view mais dans un monde en 3D.

Moi, je pense que se serait bien.

Si pas je pense que je vais modifier SFML pour faire ce genre de chose, je n'aurai qu'à rajouté ça et une composante z aux vertex et le tour sera joué je pourrai faire aussi de la 3D.  :)

23
Graphique / Meilleur moyen pour appliquer une transformation par vertex.
« le: Septembre 22, 2013, 09:58:35 am »
Salut,
je m'explique, j'ai une tile que je voudrais positionné par rapport à son coin supérieur gauche puis la redimentionner par rapport à son centre.

J'ai essayer de faire cela en positionnant un sprite avec l'origine a 0, 0 puis de combiner la transormation avec une autre qui fait un redimentionnement autour du centre de la tile mais ça ne marche pas pour la simple et bonne raison que, la position de la tile est toujours à l'origine de la transformation du coup même si je ne fait aucune translation lors de la seconde transformation, ma tile bouge quand même et donc n'est pas à la bonne place.

Après des jours de réflexion je n'ai trouvé qu'une seule solution, faire une translation de tout les vertex de la tile puis ensuite, redimentionner tout les vertex de la tile autour du vertex au centre de la tile. (l'origine est donc donné en coordonnée globale et non plus en coordonnée locales.)

Voici ce que ça donne avec un code source, en prenant juste le vertex haut gauche de la tile : (Ma tile fait 100 de largeur et 50 de hauteur.)

TransformMatrix tm;
tm.setTranslation(-50, 0);
Vec2f point(0, 0);
Vec2f result = tm.transform(point);
tm.setScale(2, 2);
tm.setOrigin(Vec2f(0, 25));
result = tm.transform(result);
cout<<result<<endl;
 

Vec2f TransformMatrix::transform (const Vec2f vec2) {
    Vec2f d (vec2.x - o2d.x, vec2.y - o2d.y);

    if (needToUpdate2D) {
        float angle = Math::toRadians(r2d);
        float ssx, scx, ssy, scy, tx, ty;
        ssx = Math::sinus(angle) * s2d.x;
        scx = Math::cosinus(angle) * s2d.x;
        ssy = Math::sinus(angle) * s2d.y;
        scy = Math::cosinus(angle) * s2d.y;
        tx = t2d.x;
        ty = t2d.y;
        matrix3f.m11 = scx;
        matrix3f.m12 = -ssy;
        matrix3f.m13 = tx;
        matrix3f.m21 = ssx;
        matrix3f.m22 = scy;
        matrix3f.m23 = ty;
        matrix3f.m31 = 0;
        matrix3f.m32 = 0;
        matrix3f.m33 = 1;
        needToUpdate2D = false;
    }
    return matrix3f * d + o2d;
}
 

Donc en gros il n'y a pas moyen de faire ce que je veux faire en utilisant une seule matrice de transformation pour tous les vertex de la tile, je ne peux pas non plus faire une matrice de transformation et l'envoyer à opengl car je fait une opération - et + sur la position de mes vertex avant et après la transformation. (Aïe!)

Faire ma propre classe Tile et effecuer une transformation de chaque vertex de la tile au niveau du CPU serait trop coûteux alors j'aimerais savoir quelle serait la meilleur solution pour faire ça.


24
Graphique / Juste une question.
« le: Septembre 21, 2013, 11:55:54 am »
Salut,

j'aimerais savoir si il est possible, dans une tileMap, de faire des transformations sur les tiles de la tile map car je vois que dans la tileMap de ton tutoriel, en fait on ne fait que de faire un tableau de vertex avec les coins des tiles et les coordonnées de textures, ok mais que se passe t'il si la tile de la tile map est redimentionnée, ou bien tournée ?
Il faut faire une rotation (ou un redimentionnement) des coordonnées de texture ???

Et si ma tile contient une bordure en plus (qui est un rectangle shape.) ça devient bien ennuyeux.

Un draw "tile par tile" serait peut être mieux dans ce cas là ou je me trompe ???

PS : ton tutoriel sur les tilesmaps est bien mais, ce n'est qu'à utiliser dans des cas très limité. (Même texture pour toutes les tiles même couche et aucune transformation.)

25
Graphique / Graph de scene, les transformations ne se combinent pas!
« le: Septembre 21, 2013, 10:15:29 am »
Salut.
J'ai essayé de faire un graph de scene plus complexe, un genre de design à base de composant, avec un composant racine contenant la transformation de toute entité. (donc toute entité transformable et dessinable hérite de ce composant, ce composant est invisible, il ne contient que la transformation de l'entité, c'est en fait la classe Transformable que j'ai fait à ma sauce.)
#ifndef DYNAMIC_DRAWABLE_ENTITY
#define DYNAMIC_DRAWABLE_ENTITY

#include <SFML/Graphics.hpp>
#include "vec2f.h"
class DynamicDrawableEntity : public sf::Drawable {
public :

    FloatRect getLocalBounds() {
        return localBounds;
    }
    void setCenter(Vec2f center) {
        Vec2f t = center - m_center ;
        move(t);
        needToUpdate = true;
        inverseNeedToUpdate = true;
    }
    Vec2f getCenter() {
        return m_center;
    }
    void setPosition(Vec2f position) {
        Vec2f t = position - m_position;
        move(t);
        needToUpdate = true;
        inverseNeedToUpdate = true;
    }
    Vec2f getSize() {
        return m_size;
    }
    Vec2f getPosition() {
        return m_position;
    }
    void setRotation (float angle) {
        m_rotation = static_cast<float>(fmod(angle, 360));
        if (m_rotation < 0)
            m_rotation += 360.f;
        angle  = -m_rotation * 3.141592654f / 180.f;
        needToUpdate = true;
        inverseNeedToUpdate = true;
        FloatRect bounds = getGlobalBounds();
        m_size.x = bounds.width;
        m_size.y = bounds.height;
        Vec2f delta (m_size.x / bounds.width * m_origin.x, m_size.y / bounds.height * m_origin.y);
        m_position = m_center - delta;
        onRotate(angle);
    }
    void setScale(Vec2f scale) {
        m_scale = scale;
        needToUpdate = true;
        inverseNeedToUpdate = true;
        FloatRect bounds = getGlobalBounds();
        m_size.x = bounds.width;
        m_size.y = bounds.height;
        m_position = m_center - m_scale * m_origin;
        onScale(scale);
    }
    void scale(Vec2f s) {
        setScale(m_scale * s);
    }
    void rotate (float angle) {
        setRotation(m_rotation + angle);
    }
    void move (Vec2f t) {
        m_position += t;
        m_center += t;
        needToUpdate = true;
        inverseNeedToUpdate = true;
        onMove(t);
    }
    void setOrigin(Vec2f origin) {
       Vec2f t = origin - m_origin;
       m_origin = origin;
       m_center += t;
       needToUpdate = true;
       inverseNeedToUpdate = true;
    }

    Vec2f getScale() {
        return m_scale;
    }
    float getRotation() {
        return m_rotation;
    }
    Vec2f getOrigin() {
        return m_origin;
    }
    void setSize (Vec2f size) {
        setScale(size / m_size);
        needToUpdate = true;
        inverseNeedToUpdate = true;
    }

    FloatRect getGlobalBounds() {
        FloatRect globalBounds = getTransform().transformRect(localBounds);
        return globalBounds;
    }
    const sf::Transform& getTransform() const {
         // Recompute the combined transform if needed
        if (needToUpdate) {

            float angle  = -m_rotation * 3.141592654f / 180.f;
            float cosine = static_cast<float>(std::cos(angle));
            float sine   = static_cast<float>(std::sin(angle));
            float sxc    = m_scale.x * cosine;
            float syc    = m_scale.y * cosine;
            float sxs    = m_scale.x * sine;
            float sys    = m_scale.y * sine;
            float tx     = -m_origin.x * sxc - m_origin.y * sys + m_center.x;
            float ty     =  m_origin.x * sxs - m_origin.y * syc + m_center.y;

            const_cast<DynamicDrawableEntity*>(this)->m_transform = sf::Transform( sxc, sys, tx,
                                      -sxs, syc, ty,
                                      0.f, 0.f, 1.f);
            const_cast<DynamicDrawableEntity*>(this)->needToUpdate = false;
        }
        return m_transform;
    }
    const sf::Transform& getInverseTransform()
    {
        // Recompute the inverse transform if needed
        if (inverseNeedToUpdate)
        {
            const_cast<DynamicDrawableEntity*>(this)->m_inverseTransform = getTransform().getInverse();
            const_cast<DynamicDrawableEntity*>(this)->inverseNeedToUpdate = false;
        }

        return m_inverseTransform;
    }
protected :
    DynamicDrawableEntity(Vec2f position, Vec2f size, Vec2f origin) {
        localBounds = FloatRect(position.x, position.y, size.x, size.y);
        m_position = position;
        m_size = size;
        m_center = Vec2f (m_position.x + origin.x, m_position.y + origin.y);
        m_origin = origin;
        m_scale = Vec2f(1.f, 1.f);
        m_rotation = 0;

        needToUpdate = true;
        inverseNeedToUpdate = true;
    }
    virtual void onRotate(float angle) {}
    virtual void onScale(Vec2f s) {}
    virtual void onMove(Vec2f t) {}
private :
    FloatRect localBounds;
    Vec2f m_position, m_size, m_center,m_scale,m_origin;
    float m_rotation;
    sf::Transform m_transform;
    sf::Transform m_inverseTransform;
    bool needToUpdate, inverseNeedToUpdate;
};
#endif // TRANSF_ENTITY
 

De cette racine je fait dérivé des noeuds qui sont toutes les entités transformable, et ces noeud peuvent ontenir des noeud enfants qui sont d'autres entités transfomable.

Bref voici par exemple la classe Tile qui est un noeud :
tile.h :
#ifndef TILE
#define TILE
#include "dynamicDrawableEntity.h"

class Tile : public DynamicDrawableEntity {
    public :
        Tile (sf::Texture &image, Vec2f position, Vec2f size, sf::IntRect subRect);
        virtual void draw (sf::RenderTarget &target, sf::RenderStates states) const;
    private :
        sf::Sprite sprite;
};
#endif
 
tile.cpp :
#include "tile.h"



using namespace sf;
using namespace std;

/*Gère les différents tiles, cette classe contient un Sprite.
*/

//Crée un tile, avec une image passée en paramètre.
Tile::Tile (sf::Texture &image, Vec2f position, Vec2f size, IntRect subRect) : DynamicDrawableEntity (position, size, size * 0.5f) {
    sprite.setTexture(image);
    sprite.setTextureRect(subRect);
    float factorX = size.x / (float) subRect.width;
    float factorY = size.y / (float) subRect.height;

    setScale(Vec2f(factorX, factorY));

}

void Tile::draw(RenderTarget &target, RenderStates states) const {
    target.draw(sprite, getTransform());
}
 

Et enfin la classe Wall qui est aussi un noeud mais qui contient un noeud enfant qui est la tile du mur :

#ifndef WALL
#define WALL
#include "tile.h"
class Wall : public DynamicDrawableEntity {
    public :
        Wall (Tile *tile) : DynamicDrawableEntity (tile->getPosition(), tile->getSize(), tile->getSize() * 0.5f)  {
            this->tile = tile;
        }
        Tile* getTile() {
            return tile;
        }


        virtual void draw (RenderTarget &target, RenderStates states) const {
            target.draw(*tile, getTransform());
        }

        virtual ~Wall () {
           delete tile;
        }
    private :
        Wall (const Wall &wall);
        Tile *tile;
};

#endif
 

Malheureusement quand je fait des transformations sur le mur, elles ne se combinent pas avec les transforations que je fais sur la tile, par exemple, lorsque je fais une rotation sur la tile elle se fait bien mais lorsque je refais une rotation sur le mur ensuite la tile reste à la même place hors qu'elle ne devrait pas. :/

Bref voici le main :
#include <SFML/Graphics.hpp>
#include "wall.h"
int main () {
     // création de la fenêtre
    sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
    sf::Texture *text = new sf::Texture();
    text->loadFromFile("murs.png");
    Tile *t = new Tile(*text, Vec2f(100, 100), Vec2f (130, 130), sf::IntRect(100, 0, 100, 100));
    t->setRotation(45);
    Wall *wall = new Wall(t);
    wall->setRotation(-45);
    // on fait tourner le programme tant que la fenêtre n'a pas été fermée
    while (window.isOpen())
    {
        // on traite tous les évènements de la fenêtre qui ont été générés depuis la dernière itération de la boucle
        sf::Event event;
        sf::View view(sf::FloatRect(0, 0, 800, 600));
        //view.move(-400, -300);
        while (window.pollEvent(event))
        {
            // fermeture de la fenêtre lorsque l'utilisateur le souhaite
            if (event.type == sf::Event::Closed)
                window.close();
        }

        // effacement de la fenêtre en noir
        window.clear(sf::Color::Black);


        // c'est ici qu'on dessine tout
        window.setView(view);
        window.draw(*wall);
        // fin de la frame courante, affichage de tout ce qu'on a dessiné
        window.display();
    }
    delete text;
    delete wall;
    return 0;
}
 

Voila.

26
Graphique / Petit problème de positionnement.
« le: Septembre 18, 2013, 10:46:38 am »
Salut,
j'aimerais positionner la tile et lorsque je change l'origine de la tile pour la redimentionner, que celle-ci ne bouge pas.

Par exemple je met la position de la tile a (0, 0) qui est la position du coin supérieur gauche de la tile.

Si ma tile fait 100*50 de taille, je met l'origine a 50,25 pour la redimentionner ok mais le problème c'est que la position du coin supérieur gauche de la tile devient alors -50,25 à cause de la formule suivante :

float tx     = -m_origin.x * sxc - m_origin.y * sys + m_position.x;
float ty     =  m_origin.x * sxs - m_origin.y * syc + m_position.y;

Donc ça donne :

x = -50 * 1 + 25 * 0 + 0 = -50
y = 50 * 0 + 25 * 1 + 0 = 25

Donc ma tile à bougé et je ne voudrais justement pas qu'elle ne bouge, je n'ai pas trouvé d'autre solution que d'initialiser la position avec le centre de la tile.

J'ai essayer de faire une variable m_center pour avoir les coordonnées globales de l'origine et de faire ça :

float tx     = -m_origin.x * sxc - m_origin.y * sys + m_center.x;
float ty     =  m_origin.x * sxs - m_origin.y * syc + m_center.y;

ou center est la position + l'origine.

Malheureusement ça ne marche pas, le redimentionnement ne se fait pass autour de l'origine mais autour du coin supérieur gauche de la tile.

Comment je pourrai faire ça donc sans être obligé à chaque fois d'initialiser la tile avec la position de son centre de transformation ?

27
Graphique / Un pointeur sur les coordonnées des vertex.
« le: Septembre 15, 2013, 04:36:29 pm »
Salut alors je m'explique.

J'ai une classe tileMap donc, qui contient, un vecteur de Tiles.

Je crée donc mes vertex comme ça :
 quad[0].position = Vector3f(tiles[i]->getPosition().x, tiles[i]->getPosition().y, zOrder);
        quad[1].position = Vector3f(tiles[i]->getPosition().x + tiles[i]->getSize().x, tiles[i]->getPosition().y, zOrder);
        quad[2].position = Vector3f(tiles[i]->getPosition().x + tiles[i]->getSize().x, tiles[i]->getPosition().y + tiles[i]->getSize().y, zOrder);
        quad[3].position = Vector3f(tiles[i]->getPosition().x, tiles[i]->getPosition().y + tiles[i]->getSize().y, zOrder);
 

Ce que je voudrais c'est que lorsque je change le z de ma tile par exemple, la composante z de mes vertex change aussi. (Ca m'aviterai de devoir parcourir mon vecteur de tiles et changer la position des mes vertex de ma tile dans le VertexArray.)

J'ai pensé à utiliser un pointeur sur la coordonnée z des vertex (comme je le fait déjà lorsque je change l'id de mes entités lorsque je supprime des entités pour pas devoir à chaque fois tout remettre à jour manuellement et pour des raisons d'optimisation aussi.) mais je ne sais pas si c'est possible de faire ça avec des sf::Vertex.

Ou alors je dois modifier SFML ?


28
Graphique / Problème d'ambiguité avec l'héritage.
« le: Septembre 11, 2013, 04:52:09 pm »
Salut,

j'ai un petit soucis au niveau code design, je m'explique :

J'ai une classe Entity, elle n'hérite de rien, elle contient juste un id et le type de l'entité et une variable booléenne pour savoir si l'entité est dynamique ou pas, cette classe est abstaite.
J'ai une classe TransfomableEntity qui hérite de Entity et qui contient un sf::Transform, cette classe est abstraite.
J'ai une classe DrawableEntity qui hérite de sf::Drawable et de Entity, cette classe est aussi abstraite.

J'ai de nouveau 2 classes abstraites, StaticDrawableEntity qui hérite de DrawableEntity et DynamicDrawableEntity qui hérite de DrawableEntity et de TransformableEntity, toujours abstraites.

Et j'ai une classe TexturedEntity qui hérite juste de DrawableEntity, elle est abstraite.

Sur le shéma ça donne ceci :
                          -------------------    ------------------    ------------------------
                          |   sf::Drawable |    |        Entity    |     |  sf::Transormable |
                          |                      |     |                   |      |                           |
                          -------------------   ------------------     ------------------------
                                               |    |                     |    |
                                         ---------------------------  ---------------------------
                                         | DrawableEntity         |  |   TransformableEntity |
                                         |                               |   |                                |
                                         ---------------------------  ---------------------------
                                         |               |            |       |
          -------------------------  ------------------  -----------------------------
          |StaticDrawableEntity|  |TexturedEntity|  |DynamicDrawableEntity|     
          |                              |  |                     |  |                                  |
          -------------------------  ------------------- -----------------------------   
Alors tout ce qui dérive de DynamicDrawableEntity est transformble et dessinable, il faut redéfinir la méthode draw, on peut redéfinir aussi d'autre méthodes si y'a quelque chose à faire lorsqu'on effectue une transformation. (une rotation, un changement d'échelle ou bien une translation.)
On peut appeler les méthodes qui change la géométrie d'une entité que si elle dérive de cette classe, à l'inverse des classes qui dérivent de StaticDrawableEntity.
Tout ce qui dérive de StaticDrawableEntity est dessinable mais pas transformable, il faut redéfinir la méthode draw donc.
Une classe peut donc dériver de StaticDrawableEntity ou de DynamicDrawableEntity mais elle peut aussi dériver de TexturedEntity si l'entité est texturée et là il faut redéfinir les méthodes getTexture et getTextureRect.

Voici les autres classes qui dérivent de ces différentes classes : Tile qui dérive de DynamicDrawableEntity et de TexturedEntity, même chose pour les classes Wall et Decor.

Light dérive de StaticDrawableEntity seulement.     
Shadow dérive de DynamicDrawableEntity seulement.

Le problème va se poser maintenant : j'ai une classe World qui permet d'ajouter des entités dans le monde, dans cette classe monde il y a une casse map qui contient des informations comme par exemple : le nombre de fois qu'une texture est utilisée sur la map, le nom de la map, etc...
Chaque map contient une grille dans laquelle sont ajouté les entités.

Bref dans cette grille tout mes objets sont de type entité.

Donc je suis obligé de faire hériter toutes mes classes de la classe Entity pour ensuite faire des static_cast et j'ai ainsi plusieurs méthodes selon le type d'entité que je veux récupérer dans la grille et faire ce que je veux si y'a des opérations spéciale à faire lorsque je rajoute, transforme ou supprime une entité dans le monde. (Par exemple si l'entité est texturée, qu'elle est supprimée et que la texture n'est plus utilisée par aucune autre entité, la supprimer.)

Cependant il y a un gros problème, lorsque je veux ajouter une entité dans le monde, une tile par exemple, avec la méthode World::addEntity (Entity *entity), il me dit qu'il y a une ambiguité à l'endroit ou j'appelle cette méthode car Tile dérive de TexturedEntity qui dérive de Entity, mais Tile dérive aussi de DynamcDrawableEntity qui dérive aussi de Entity.

Je suis obligé de faire dérivé les 2 de entity sinon je peux pas faire de cast de Entity vers DynamicDrawableEntity ou bien vers TexturedEntity.

Et je vois pas trop comment résoudre ce problème d'ambiguité.

Merci d'avance pour votre aide.

29
Graphique / VetexArray : suppression de vertex.
« le: Septembre 06, 2013, 12:13:42 pm »
Salut, je voudrais savoir si il y avait moyen de supprimer un vertex dans un VertexArray sans devoir fair un clear et rajouter tout les vertex à chaque fois que j'ajoute ou que je supprime une tile, merci.

30
Graphique / setPosition, setColor, zOrder et vertex animés.
« le: Septembre 06, 2013, 10:21:53 am »
Je sais que je l'ai peut être déjà dit mais dans mon cas j'ai absolument besoin d'une composante z à mes vertex, mes entité dérivant toutes de Drawable, je fais un draw directement sur l'entité au lieu de récupérer le sprite mais du coup je ne peux plus confondre les sprites de la SFML de ses différentes entité dans un vecteur et les trier (pas pour les bâtiments et les murs en tout cas car se sont 2 entités différentes.)
Sinon pour le sol pas de problème car j'ai plusieurs couche pour un même type d'entité.

Et comme mes entités autre que le sol ne continnent pas de semi-transparence j'ai décidé d'utiliser ma version perso de la SFML et de faire une tile map.

Cependant en passant de ma verion de sfml à la tienne je dois changer à chaque fois cette ligne de code pour avoir un Vector3f au lieu d'un Vector2f :

 (*triangles[numTris])[1].position = Vector2f(pointI1.x, pointI1.y);
 

Je me demande si un setPosition n'aurait pas été mieux dans se cas là en tout cas moi j'ai rajouté un constructeur dans la classe Vertex qui prend en paramètre un Vector3f et un autre qui prend en paramètre un Vector2f.

Peut être pour la SFML 3, espérons. ;)