2017-02-14 16 views
0

У меня есть простой набор классов. Один из них - ButtonComponent, где я хочу по существу использовать sf::RectangleShape для визуального аспекта, а затем остальная часть ButtonComponent будет обрабатывать такие вещи, как event Listeners. Проблема возникает в том виде, что если я наследую от sf::Drawable в родительском классе, я должен реализовать класс draw() (Component), что означает, что дочерние классы реализуют родительские draw(), а не функцию SFML draw(). Есть ли какой-либо способ перестройки двух классов или способ вызова функции sf::RectangleShapes?Вызов sf :: Функция рисования прямоугольникаShapes?

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

«Есть ли способ перестроить два класса или способ вызова функции' sf :: RectangleShapes'? Что мешает вам называть 'sf :: RectangleShapes :: draw()' на самом деле? –

+0

это частная функция ... – Matthew

+0

Это личное, потому что оно должно быть вызвано только объектами рендеринга. Если вы хотите нарисовать чертеж, вам придется вызвать обратный: 'myRenderTarget.draw (myDrawable);' Затем он будет внутренне вызывать 'draw()' члена фактического drawable. – Mario

ответ

-2

Решение иметь ваши дочерние классы наследуют только sf::Drawable и имеют sf::RectangleShape внутри вашего ребенка классов. Нечто похожее ниже

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; 
};