Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Vertex/ VertexArray  (Lu 2901 fois)

0 Membres et 1 Invité sur ce sujet

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Vertex/ VertexArray
« le: Novembre 08, 2014, 08:50:07 am »
Bonjour.

J'ai constaté qu'il était impossible de mémoriser des sf::Vertex dans les attributs d'une class. Est-il possible, avec les fameuses entités, de remédier à ce problème, tout en profitant au maximum des capacités de la carte graphique?
J'ai essayé avec une dérrivée de Drawable, comme dans le tuto, mais cela semble pas marcher non plus.

la seule solution pour utiliser correctement les Vertexs est-elle de les charger dans le même tread que celui qui les dessines?

Merci si vous pouvez m'aider  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vertex/ VertexArray
« Réponse #1 le: Novembre 08, 2014, 09:35:29 am »
Que de questions vagues... mais rien de vraiment concret ;)

Citer
J'ai constaté qu'il était impossible de mémoriser des sf::Vertex dans les attributs d'une class.
Ca ne veut rien dire. Si tu as une erreur de compilation précise, donne la ainsi que le code correspondant.

Citer
Est-il possible, avec les fameuses entités, de remédier à ce problème
C'est quoi les "fameuses entités" ?

Citer
tout en profitant au maximum des capacités de la carte graphique?
Quel rapport avec la choucroute ?

Citer
J'ai essayé avec une dérrivée de Drawable, comme dans le tuto, mais cela semble pas marcher non plus.
Quel code ? Quelles erreurs ?

Citer
la seule solution pour utiliser correctement les Vertexs est-elle de les charger dans le même tread que celui qui les dessines?
Pourquoi est-ce que tu parles de threads ?

Bref, ne raconte pas ta vie, et n'essaye pas d'expliquer ce que tu crois être des solutions, décris juste ton problème précisément.
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : Vertex/ VertexArray
« Réponse #2 le: Novembre 08, 2014, 01:11:13 pm »
Tout d'abord merci pour le soutien que vous apportez !

Il n'y a pas d'erreur de code. Tout fonctionne bien, simplement l'affichage par VertexArray/Quad n'opère pas, alors qu'il fonctionne avec Sprite.

Je vous présente ici l'architecture globale de mon jeu pour expliciter mon problème.SVP si vous avez des remarques ou des conseils, faites m'en part !

J'ai également essayé avec une entité, comme expliqué ici: http://sfml-dev.org/tutorials/2.1/graphics-vertex-array-fr.php
mais, sauf erreur de ma part, avec ma technique d'affichage, ca ne fonctionne toujours pas.

voici mon code:

Tout d'abord, l'objet " Niveau1" est lancé par un autre objet (servant à déterminer quel niveau jouer), qui lui transmet &m_afficheur, et &m_ptrAffichageFinale (qui serviront a afficher):


int Niveau1::jouerNiveau()
    {    
     ...    
     m_afficheur->chargerNiveaux(1,m_ptrAffichageFinale);
     m_afficheur->charger(elementFeu);
     ...
     while (!controles.quitter()&&m_niveauOuvert == 1)
    {
     ...
     m_afficheur->envoiPosition(elementFeu); //raffraichi les positions a chaque frame
     m_afficheur->recoiVue(m_reperX,m_reperY,1600,900); //idem
     m_afficheur->afficherNiveau();
     ...
    }
 

Un objet Afficheur (m_afficheur) recoit les informations, pour les transmettre a l'objet AffichageNiveau...

 
     ...
void Afficheur::chargerNiveaux(int fond, AffichageFinale *ptrAffichageFinale)
     {
      affichageNiveaux.chargerNiveaux(fond,ptrAffichageFinale );
     }
     ...
//////////////////////Meme chose pour toutes les fonctions appelés////////////////////////////
 

...l'objet AffichageNiveaux, contient en private toutes les textures/animations de tous les niveaux. Il charge celles qui sont appelés et les envoi a l'affichage finale:


void AffichageNiveaux::chargerNiveaux(int fond, AffichageFinale *ptrAffichageFinale)
    {
    ...
    m_ptraffichageFinale = ptrAffichageFinale;
    ...  
    m_niveauxFond[1].loadFromFile("images/niveaux/niveau1/fondNiveau1.png");    
    m_spriteNiveauxFond[1].setTexture(niveauxFond[1]);
    ...
    sf::VertexArray m_quad(sf::Quads, 4);

/////////////////////pour le test///////////////////////////////

     m_quad[0].position = sf::Vector2f(10, 10);
     m_quad[1].position = sf::Vector2f(100, 10);
     m_quad[2].position = sf::Vector2f(100, 100);
     m_quad[3].position = sf::Vector2f(10, 100);

/////////////////////pour le test///////////////////////////////

    m_elementFeu .loadFromFile("images/element/feu/Feupassif.png");
    ...
     }

    ...

void AffichageNiveaux::afficher(){
    {
    ...
    m_ptraffichageFinale->recoiImage(m_quad,&m_elementFeu );//////////////ici on envoi l'image///
    m_ptraffichageFinale->recoiVue(&m_vue);
    ...
    m_ptraffichageFinale->afficher();

}
 

Enfin, Affichage finale récupère ces donnés et les affiche.


class AffichageFinale
{
public:
    AffichageFinale();
    ~AffichageFinale();
    ...
    void recoiImage(sf::VertexArray quad, sf::Texture *texture);
    void afficher();

private:

    sf::RenderWindow fenetreFinale;
    sf::View m_vue;
    ...    
    sf::Texture *m_texture;
    sf::VertexArray m_quad;  ////////////////////////////////ici le pb/////////////////////////////////////

};
 
 

#include "AffichageFinale"

void AffichageFinale::recoiImage(sf::VertexArray quad,sf::Texture * texture)
     {
     m_texture = texture;
     m_quad = quad;   ////////////////////////////////ici le pb/////////////////////////////////////
     }

     ...

void AffichageFinale::afficher()
     {
     if (fenetreFinale.isOpen())
          {
     sf::Event event;
     fenetreFinale.pollEvent(event);if (event.type == sf::Event::Closed){fenetreFinale.close();}

     
     fenetreFinale.clear(sf::Color::Black);
     ...
     fenetreFinale.setView(m_vue);
     ...
     fenetreFinale.draw(m_quad, m_texture); /////rien ne s'affiche/////////////////////////////////////////////
     ...
     fenetreFinale.display();

}}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vertex/ VertexArray
« Réponse #3 le: Novembre 08, 2014, 01:31:21 pm »
Citer
sf::VertexArray m_quad(sf::Quads, 4);
Là tu déclares une nouvelle variable m_quad au lieu d'utiliser celle qui est déclarée en membre de ta classe.
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : Vertex/ VertexArray
« Réponse #4 le: Novembre 08, 2014, 02:31:49 pm »
Oui, en effet.

C'est d'ailleurs aussi là qu'est mon pb : si j'enlève cette ligne de code, il plante, ce qui parait logique, puisque m_quad est un "primitive", hors en private, on ne peut pas écrire cette ligne :
sf::VertexArray m_quad(sf::Quads, 4);
ni même simplement
sf::Quads monQuad;
autrement dit créer une primitive. Sauf erreur, je suis donc contraint de l'écrire en "public" dans un tread..

J'ai donc essayé avec des vertex, mais le problème est finalement le même puisqu'il faut utiliser une primitive à un moment ou l'autre.
J'ai essayé en créant une Entité, comme dans le tuto, ça fonctionne en effet dans les tests, mais avec mon système, même problème..

il semblerait que vous en parliez ici:
http://fr.sfml-dev.org/forums/index.php?topic=12414.0

Ma question : Dans mon cas, puis-je contourner le problème et continuer d'utiliser mon système?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vertex/ VertexArray
« Réponse #5 le: Novembre 08, 2014, 02:35:01 pm »
La liste d'initialisation du constructeur :
AffichageNiveaux::AffichageNiveaux() : m_quad(sf::Quads, 4)
{
}

Ou bien les fonctions qui font la même chose après construction :
m_quad.setPrimitiveType(sf::Quads);
m_quad.resize(4);
Laurent Gomila - SFML developer

mazertys17

  • Full Member
  • ***
  • Messages: 123
    • Voir le profil
    • E-mail
Re : Vertex/ VertexArray
« Réponse #6 le: Novembre 08, 2014, 02:46:06 pm »
Oui.

Mais le résultat est le même, non? en tout cas, en faisant les test, ca fait la même chose...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vertex/ VertexArray
« Réponse #7 le: Novembre 08, 2014, 03:34:45 pm »
Non, les deux solutions que je t'ai données initialisent bien le membre m_quad de ta classe, alors que ton code crée une nouvelle variable, ce qui laissait le membre non-initialisé.

Si tu ne comprends pas bien ce que tu fais, ou du moins ce qui se passe dans ton code, tu devrais peut-être commencer par des exemples plus simples, histoire de mieux maîtriser l'utilisation des classes SFML (et accessoirement du C++). Sinon tu vas enchaîner problème sur problème et ne pas t'y retrouver dans ton gros code. Avance étape par étape.
Laurent Gomila - SFML developer