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

Auteur Sujet: [Résolu]"window.draw" ne semble pas fonctionner [Résolu]  (Lu 2378 fois)

0 Membres et 1 Invité sur ce sujet

Sky842a

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Bonjour,
Alors je me suis mis au c++ il n'y a pas très longtemps et depuis quelques heures j'essaie de faire un Pong...

Le problème est ma classe Player qui ne se dessine pas, la compilation et l'exe se lance mais la fenêtre est noire :
- Player.h

#ifndef PLAYER_H
#define PLAYER_H
#include <SFML/Graphics.hpp>


class Player : public sf::Drawable
{
    public:
        Player(int pX, int pY, int pId, sf::Color pColor);
        sf::RectangleShape getShape();
        void movement();
        int getId();
        virtual ~Player();
    protected:
    private:
        sf::RectangleShape shape;
        int id;
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
};

#endif // PLAYER_H

- Player.cpp

#include "Player.h"
#include <SFML/Graphics.hpp>
#include <iostream>

Player::Player(int pX, int pY, int pId, sf::Color pColor = sf::Color::Blue)
{
    sf::RectangleShape shape(sf::Vector2f(35, 120));
    //int id = pId;
    shape.setFillColor(pColor);
    shape.setPosition(sf::Vector2f(pX, pY));

    std::cout << "player"<<pId << std::endl;
    std::cout << "PosX : "<<pX << std::endl;
    std::cout << "PosY : "<<pY << std::endl;
}

void Player::movement(){
    if(getId() == 1){
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            getShape().move(0, 0.1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            getShape().move(0, -0.1);
    }else {
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
            getShape().move(0, 0.1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
            getShape().move(0, -0.1);
    }

}

int Player::getId(){
    return id;
}

sf::RectangleShape Player::getShape(){
    return shape;
};

void Player::draw(sf::RenderTarget& target, sf::RenderStates states)const{
    target.draw(shape, states);
}

Player::~Player()
{
    //dtor
}
 

main.cpp

#include <SFML/Graphics.hpp>
#include <iostream>
#include "include/Player.h"

using namespace std;

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Testing !");

    Player player1(20, 50, 1, sf::Color::Blue);
    Player player2(740, 400, 2, sf::Color::Red);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
                case sf::Event::Closed:
                    window.close();
                    break;
            }
        }

        player1.movement();
        player2.movement();

        window.clear();
        window.draw(player1);
        window.draw(player2);
        window.display();
    }

    return 0;
}
 

Je vous remercie d'avance !  ;D
« Modifié: Mai 31, 2016, 01:47:07 am par Sky842a »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : "window.draw" ne semble pas fonctionner
« Réponse #1 le: Mai 31, 2016, 01:19:20 am »
Dans le constructeur de Player tu crées un nouveau sf::RectangleShape du nom de shape et qui est détruit à la fin de ce même constructeur.
Le sf::RectangleShape que tu veux dessiner dans draw est une donnée membre (du nom de shape aussi) jamais initialisée.

Sky842a

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : "window.draw" ne semble pas fonctionner
« Réponse #2 le: Mai 31, 2016, 01:24:51 am »
D'accord, j'ai compris
Mais, question un peu bête : comment pouvoir initialisé les valeurs de mon shape déjà existant ?

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : "window.draw" ne semble pas fonctionner
« Réponse #3 le: Mai 31, 2016, 01:31:24 am »
Si tu veux appeler le constructeur de shape, membre de Player, tu peux le faire dans la liste d'initialisation.

Genre
Player::Player(int pX, int pY, int pId, sf::Color pColor = sf::Color::Blue) : shape(sf::Vector2f(35, 120))
{
    //int id = pId;
    shape.setFillColor(pColor);
    shape.setPosition(sf::Vector2f(pX, pY));

    std::cout << "player"<<pId << std::endl;
    std::cout << "PosX : "<<pX << std::endl;
    std::cout << "PosY : "<<pY << std::endl;
}

Sky842a

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : "window.draw" ne semble pas fonctionner
« Réponse #4 le: Mai 31, 2016, 01:34:39 am »
Super ! Merci, ça a marché !
Il y t'il d'autre manière d'appeler le constructeur de mon shape ?

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : "window.draw" ne semble pas fonctionner
« Réponse #5 le: Mai 31, 2016, 01:40:13 am »
Non je crois pas.
Si tu l'initialises pas dans la liste d'initialisation (mais la liste d'initialisation c'est cool hein !), c'est son constructeur par défaut qui est appelé (un rectangle de taille 0 0), tu peux ensuite lui filer une taille avec setSize.

Sky842a

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : "window.draw" ne semble pas fonctionner
« Réponse #6 le: Mai 31, 2016, 01:46:09 am »
D'accord, merci pour tes réponses en tout cas ! :)