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

Auteur Sujet: [Résolu] Auto-découpage des textures  (Lu 2307 fois)

0 Membres et 1 Invité sur ce sujet

Demolyde

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
[Résolu] Auto-découpage des textures
« le: Juillet 02, 2016, 04:46:48 pm »
Bonjour, je viens à vous car après plusieurs recherches, je ne trouve pas mon bonheur (après je n'est peut être pas les bons mots-clés, si c'est le cas j'en suis désolé)
J'ai donc tenté de réaliser le code moi-même, je tiens à préciser que je suis débutant (en C++ du moins)

Le but de ma fonction est de découper une texture (faire une sorte de quadrillage) pour ne pas avoir des dizaines d'images

sf::Texture decomp_texture(string etape ,string file, int width_array, int height_array, int width_img, int height_img) {
    sf::Texture texture[width_array*height_array];
    int x_rec=0, y_rec=0;
    for (int y=0; y<height_array; y++) {
        for (int x=0;x<width_array; x++) {
            texture[x*y].loadFromFile("Custom/Textures/"+texture_folder+"/"+etape+"/"+file+".png",
                                       sf::IntRect(x_rec,y_rec,x_rec+width_img,y_rec+height_img));
            x_rec = x_rec + height_img;
        }
        x_rec = 0;
        y_rec = y_rec + width_img;
    }
    return texture;
}

c'est la première fois que j'essaie de retourner des "sf::Texture", j'admet que je ne sais pas vraiment comment m'y prendre

J'obtient cette erreur :
error: could not convert '(sf::Texture*)(& texture)' from 'sf::Texture*' to 'sf::Texture'
return texture;
et ce warning :
warning: control reaches end of non-void function [-Wreturn-type]
« Modifié: Juillet 02, 2016, 10:06:56 pm par dim59130 »

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Auto-découpage des textures
« Réponse #1 le: Juillet 02, 2016, 04:58:54 pm »
il te manque toute les base du c/c++. un conseil , apprend par le commencement, car codé des trucs que l'on ne comprend pas, ca le fait pas.

dans ton cas  sf::Texture texture[width_array*height_array]; est détruit a la fin de ta procédure, c'est donc un problème avec les base du langage et pas un soucis lié directement a la sfml.

Citer
error: could not convert '(sf::Texture*)(& texture)' from 'sf::Texture*' to 'sf::Texture'
c'est pourtant clair, ta procédure renvois un sf::Texture, tu renvois un tableau de texture, qui plus est, détruit.

Citer
warning: control reaches end of non-void function [-Wreturn-type]

tu dois avoir ce genre de procédure dans ton code :

int foo(){
 
  if( qqchose )
   return 1;
 
}
 

ou alors aucun return. mais sans code... difficile de te dire.


autre problème que tu auras plus tard :
texture[x*y]

l'index est foireux. x peut être == 2 & y peut être == 1 , ou x peut être 1 & y = 2 , ce qui renvois au même indice.  pour un array 1D avoir un indice valide : x + taille_tableau_width * y



Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Auto-découpage des textures
« Réponse #2 le: Juillet 02, 2016, 09:58:55 pm »
Ce que tu fais est inutile, tu as une seule image alors profites-en : garde une seule texture en mémoire, et utilise setTextureRect (si tu utilises des sprites ou shapes) pour faire le "découpage". Tes performances en seront grandement améliorées, et ton code sera moins compliqué.

Note aussi que tes difficultés ne viennent pas de sf::Texture, mais du fait que tu cherches à renvoyer un tableau à 2 dimensions. sf::Texture n'a pas plus de contraintes que int ou std::string ici. Tu voudrais renvoyer un int[][], tu aurais exactement les mêmes problèmes.
« Modifié: Juillet 02, 2016, 10:00:59 pm par Laurent »
Laurent Gomila - SFML developer

Demolyde

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : Auto-découpage des textures
« Réponse #3 le: Juillet 02, 2016, 10:02:53 pm »
C'est vraie que ta solution est beaucoup plus simple et performante, ...
Je vais travailler dans ce sens merci beaucoup ;-)

Demolyde

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : [Résolu] Auto-découpage des textures
« Réponse #4 le: Juillet 02, 2016, 10:13:44 pm »
mais ducoup, j'en profite pour rebondir là dessus, si j'en ai besoin un jour comment crée une fonction qui retourne un "int" à tableau multidirectionnel ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Auto-découpage des textures
« Réponse #5 le: Juillet 03, 2016, 09:56:47 am »
En général on ne travaille pas avec les tableaux multi-dimensionnels. Encore moins on essaye de les retourner. Et si vraiment on n'a pas d'autre choix que de le faire, on va soit :
- le réduire à un tableau uni-dimensionnel
- l'encapsuler avec des conteneurs standards (vector<vector<int>>)
- trouver la bonne syntaxe : seule la taille de la dernière dimension peut ne pas être spécifiée (int[COUNT][])

Le dernier point met le doigt sur une autre erreur : tu n'as pas le droit de déclarer un tableau natif dont les dimensions ne sont pas connues à la compilation. Si ton compilateur te laisse faire ça c'est parce qu'il est trop permissif par défaut, essaye de compiler avec l'option -pedantic par exemple (si tu utilises gcc).

Ensuite tu vas te heurter à une autre erreur : ton tableau est déclaré localement à la fonction, donc il n'y survivra pas. Et en C++ on ne peut pas retourner ou passer un tableau natif par copie, c'est forcément un pointeur sur l'original. Pour contourner ce problème on peut utiliser std::array.
Laurent Gomila - SFML developer