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

Auteur Sujet: Tableau de textures statique, loadFromFile() ?  (Lu 3889 fois)

0 Membres et 1 Invité sur ce sujet

zessirb

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Tableau de textures statique, loadFromFile() ?
« le: Mai 06, 2015, 11:26:34 am »
Bonjour, je bloque depuis un bon moment sur le même souci.
Réalisant un Tic Tac Toe, je ne souhaite pas réaliser sur ce programme un gestionnaire d'objets / de textures / de sprites ; c'est pour cela que mes 10 objets sont stockés en tant qu'attributs dans ma fonction principale de jeu.

Parmi ces 10 objets, il y a la grille, avec laquelle je n'ai pas de problème ;
et il y a le tableau de 9 jetons (pour chaque case où il peut y avoir une croix ou un cercle) que je n'arrive pas à afficher.
Cette classe Jeton étant instanciée 9 fois et utilisant les mêmes textures, mon tableau de textures est donc statique ; je me demandais où devrais-je les charger via loadFromFile() ?

Actuellement, les loadFromFile() sont dans le constructeur de Jeton(), ce qui reviendrait à appeler les commandes 9 fois pour un membre statique ... et ce qui me donne l'affichage de carrés blancs.



Voici les parties essentielles des fichiers de ma classe Jeton et de la classe Jeu.

Jeton.h :
(click to show/hide)

Jeton.cpp :
(click to show/hide)

Jeu.h :
(click to show/hide)

Jeu.cpp :
(click to show/hide)

Si Jeton::positionner(int) n'est pas appelé avec le constructeur, c'est parce que j'ai eu beaucoup de mal à changer le constructeur par défaut pour l'initialisation d'un tableau d'objets, sans succès. C'est plus simple pour moi de faire comme ça.

Si je vous demande de l'aide, c'est réellement parce que je ne suis pas parvenu à résoudre mon problème en recherchant. Merci d'avance et bonne journée :)
« Modifié: Mai 06, 2015, 06:30:22 pm par zessirb »

hanka

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Tableau de textures statique, loadFromFile() ?
« Réponse #1 le: Mai 06, 2015, 05:29:41 pm »
Et tu n'as pas eu d'erreurs de type?
Tu as fait un tableau dans lequel tu veux charger tes texture. Tu dois alors appeler les cases par leur indice. Enum remplace directement les noms par des indices c'est juste pour être plus lisible mais les commentaires c'est tout aussi bien...
Alors tu peux faire dans ton jeton.h plutôt int m_etatJeton
Donc soit tu garde Enum et tu met juste vide, selection,... Soit tu met des chiffres parce tu n'as que très peu de case et que ton programme n'est pas très compliqué.
Et attention, l'ajout de conditions c'est && sinon c'est une adresse mais je ne pense pas que tu avais l'intention de manipuler les pointeurs!

Jeton::Jeton
if (m_texture[vide].loadFromFile("ressources/vide.png")  // où vide=0
    && m_texture[selection].loadFromFile("ressources/selection.png")  //où selection=1
    && m_texture[croixTransparente].loadFromFile("ressources/croix transparente.png")  //2, etc...
    && m_texture[cercleTransparent].loadFromFile("ressources/cercle transparent.png")
    && m_texture[croix].loadFromFile("ressources/croix.png")
    && m_texture[cercle].loadFromFile("ressources/cercle.png"))
        m_texturesChargees = true;


Jeton::modifierEtat(int etat){ //avec 0 pour vide, 1 pour selection...
m_etatJeton=etat;
m_sprite.setTexture(m_texture[etat]);
}

zessirb

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Tableau de textures statique, loadFromFile() ?
« Réponse #2 le: Mai 06, 2015, 06:24:36 pm »
J'avais cru voir quelque part que le & seul dans une condition permettait de vérifier toutes les conditions même si la première était fausse ; j'ai du me tromper, même si ça ne m'a pas généré d'erreur.

Au niveau de l'enum, j'ai effectivement fait une fonction modifierEtat bien trop longue alors que j'aurais pu me permettre d'écrire seulement deux lignes, je n'avais pas fait attention.
J'ai tout de même modifié m_etatJeton en int comme tu dis pour plus de clarté, même si l'énumération n'était pas fausse.

Mon code est plus clair maintenant (j'en profite pour modifier mon premier post), mais le problème persiste.

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : Tableau de textures statique, loadFromFile() ?
« Réponse #3 le: Mai 07, 2015, 02:07:28 am »
Au lieu d'utiliser plusieurs textures, regroupe les images dans une seule image. Ainsi tu n'auras qu'une texture sur laquelle travailler.
Ensuite, dans ton code actuel tu place une texture sur un sprite sans même vérifier si la texture est "loader".

 
 
« Modifié: Mai 07, 2015, 02:32:00 am par math1992 »

hanka

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Tableau de textures statique, loadFromFile() ?
« Réponse #4 le: Mai 07, 2015, 12:41:56 pm »
Au lieu d'utiliser plusieurs textures, regroupe les images dans une seule image. Ainsi tu n'auras qu'une texture sur laquelle travailler.
Ensuite, dans ton code actuel tu place une texture sur un sprite sans même vérifier si la texture est "loader".

Oui une gestion avec un sprite qui se déplace sur la texture est plus simple, plus claire (selon moi du moins) et nécessite un seul test mais il ne voulait pas avoir à les gérer d'après son premier post.

J'avais cru voir quelque part que le & seul dans une condition permettait de vérifier toutes les conditions même si la première était fausse ;

En fait && ne renvoie true que si toutes les conditions sont vraies puisque c'est un "et logique".
Si ce que tu veux c'est au moins une condition remplie il faut faire un "ou logique" qui s'écrit || .
Dans ton cas, il vaut mieux que toutes les textures soient chargées de toute façon pour éviter que le jeu ne bug en plein milieu. (La gestion d'un sprite sur la texture reste quand même plus pratique)

Désolée je me suis un peu égarée du problème j'essayais de comprendre ce que tu voulais faire exactement. L'affichage de carrés blancs signifie que ta texture ne s'est probablement pas chargée. Ton fichier ressources est-il bien dans le fichier de ton projet?
Il serait bien de faire les vérifications en utilisant la console pour afficher le résultat des différents tests pendant la phase de debug.

zessirb

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Tableau de textures statique, loadFromFile() ?
« Réponse #5 le: Mai 07, 2015, 02:49:07 pm »
Au lieu d'utiliser plusieurs textures, regroupe les images dans une seule image. Ainsi tu n'auras qu'une texture sur laquelle travailler.
Étant donné la taille de mon projet, je comptais réserver ça pour un autre programme : j'essaye de ne pas m'attarder pour l'instant sur tous les éléments nécessaires pour un jeu de taille conséquente, mon objectif est de réussir à faire un programme simple et fonctionnel avec la SFML, je préfère y aller petit à petit sans me compliquer la tâche.


Ensuite, dans ton code actuel tu place une texture sur un sprite sans même vérifier si la texture est "loader". 
A l'inverse de loadFromFile, setTexture est de type void ; pour vérifier si la texture est bien appliquée au sprite, j'ai utilisé la fonction getTexture en vérifiant si la référence retournée était NULL ou pas :
void Jeton::modifierEtat(int p_etatJeton)
{
    m_etatJeton = p_etatJeton;
    m_sprite.setTexture(m_texture[p_etatJeton]);
    if (m_sprite.getTexture() == NULL)   // La condition n'est jamais vérifiée !
        std::cout << "sprite sans texture !";
}
Rien ne s'affiche.
Pour vérifier que ce n'est pas juste moi qui ne sait pas me servir de la fonction, j'ai placé la condition avant le setTexture :
void Jeton::modifierEtat(int p_etatJeton)
{
    m_etatJeton = p_etatJeton;
    if (m_sprite.getTexture() == NULL)   // Crash au lancement du programme
        std::cout << "sprite sans texture !";
    m_sprite.setTexture(m_texture[p_etatJeton]);
}
Crash au démarrage.
Étant donné que je n'ai pas eu de crash avec le premier code, il y a bien une référence à une texture ... Est-ce que cela veut dire que le tableau de textures pointe vers des textures vides ?


Désolée je me suis un peu égarée du problème j'essayais de comprendre ce que tu voulais faire exactement. L'affichage de carrés blancs signifie que ta texture ne s'est probablement pas chargée. Ton fichier ressources est-il bien dans le fichier de ton projet?
Il serait bien de faire les vérifications en utilisant la console pour afficher le résultat des différents tests pendant la phase de debug.
Pas de soucis, toutes les informations sont bonnes à prendre :)
Mes ressources sont toutes dans le même dossier "ressources" ; la grille se charge sans problème, et j'ai séparé la "sélection" qui indique sur quelle case pointe le joueur dans un nouvel objet. Le sprite se charge sans soucis.

Autre chose, pour ne pas que chaque instance de la classe Jeton retente les loadFromFile, la variable m_textureChargee est maintenant en statique, avec une condition avant le chargement des textures pour que ce dernier n'intervienne qu'une seule fois.


Peut-être que des morceaux de code où mes sprites s'affichent vous aideraient à m'aider ? Voici Selection, que l'on peut déplacer sur chacune des cases :
(click to show/hide)


Edit : J'ai encore réduit le tableau et l'énumération de jeton pour placer croixSelection et cercleSelection dans le fichier Selection.cpp. Je gère donc dans ce dernier un tableau de texture aussi (mais non statique) et tout fonctionne pour la sélection.
Je peux copier le fichier si vous estimez ça utile (mais ça commence à faire un paquet de fonctions).
« Modifié: Mai 07, 2015, 04:08:12 pm par zessirb »

zessirb

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Tableau de textures statique, loadFromFile() ?
« Réponse #6 le: Mai 12, 2015, 07:12:53 pm »
En l'absence de solution, j'abandonne l'idée d'utiliser un tableau de textures statiques ; je l'ai rendu non statique et tout a fonctionné instantanément. Je me le permet car je n'ai que 9 instances de jeton. Merci quand même d'avoir essayé, hanka et math  :)

 

anything