2016-02-19 4 views
1

Я пытаюсь запрограммировать автомобиль с 4 колесами, и я хочу, чтобы они наследовали трансформирование автомобиля при рисовании. Я знаю очень маленький учебник по адресу SFML transform, но я точно не понимаю. я решил приехать сюда рано в проект, поэтому я не придется переписывать большинство из них (видел, что это случается с другими)Иерархия объектов в SFML 2.3

На данный момент у меня есть только это:

class Car : public Drawable, public Transformable 
{ 
public: 
    Car(Vector2f dimensions): 
     m_dimensions(dimensions), 
     m_body(m_dimensions), 
     m_wheels(4) 
    {} 

private: 

    virtual void draw(RenderTarget& target, RenderStates states) const 
    { 
     states.transform *= getTransform(); 
     states.texture = NULL; 
     target.draw(m_body, states); 
    } 
    struct Wheel : 
    { 

    }; 
    vector<Wheel> m_wheels; 
    Vector2f m_dimensions; 
    RectangleShape m_body; 

}; 


int main() 
{ 
    RenderWindow window(VideoMode(800, 600), "SFML window"); 
    window.setVerticalSyncEnabled(true); 
    Car car(Vector2f(300.f, 180.f)); 
    car.setOrigin(20,20); 
    car.setPosition(400, 300); 
    car.rotate(45); 

    while(window.isOpen()) 
    { 
     Event event; 
     while(window.pollEvent(event)) 
     { 
      if(event.type == Event::Closed) 
       window.close(); 
     } 
     car.rotate(1); 
     window.clear(); 
     window.draw(car); 
     window.display(); 
    } 
} 

мне просто нужно колеса, которые будут напечатаны рядом с автомобилем (я выясню позицию и что сейчас), но прямо сейчас я просто хочу знать, правильно ли я направляюсь, или вы знаете о какой-либо лучшей реализации.

ответ

0

Вы делаете все правильно. Я надеюсь, что следующее поможет прояснить, что происходит в коде, который вы опубликовали выше:

Класс sf::Transformable используется в качестве оболочки для данных (матрицы), которые могут представлять преобразования, которые обычно используются в графическом программировании, таких как вращение, масштабирование и перевод. Наследуя класс sf::Transformable, вы добавляете все функции преобразования в класс и также снабжаетесь функцией, которая дает вам данные - sf::Transformable::getTransform(). Вы хотите передвинуть свою машину, и это предоставит вам все инструменты, необходимые для отслеживания движения.

Перемещение вашего автомобиля будет бессмысленным, если оно не изменит положение на экране, поэтому вы должны сообщить графической карте движения, когда автомобиль нарисован. Когда выполняется строка states.transform *= getTransform();, вы принимаете преобразование, переданное в аргументе states, и добавляете преобразование автомобиля (посредством умножения матрицы), чтобы убедиться, что оно нарисовано со всеми изменениями, которые вы сделали, используя функции sf::Transformable.

Поскольку вы делаете сложный объект (автомобиль), вам нужно будет рассмотреть возможность размещения отдельных предметов (тела, колес). Обратите внимание, что произойдет, если отдельные объекты также наследуют sf::Transformable и sf::Drawable и реализуют их, как вы уже выше: они добавляют свое преобразование к преобразованию автомобиля (передается через аргумент states) перед тем, как рисовать на экране, поэтому вам остается только сохранить свое положение относительно самого автомобиля!