Как отредактировать исходный код SFML, чтобы добавить новый Drawable Object? - PullRequest
3 голосов
/ 10 июля 2011

Эй, я работаю над классом, называемым "Тело", который объединяет формы и спрайты в один объект.Я хотел бы войти в исходный код и добавить новую перегрузочную функцию Draw () RenderWindow, чтобы этот новый объект можно было легко брать и рисовать. Как мне это сделать?

Я сейчас использую

  • Windows 7
  • SFML 1.6
  • Недавно msVS ++Скомпилированные в 2010 году статические библиотеки отладки и библиотеки
  • оригинальная папка включения

РЕДАКТИРОВАТЬ:

Я также нашел это в заголовке Drawable.hpp:

private :

    friend class RenderTarget;

////////////////////////////////////////////////////////////
/// Draw the object into the specified window
///
/// \param Target : Target into which render the object
///
////////////////////////////////////////////////////////////
void Draw(RenderTarget& Target) const;

////////////////////////////////////////////////////////////
/// Render the specific geometry of the object
///
/// \param Target : Target into which render the object
///
////////////////////////////////////////////////////////////
virtual void Render(RenderTarget& Target) const = 0;

но я не могу понять, где находится полный код каждой функции, только объявления.К сожалению, я не нашел там и мини-учебника ...

Ответы [ 2 ]

4 голосов
/ 10 июля 2011

Примечание:

Прежде чем вы извлекаете и реализуете свой собственный Drawable, вы можете подумать, нужно ли вам вообще это делать . Автор SFML заявил, что sf::Drawable изначально не предназначался для подкласса вне SFML .

Что в стороне,

Для SFML 1.6:

Похоже, что все, что вам нужно сделать, это извлечь свой класс из sf::Drawable, а затем реализовать виртуальную функцию Render.

class MyDrawable : public sf::Drawable {

private:

    virtual void Render(RenderTarget& target) const {
        // Do some rendering of whatever...
        target.Draw(mySubSprite);
    }

    sf::Sprite mySubSprite;

};

Примером этого может быть найденный на форумах SFML .

Для SFML 2.0:

Заголовочный файл Drawable из SFML содержит комментарии, описывающие, как получить ваши собственные Drawable классы. Вам не нужно изменять исходный код SFML для создания новых Drawables.

Также имеется простой пример:

class MyDrawable : public sf::Drawable
{
public :
   ...
private :
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // You can draw other high-level objects
        target.draw(m_sprite, states);
        // ... or use the low-level API
        states.texture = &m_texture;
        target.draw(m_vertices, states);
        // ... or draw with OpenGL directly
        glBegin(GL_QUADS);
        ...
        glEnd();
    }
    sf::Sprite m_sprite;
    sf::Texture m_texture;
    sf::VertexArray m_vertices;
};

Этот пример может применяться к SFML 2.0, но если вы проверяете Drawable.hpp из любой имеющейся у вас версии SFML, он должен содержать аналогичный пример.

0 голосов
/ 10 июля 2011

RenderWindow::Draw принимает объект типа абстрактного класса Drawable. Это означает, что теоретически вы можете просто сделать ваш Body класс дочерним для Drawable и перегружать некоторые виртуальные методы, чтобы он отображался.

Но, похоже, это не так. Документы для Drawable показывают, что в этом классе есть только одна виртуальная функция: деструктор. Что ... вроде глупо.

Однако внешность может быть обманчива. Я проверял документацию 2.0 , чтобы узнать, выяснили ли они, как правильно создать иерархию наследования, и оказалось, что у них do есть виртуальные методы для переопределения. Просто они все частные (что само по себе хорошо, и на самом деле очень хорошо), и парни из SFML не сказали Doxygen, чтобы они сгенерировали документацию для частных членов. Я подал им сообщение об этом.

Пока они не обновят свои документы, единственное, что я могу сказать, - это посмотреть на заголовок и, возможно, исходный код Sprite и попытаться выяснить, как правильно создать производный класс Drawable.

...