Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] problème d'image

    13 décembre 2007 à 19:20:50

    salut,

    je suis en train de créer un petit jeu et pour cela j'utilise des feuilles contenant toutes les images des personnages que j'utilise et j'accède à ces images grâce à un tableau contenant les coordonnées de ces images. J'utilise ensuite ces coordonnées pour faire un .SetSubRect() et choisir l'image que je veux. Or j'ai remarqué que la SFML ne chargeait pas correctement les images que j'ai choisis. Par exemple : je charge une image de paladin mais il me redimensionne mon image et elle devient toute écrasée

    voici le code : Personnage.hpp
    1. #ifndef DEF_PERSONNAGE
    2. #define DEF_PERSONNAGE
    3. #include "Environnement.hpp"
    4. #include "Enum.hpp"
    5. class Personnage
    6. {
    7.     protected:
    8.     int _vitesse;
    9.     coord _tableauposition[];
    10.     sf::Image _Image;
    11.     sf::Sprite _Sprite;
    12.     int _tailletableau;
    13.     public:
    14.     Personnage();//constructeur par défaut
    15.     ~Personnage();//destructeur par défaut
    16.     Personnage(std::string cheminimage, std::string chemintexte);
    17.     void deplacer(sf::RenderWindow *Window);
    18. };
    19. #endif


    et Personnage.cpp
    1. #include <iostream>
    2. #include <vector>
    3. #include <string>
    4. #include <SFML/System.hpp>
    5. #include <SFML/Graphics.hpp>
    6. #include <fstream>
    7. #include <ostream>
    8. #include "Enum.hpp"
    9. #include "Environnement.hpp"
    10. #include "Personnage.hpp"
    11. using namespace std;
    12. Personnage::Personnage()
    13. {
    14.     _vitesse = 100;
    15.     _Image.LoadFromFile("images/personnages/paladin.png");
    16.     _Image.CreateMaskFromColor(_Image.GetPixel(0,0));
    17.     _Sprite.SetImage(_Image);
    18.     _Sprite.SetTop(0);
    19.     _Sprite.SetLeft(0);
    20.     _tableauposition[0].x = 0;
    21.     _tableauposition[0].y = 0;
    22.     _tableauposition[0].w = (int) (_Sprite.GetWidth());
    23.     _tableauposition[0].h = (int) (_Sprite.GetHeight());
    24.     _tailletableau = 1;
    25.     cout << "personnage initialise" << endl;
    26. }
    27. Personnage::Personnage(string cheminimage, string chemintexte)
    28. {
    29.     _vitesse = 100;
    30.     _Image.LoadFromFile(cheminimage.c_str());
    31.     _Image.CreateMaskFromColor(_Image.GetPixel(0,0));
    32.     _Sprite.SetImage(_Image);
    33.     _Sprite.SetTop(0);
    34.     _Sprite.SetLeft(0);
    35.  [...]
    36.     cout << "personnage initialise" << endl;
    37. }
    38. Personnage::~Personnage()
    39. {
    40. }
    41. void Personnage::deplacer(sf::RenderWindow *Window)
    42. {
    43.     if (Window->GetInput().IsKeyDown(sf::Key::Left))   _Sprite.SetLeft(_Sprite.GetLeft() - _vitesse * Window->GetFrameTime());
    44.     else if (Window->GetInput().IsKeyDown(sf::Key::Right))  _Sprite.SetLeft(_Sprite.GetLeft() + _vitesse * Window->GetFrameTime());
    45.     else if (Window->GetInput().IsKeyDown(sf::Key::Up))  _Sprite.SetTop(_Sprite.GetTop() - _vitesse * Window->GetFrameTime());
    46.     else if (Window->GetInput().IsKeyDown(sf::Key::Down))  _Sprite.SetTop(_Sprite.GetTop() + _vitesse * Window->GetFrameTime());
    47.     //_Sprite.SetSubRect(sf::IntRect(_tableauposition[0].x, _tableauposition[0].y, _tableauposition[0].w, _tableauposition[0].y));
    48.     Window->Draw(_Sprite);
    49. }


    Voilà merci d'avane à ceux qui pourront m'aider

    icare

    EDIT : j'ai regardé et fais des testes il semblerait que ce soit la fonction Draw() que j'utilise pour afficher l'image qui fasse une erreur de segmentation
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      13 décembre 2007 à 19:41:13

      Donne moins de code! Y a beaucoup trop de chose.

      Quand ce genre de problème "inexplicable" arrive, utilise un projet de teste dans lequel tu mets tout ce que tu penses qui a un lien avec le problème dans le main. Ensuite tu testes. Si tu vois encore le problème, tu commentes certaines parties qui te sembles fonctionner correctement, jusqu'à ce que le bug disparaisse. A ce moment, tu sais où se trouve le problème : il est dans la dernière zone que tu as commenté.

      Après, soit la résolution du problème t'apparaît, soit elle reste "inexplicable".

      Ici, à quoi ressemblerait le main minimal?

      PS : j'ai peut-être une idée. Il faudrait peut-être refaire un SetImage après avoir modifier l'image (enfin, j'aurais fait d'abord la modif de l'image, puis SetImage).

      EDIT : faute de grammaire.
      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2007 à 19:51:26

        En fait le main minimal se résume à la création d'un objet de type Jeu (une classe sensée géré tout le jeu) et à l'appelle d'une fonction qui fait démarré tout le jeu.

        J'ai mis tout ce code car j'ai fais ce que tu m'as dis (j'ai pas attendu qu'on me le dise :p ) et le bug semble se déplacer lol

        en effet lorsque je précise pas de sous rectangle il m'affiche une image déformée et lorsque je le mets il me sort un bug, mon pauvre compilo m'indique que c'est la fonction Draw qui a un bug

        merci à toi je vais encore chercher un poil

        EDIT : résolu
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          13 décembre 2007 à 20:05:17

          Citation : icare14

          en effet lorsque je précise pas de sous rectangle il m'affiche une image déformée et lorsque je le mets il me sort un bug, mon pauvre compilo m'indique que c'est la fonction Draw qui a un bug


          Que te dit-it?

          Citation : icare14

          EDIT : quelqu'un a un moyen d'ouvrir plusieurs fois Code::Blocks ? parce que avant je faisais ça avec Dev-C++ et ça m'arrangeais vachement bien je pouvais triturer un code d'un coté et faire des testes en fonction de l'autre


          Settings -> Environnement -> Allow Only one ...

          Et pour le "SetImage" après le subrect, ça a donné qqch?
          • Partager sur Facebook
          • Partager sur Twitter
            13 décembre 2007 à 20:14:20

            Citation : hiura

            Et pour le "SetImage" après le subrect, ça a donné qqch?


            Ben en fait le setsubrect s'utilise directement sur l'onjet de type sprite

            Citation : hiura

            Que te dit-it?


            Ben pas grand chose :p Il m'indique le chemin jusqu'ou y a une erreur. Et en l'occurence ça serait la méthode Draw()
            Voilà l'eereur complète de mon compilo peu bavard (code-block ^^ )

            Citation : Code-Block

            #0 0x00408b17 sf::Drawable::Draw
            #1 0x00405e97 Personnage::deplacer
            #2 0x004077a1 Jeu::Partie
            #3 0x0040769e Jeu::MenuDemarrage
            #4 0x004062de main



            et il me sort aussi une erreur de segmentation

            EDIT : j'ai refais une battrie de tests c'est donc bien la fonction Draw() qui pose problème lorsqu'elle est en commentaire le code fonctionne. Maintenant je comprends pas pourquoi ça ne fonction pas ^^ parce que je l'utilise déjà ailleurs pour afficher le fond de mon jeu

            EDIT 2: j'ai trouvé un bug immense quand on attribut un tableau à la suite d'une image (comme je le fais dans mon code l'image s'en trouve modifié o_O ) y a quelqu'un qui a déjà entendu parler de ce bug ?
            SFML serait il allergique au tableau ?
            • Partager sur Facebook
            • Partager sur Twitter
              14 décembre 2007 à 23:47:43

              personne a une idée ?

              EDIT : j'ai trouvé SFML est allegrique aux tableaux dont la taille n'est pas défini précisément comme ici

              1. [...]
              2.     int _vitesse;
              3.     coord _tableauposition[];
              4.     sf::Image _Image;
              5. [...]


              Voilà pour le problème, maintenant si quelqu'un a une solution pour éviter de devoir donner un tableau trop grand et bouffer de la mémoire pour rien
              j'ai essayé un vector mais ça a donner les mêmes résultats.
              • Partager sur Facebook
              • Partager sur Twitter
                17 décembre 2007 à 5:54:43

                Salut

                1. coord _tableauposition[];

                Etant donné que la taille n'est pas spécifiée, ceci est équivalent à cela :
                1. coord* _tableauposition;

                Ce qui signifie qu'aucune case mémoire n'est allouée pour ton tableau, ce qui explique les comportements bizarres / aléatoires / ...

                Si tu connais la taille alors spécifie-la directement, sinon utilise un tableau dynamique (std::vector).
                • Partager sur Facebook
                • Partager sur Twitter

                [SFML] problème d'image

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown