bool del(/*std::string delName*/) {
//je sais pas comment delete une case précise dans un vector.
//et evidemment, je peux pas utiliser pop_back...
return true;
}
Alors si tu veux pouvoir supprimer des cases au milieu de ton tableau tu devrais utiliser des
list. Avec un vector, c'est impossible. Par contre, tu ne pourras plus utiliser les crochets [] pou accéder à un élément. Tu sais te servir des itérateurs ?
En fait, idéalement, tu te servirais des priority_queue pour trier tes éléments en mettant celui le plus à gauche (avec le x le plus petit) en premier, pour facilement ajouter 32 au x d'un élément que tu ajouterais.
Ensuite, plutôt que d'avoir un vector<int>, un vector<std::string> et un vector<sf::Sprite>, tu devrais avoir un seul vector d'objets de ce genre :
class InvSpace
{
InvSpace() : number(0), name(""), image() {}
InvSpace(int qty, const std::string& nm, const sf::Texture& texture) : number(qty), name(nm), image(texture) {}
int number;
std::string name;
sf::Sprite image;
}
Ce serait plus simple. Et surtout, le C++ te permet de mettre ensemble les données qui sont liées, alors ne te gêne pas.
Comme ton inventaire a une taille limite, je te conseillerais d'avoir un simple tableau d'InvSpace de taille 16, ou à la rigueur un std::array<InvSpace, 16>. Et pour indiquer qu'une case est vide, il suffirait de faire :
myObjects[index].number = 0;
Pour indiquer que cette case est vide.
La position du sprite devrait être indiquée dans ta fonction add, ce n'est pas le rôle d'une fonction de dessin, qui devrait seulement faire :
void drawInventory(sf::RenderWindow& w)
{
w.draw(invTextName);
for( std::size_t i(0) ; i < invImg.size() ; i++)
if(myObjects[i].number > 0)
w.draw(myObjects[i].image);
}
Ensuite, ta fonction add :
bool add (int nbr, std::string str, const sf::Texture& img) // note comme je demande une texture plutôt qu'un sprite
{
bool found = false;
for (std::size_t i(0) ; i < 16 ; i++)
{
if (myObjects[i].name == str) // on a trouvé une case qui contient déjà de ces objets !
{
myObjects[i].number += nbr; // donc on en ajoute le nombre qu'il faut.
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.
{
if(myObjects[i].number == 0) // si cette case est vide...
{
myObjects[i].number = nbr; // ...on la remplit avec notre nouvel objet.
myObjects[i].name = str;
myObjects[i].image.setTexture(texture);
if(i == 0) // si c'est la première case de l'inventaire...
myObjects[i].image.setPosition(/* x et y du premier objet*/); // ...on lui donne la position du premier objet à afficher.
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(32f, 0); // ...avec x+32 !
}
return true; // objets ajoutés à l'inventaire avec succès.
}
}
return false; // échec, l'inventaire est plein, les objets n'ont pas pu y être ajoutés.
}
Si ça ne fonctionne pas...je ne sais plus quoi faire.
Enfin, met des retours à la ligne entre tes fonctions, aère ton code, ça le rend plus facile à lire. Si tu regardes le code source de la SFML tu verras qu'il met même des grandes lignes de / entre ses fonctions pour bien les séparer.