IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Image et Texture


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Image et Texture
    Bonjour, je souhaite réaliser une classe Image et Texture qui respectent les conditions suivantes:
    - Les textures utilisent une image.
    - Lorsque l'image est modifiée, les textures qui utilisent l'image sont notifiées.
    - Lorsque l'image est détruire, les textures doivent être notifiées.

    Le soucis, c'est le troisième point. Pour les deux premiers j'ai utilisé le pattern Observer, et j'ai donc les classes suivantes:
    - ImageEvent : interface pour les evenements générés par une image.
    - ImageChangedEvent: Evenement pour indiquer que l'image a changé.
    - ImageErasedEvent: Evenement pour indiquer que l'image a été supprimé.
    - ImageListener: Interface qui représente un Observateur d'Image.
    - Image: ma classe Image.
    - Texture: ma classe Texture.
    [Note: Texture hérite de ImageListener]
    [Note2: ImageChangedEvent & ImageErasedEvent héritent de ImageEvent]

    Donc mon soucis comme je le disais, c'est le troisième point, je n'arrive pas à trouver de méthode élégante qui fait que lorsque mon image est détruire, ma texture se place en état "sécurisé".

    Ce que j'avais pensé, c'était que lorsque j'appellerai la fonction "maTexture.bind()", si jamais l'attribut "Image* image" (qui représente l'image associé) est à NULL, alors envoyer un tableau de pixel représentant une image 1x1 de couleur blanche à OpenGL. (Ne pas re-créer d'image donc)
    Vous pensez que c'est une bonne approche ?

    J'ai remarqué que la SFML avait ce système (enfin, ce que j'aimerai faire) avec la relation Image et Sprite. Quelqu'un pourrait m'en dire plus ? Merci d'avance à ceux qui prendront la peine de me répondre, et joyeuses fêtes de fin d'années

    (J'avais déjà posé une question similaire mais j'avais arrêté de m'y pencher, donc désolé pour la nouvelle question ^^')

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Et bien, à partir du moment où tu possèdes des helpers permettant d'implémenter facilement le pattern observer en gérant un système d'évènement, en quoi est-ce plus compliqué de lancer un évènement dans le destructeur d'une classe que dans une méthode quelconque?

    Pour la SFML, tu pourrais toujours demander directement à Laurent (créateur de cette biblio et usager du présent forum) mais pour m'en être brièvement servi je ne pense pas que cette bibliothèque utilise un système d'évènement pour quoi que ce soit (enfin, pour les entrées bien sur, mais on ne parle pas du même type de système d'évènement ).

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Et bien, à partir du moment où tu possèdes des helpers permettant d'implémenter facilement le pattern observer en gérant un système d'évènement, en quoi est-ce plus compliqué de lancer un évènement dans le destructeur d'une classe que dans une méthode quelconque?
    Oui c'est ce que j'ai fait: dans le destructeur de Image, la méthode "notifyListenerImageErased()" qui notifie tout les Observateurs que l'image va être détruite.
    Dans la méthode "imageErased(const ImageErasedEvent& event)" de la classe Texture, je ne sais pas quoi faire:
    -> Je veux faire en sorte que ma Texture reste "valide" même quand l'image est détruite. Le soucis est que si je supprime l'Image, elle ne représente plus l'image. Donc elle doit afficher une image blanche. Là est mon soucis.

    En effet, prenons un cas simple:
    -> Je crée une image: Image;
    -> Je crée une Texture qui utilise Image et qui s'appelle Texture.
    -> Dans Texture: j'ajoute la Texture à la liste des Observateurs de Image.
    -> Je supprimer mon Image.
    -> Image notifie Texture de la suppression.
    -> Texture va re-créer une Image temporaire pour éviter d'être dans un état d'erreur.
    -> Elle va donc s'ajouter à la liste des Observateurs de cette Image temporaire.
    -> Maintenant, je fais la méthode "setImage("une_autre_image.png") à la Texture.
    -> Texture doit supprimer l'Image temporaire qu'il a créé. Le soucis: comment savoir que c'est une image temporaire et pas une image mise par l'utilisateur ?

    J'avais pensé à utiliser les shared_ptr de Boost, mais je sais pas. L'autre solution serait de créer un attributs static: secureImage, qui est une image blanche d'un pixel sur un pixel. Quelle approche serait la meilleure ? (je ne sais pas si j'ai été clair. )

    Sinon pour la SFML: oui oui, mais je veux dire que si j'associe une Image à un Sprite, et que l'Image vient à disparaitre: mon Sprite affiche une image blanche.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Exprimé autrement, ton problème est un simple problème de gestion de cycle de vie.
    Tu vois décider de ce qui gèrera le cycle de vie de tes objets Image. Si c'est la Texture, inutile de gérer un évènement "destruction d'image" puisque une image ne pourra jamais être détruite si un texture s'en sert encore.
    Si ce n'est pas la texture qui gère le cycle de vie de l'image, disons que c'est une entité appelée "gestionnaire d'image", tu as deux possibilités pour gérer le cycle de vie de tes objets temporaires:
    - soit gérer des flags dans ton objet texture indiquant si c'est elle ou le gestionnaire d'image qui doit gérer le cycle de vie de l'objet image pointé (ça commence à devenir compliqué)
    - soit tu laisses le gestionnaire d'image gérer aussi le cycle de vie de ton image temporaire. Et comme il s'agit d'une image minuscule potentiellement utilisable dans tous les objets texture de ton application, pourquoi ne pas en instancier une seule au lancement du programme et réutiliser toujours la même? Au final ce sera même un peu plus rapide.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/12/2012, 15h17
  2. [image] Haralick texture features
    Par pseudocode dans le forum Contribuez
    Réponses: 25
    Dernier message: 12/08/2012, 02h25
  3. Relation entre image et texture
    Par -eXa- dans le forum C++
    Réponses: 4
    Dernier message: 30/10/2008, 01h37
  4. format d'images pour textures et algorithme pour meshes
    Par franc82 dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 31/10/2006, 18h12
  5. Format d'image et texture directx
    Par Johngame dans le forum DirectX
    Réponses: 1
    Dernier message: 04/02/2004, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo