Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: swa870 le Septembre 12, 2013, 06:25:08 am

Titre: sf::RenderWindow draw
Posté par: swa870 le Septembre 12, 2013, 06:25:08 am
Bonjour,
J'ai une fonction dans une class qui hérite d'un sf::sprite et je voudrais dessiner mon sprite dans ma class mais il n s'affiche pas.

class TJoueur : public sf::Sprite
{

protected:
        string MNom;
        int MHp;
        int MScore;
        int MLevel;
        int MNiveau;
        int MLastMoveL;
        int MLastMoveR;
        sf::Texture MarioTexture;
       
        int MChoixJoueur;
public:
        TJoueur(void);
        ~TJoueur(void);
        void MoveJoueur(int InMoved, sf::RenderWindow &window);
};

ma fonction ds le cpp:
void TJoueur::MoveJoueur(int InMoved, sf::RenderWindow &window)
{
        float position=0;
        switch (InMoved)
        {
        case 0 :
                setTextureRect(sf::IntRect(124,(45*MChoixJoueur),28,35));
                MLastMoveL = 0;MLastMoveR=0;
                break;
        case 1:
                if(MLastMoveL == 4)
                MLastMoveL = 0;
                setTextureRect(sf::IntRect(91-(MLastMoveL*30),(45*MChoixJoueur),28,35));
                setPosition(getPosition().x-10, 20);
                cout << MLastMoveL;
                MLastMoveL ++;
       
                break;
        case 2:
                if(MLastMoveR == 4)
                MLastMoveR = 0;
                setTextureRect(sf::IntRect(151+(MLastMoveR*30),(45*MChoixJoueur),28,35));
                setPosition(getPosition().x+10, 20);
                MLastMoveR++;
                break;

        default:
                setTextureRect(sf::IntRect(124,(45*MChoixJoueur),28,35));
                MLastMoveL = 0;MLastMoveR=0;
                break;
               
                window.draw(*this);
        }
}

j'essais de draw mon sprite avec *this, mais ma fenêtre reste noir.... si je fais le draw dans mon programme principale alors mon image s'affiche... (window.draw(*Joueur);)

Titre: Re : sf::RenderWindow draw
Posté par: Laurent le Septembre 12, 2013, 08:04:42 am
Il faudrait voir le code qui appelle cette fonction, voir comment tu gères ta boucle d'affichage.

Note qu'un draw n'a rien à faire dans une fonction Move (si tu ne bouges pas, ton joueur ne sera jamais plus dessiné ??). Il faut essayer de découpler au maximum la logique et l'affichage.
Titre: Re : sf::RenderWindow draw
Posté par: swa870 le Septembre 12, 2013, 08:49:24 pm
voila mon programme principale.... je voulais mettre mon draw dans mon move, car il est dans une boucle

void GameEvent(sf::RenderWindow &window, TJoueur *&Joueur,TMenu *&Menu)
{


                sf::Event event;
                //gestio des evenments
                while (window.pollEvent(event))
                {
                        switch (event.type)
                        {
                        case sf::Event::Closed:
                                window.close();
                                break;
                        case sf::Event::KeyPressed:
                                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                                        Menu->setselected(-1);
                                        //window.close();
                                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                                {
                                        Joueur->MoveJoueur(2,window);
                                }
                                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                                {
                                        Joueur->MoveJoueur(1,window);
                                       
                                }
                                else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
                                {

                                }
                                else
                                        Joueur->MoveJoueur(0,window);
                                break;
                                 case sf::Event::MouseButtonPressed:
                if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
                {

                }
                break;
                        default:
                                break;
                        }

                }
        window.draw(*Joueur);
}
int main()
{
        sf::RenderWindow window(sf::VideoMode(1024,768,32), "Module de fenetre");
       
        sf::Sprite MBackground;
        sf::Texture MenuBackground;
        MenuBackground.loadFromFile("mario_menu.jpg");
        MBackground.setTexture(MenuBackground);
        MBackground.setScale(.8,.8);
        TJoueur *Joueur;
        Joueur = new TJoueur;
        Joueur->MoveJoueur(0,window);
        window.setFramerateLimit(60);
        TMenu *Menu;
        initialize(Menu);
       

        while (window.isOpen())
        {
               
        window.clear();
        //     
        //      Joueur->anim(img);
               
                switch (Menu->getselected())
                {
                case -1:
                        window.draw(MBackground);
                        Menu->CheckSelected(window);   
                        Menu->DrawMenu(window);        
                        break;
                case 0:
               
                        GameEvent(window,Joueur, Menu);
                        break;
                case 1:window.close();
                        break;
                case 2:window.close();
                        break;
                case 3: window.close();
                        break;
                case 4: window.close();
                        break;
                default:
                        break;
                }
                window.display();
        }
               
        return 0;
}
Titre: Re : sf::RenderWindow draw
Posté par: Laurent le Septembre 12, 2013, 09:56:38 pm
La structure de ton programme est assez chaotique, je ne sais pas comment tu fais pour t'y retrouver :P

En plus tu mélanges évènements et entrées temps-réel.

Bref, lis bien les tutoriels, inspire toi des exemples du SDK / wiki / forum ; prends bien le temps de faire une base propre et bien organisée pour ton programme.
Titre: Re : sf::RenderWindow draw
Posté par: swa870 le Septembre 13, 2013, 02:56:43 am
Parfait merci... C'est le premier jeux que je fais et cest pour mon cours.... Les tutoriel sont tous sur ce site?

J'ai eu un peut de difficulter a penser a séparer mon jeu avec un menu....
Titre: Re : sf::RenderWindow draw
Posté par: Laurent le Septembre 13, 2013, 07:39:18 am
Citer
Les tutoriel sont tous sur ce site?
Ceux que tu dois lire, oui ;)
Titre: Re : sf::RenderWindow draw
Posté par: swa870 le Septembre 13, 2013, 02:16:07 pm
Parfait merci bcp de tes réponses :)

Dernière question... je ne sais pas si tu pourrais me conseiller pour mes classes... je t'explique ma situation.

J'ai une classe joueur qui contient tous les informations du joueur et celle-ci hérite d'un sprite puis mon joueur peut avoir des armes, alors est-ce que je devrais créer une classe pour chacune de mes armes?

Et pour mes ennemis j'ai une classe ennemi puis une classe pour chaque sorte d'ennemi possible qui héritent de ennemi.

Est-ce que tu crois que c'est correct?

et puis je pourrais faire une liste de mes ennemis?
Titre: Re : sf::RenderWindow draw
Posté par: Laurent le Septembre 13, 2013, 03:08:08 pm
Il n'y a pas de design universel, c'est à toi de voir ce qui va le mieux selon ton application, selon tes compétences et selon ta façon de travailler. Et puis pour ce genre de chose, il vaut mieux expérimenter par soi-même pour s'améliorer.

Donc ne te pose pas (trop) de questions pour le moment, écris ton application, et reviens dessus quand tu auras suffisamment de recul, et que tu auras identifié les point négatifs de ta conception. Il est bien plus facile d'améliorer un design a posteriori qu'a priori ;)