B'jour.
J'vous jure, c'est hyper chelou.
Quand je met mon projet en mode debug, tout va bien, mon poids est normal.
Quand je met mon projet en mode release, tout va mal.
J'ai des warnings:
C:\Users\william\Projets\C++\tilemap\Inventory.h:178: avertissement : 'poid' may be used uninitialized in this function [-Wmaybe-uninitialized]
poid += myObjects[g].poids;
^
Et pourtant...
Bon. Je suppose que vous avez rien compris ?
J'ai un inventaire. il a une variable poids qui a le poids de tous les objets.
J'ai des places d'inventaires. Elles sont chacun leur poids.
class Inventaire {
public:
// ...
private:
const unsigned int maxTailleX;
sf::RectangleShape dfault; // carré noir de 32x32
sf::Text invTextName; // = invName en sf::Text.
InvSpace myObjects[16]; // place d'objet. il y'a 16 places.
sf::Font myFont;
sf::Sprite spr;
int argent;
sf::Text textArgent;
unsigned int maxPoids;
sf::Text Poids;
};
Et ... les warnings sont dans cette fonction:
int getPoids() {
int poid; //Warning: 'poid' was declared here
for( std::size_t i(0) ; i < 16 ; i++) {
for (std::size_t g = 0; g < myObjects[i].number; g++) {
poid += myObjects[g].poids; // Warning: [-Wmaybe-uninitialized]
}
}
return poid;
}
Bizarre tout ça...
Mais quand je me met en mode debug, tout va bien ! Aucun warning, pas de poids chelou...
Ah, et à propos du poids chelou...En mode release, au début, j'ai une faux dans mon inventaire.
Et j'ai un poids très bizarre... 1722241157/100
Sachant que 100 est le poids maximum de mon inventaire ._.
Puis quand je vais récolter 1 blé, qui prend une place dans mon inventaire, mon poids va à 19.
et il varie n'importe comment quand j'ai quelque chose de plus dans mon inventaire.
En quoi cela concerne -t- il sfml ? Bin je me suis dit: Peut-être un problème sur les Sf::text...
Mais j'y croyais pas trop
Sinon, je suppose que vous avez besoin de quelques fonctions ?
Dans ma classe Inventaire:
bool add (int nbr, std::string str, const sf::Texture& texture, unsigned int poid = 1) {
for (std::size_t i(0) ; i < 16 ; i++)
{
if (myObjects[i].name == str && (getPoids()+poid) <= maxPoids) // on a trouvé une case qui contient déjà de ces objets ! ET on a assez de place
{
myObjects[i].number += nbr; // donc on en ajoute le nombre qu'il faut.
myObjects[i].nbr.setString( std::to_string(myObjects[i].number) );
updatePoids();
return true; // objets ajoutés à l'inventaire avec succès.
}
}
for(std::size_t i(0) ; i < 16 ; i++) // aucune case contenant déjà de ces objets n'a été trouvée, on va donc en chercher une vide.
{
updatePoids();
if(myObjects[i].number == 0 && (getPoids()+poid) <= maxPoids) // si cette case est vide... ET qu'on a assez de place
{
myObjects[i].number = nbr; // ...on la remplit avec notre nouvel objet.
myObjects[i].poids = poid;
myObjects[i].name = str;
myObjects[i].image.setTexture(texture);
myObjects[i].nbr.setString( std::to_string(myObjects[i].number) );
myObjects[i].texte.setString( myObjects[i].name );
if(i == 0) { // si c'est la première case de l'inventaire...
myObjects[i].image.setPosition(2.f, 2.f); // ...on lui donne la position du premier objet à afficher.
myObjects[i].texte.setPosition(2.f, 32.f);
myObjects[i].nbr.setPosition(18.f, 2.f);
myObjects[i].texte.setFont(myFont);
myObjects[i].nbr.setFont(myFont);
}
else
{
myObjects[i].image.setPosition( myObjects[i-1].image.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
myObjects[i].image.move(35.f, 0.f); // ...avec x+32 !
myObjects[i].nbr.setPosition( myObjects[i-1].nbr.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
myObjects[i].nbr.move(35.f, 0.f); // ...avec x+32 !
myObjects[i].texte.setPosition( myObjects[i-1].texte.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
myObjects[i].texte.move(35.f, 0.f); // ...avec x+32 !
myObjects[i].texte.setFont(myFont);
myObjects[i].nbr.setFont(myFont);
}
updatePoids();
return true; // objets ajoutés à l'inventaire avec succès.
}
}
updatePoids();
return false; // échec, l'inventaire est plein, les objets n'ont pas pu y être ajoutés.
}
int getPoids() {
int poid;
for( std::size_t i(0) ; i < 16 ; i++) {
for (std::size_t g = 0; g < myObjects[i].number; g++) {
poid += myObjects[g].poids;
}
}
return poid;
}
sf::Text updatePoids() {
std::string tPoids = "Poids: ";
int poids = getPoids();
std::string poidsStr = std::to_string(poids);
std::string poidsMax = std::to_string(maxPoids);
tPoids += poidsStr;
tPoids += "/";
tPoids += poidsMax;
Poids.setString(tPoids); //Poids = le sf::Text.
return Poids;
}
Je vois pas ce qui est bizarre.
Merci.
EDIT: ah j'oubliais, voici ma classe InvSpace:
class InvSpace
{
public:
InvSpace(int poid = 1) : number(0), name(""), image(), texte(), nbr(), poids(poid) {
texte.setCharacterSize(20);
texte.setStyle(sf::Text::Bold);
nbr.setCharacterSize(25);
texte.setColor(sf::Color::Red);
nbr.setColor(sf::Color::Magenta);
}
~InvSpace() {}
unsigned int number;
std::string name;
sf::Sprite image;
sf::Text texte;
sf::Text nbr;
int poids;
};