SFML 2.3 中的对象层次结构

Object hierarchy in SFML 2.3

我正在尝试编写一辆有 4 个轮子的汽车,我希望它们在绘制时继承汽车的变换。我知道 SFML transform 上的非常小的教程,但我不太明白。 我决定在项目早期来到这里,这样我就不必重写大部分内容(看到它发生在其他人身上)

目前我只有这个:

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

我只需要在汽车旁边打印车轮(我会弄清楚位置和现在做什么)但现在我只想知道我的方向是否正确或者你知道任何更好的实施。

你做的很对。我希望以下内容有助于弄清您在上面发布的代码中发生的事情:

sf::Transformable class 用作数据(矩阵)的包装器,可以表示图形编程中常用的变换,例如旋转、缩放和平移。通过继承 sf::Transformable class,您将所有转换函数添加到 class,并且还提供了一个为您提供数据的函数 - sf::Transformable::getTransform()。您想四处移动您的汽车,这为您提供了跟踪其运动所需的所有工具。

如果不改变屏幕上的位置,移动您的汽车将毫无意义,因此您必须在绘制汽车时将运动通知显卡。当行 states.transform *= getTransform(); 执行时,您将采用传递给 states 参数的变换并添加汽车的变换(通过矩阵乘法)以确保绘制它时使用您使用 sf::Transformable的函数。

由于您正在制作复合对象(汽车),因此您将不得不考虑单个对象(车身、车轮)的放置。注意如果单个对象也继承 sf::Transformablesf::Drawable 并像上面那样实现它们会发生什么:它们在绘制之前将它们的变换添加到汽车的变换(通过 states 参数传入)到屏幕上,所以你只需要保持他们相对于汽车本身的位置!