2017-02-14 1 views
0

Ich habe eine einfache Reihe von Klassen. Einer von ihnen ist ein ButtonComponent, wo ich im Wesentlichen sf::RectangleShape für den visuellen Aspekt verwenden möchte und dann der Rest der ButtonComponent würde Dinge wie Event-Listener behandeln. Das Problem kommt in der Form, dass, wenn ich erben von sf::Drawable in der Elternklasse muss ich implementieren draw() (Component Klasse) was bedeutet, dass die Kindklassen implementieren die Eltern draw() und nicht die SFML Shapes draw() Funktion. Gibt es eine Möglichkeit, entweder die beiden Klassen zu restrukturieren oder eine Art, sf::RectangleShapes Zeichenfunktion aufzurufen?Aufruf von sf :: RectangleShapes draw function?

Component.h

class Component : public sf::Drawable { 
public: 
    Component(); 
    virtual ~Component(); 
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const = 0; 
}; 

class ButtonComponent : public sf::RectangleShape, public Component { 
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states); 
}; 
+0

"Gibt es eine Möglichkeit, die beiden Klassen neu zu strukturieren oder die Zeichenfunktion' sf :: RectangleShapes' aufzurufen? " Was hindert Sie 'sf :: RectangleShapes :: draw()' tatsächlich? –

+0

es ist eine private Funktion ... – Matthew

+0

Es ist privat, weil es nur von Render-Zielen aufgerufen werden soll. Wenn Sie ein Zeichen zeichnen möchten, müssen Sie das umgekehrte Zeichen aufrufen: 'myRenderTarget.draw (myDrawable);' Dies ruft dann intern das Zeichen 'draw()' des aktuellen Zeichensatzes auf. – Mario

Antwort

-2

Die Lösung ist Ihr Kind Klassen nur sf::Drawable erben haben und eine sf::RectangleShape innerhalb Ihres Kindes Klassen haben. Ähnliches wie folgt:

class Component : public sf::Drawable { 
public: 
    Component(); 
    virtual ~Component(); 
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const = 0; 
}; 

class ButtonComponent : public Component { 
public: 
    ButtonComponent(const sf::Vector2f &size = sf::Vector2f(0, 0)); 

    void draw(sf::RenderTarget& target, sf::RenderStates states) const; 

    void setSize(const sf::Vector2f& size); 
    const sf::Vector2f& getSize() const; 
    virtual unsigned int getPointCount() const; 
    virtual sf::Vector2f getPoint(unsigned int index) const; 
    void setTexture(const sf::Texture* texture, bool resetRect = false); 
    void setTextureRect(const sf::IntRect &rect); 
    void setFillColor(const sf::Color &color); 
    void setOutlineColor(const sf::Color &color); 
    void setOutlineThickness(float thickness); 
    const sf::Texture* getTexture() const; 
    const sf::IntRect& getTextureRext() const; 
    const sf::Color& getFillColor() const; 
    const sf::Color& getOutlineColor() const; 
    float getOutlineThickness() const; 
    sf::FloatRect getLocalBounds() const; 
    sf::FloatRect getGlobalBounds() const; 
    void setPosition(float x, float y); 
    void setPosition(const sf::Vector2f &position); 
    void setRotation(float angle); 
    void setScale(float factorX, float factorY); 
    void setScale(const sf::Vector2f& factors); 
    void setOrigin(float x, float y); 
    void setOrigin(const sf::Vector2f& origin); 
    const sf::Vector2f& getPosition() const; 
    float getRotation() const; 
    const sf::Vector2f& getScale() const; 
    const sf::Vector2f& getOrigin() const; 
    void move(float offsetX, float offsetY); 
    void move(const sf::Vector2f& offset); 
    void rotate(float angle); 
    void scale(float factorX, float factorY); 
    void scale(const sf::Vector2f& factor); 
    const sf::Transform& getTransform() const; 
    const sf::Transform& getInverseTransform() const; 
private: 
    sf::RectangleShape _btnShape; 
};