SFML 2.3中的对象层次结构

时间:2016-02-19 14:50:31

标签: hierarchy game-physics sfml

我正在尝试用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();
    }
}

我只需要将车轮打印在汽车旁边(我会弄清楚现在的位置和现在的情况)但是现在我只是想知道我是朝着正确的方向前进,还是知道任何更好的实施方式

1 个答案:

答案 0 :(得分:0)

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

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

如果它没有改变屏幕上的位置,那么移动你的车将毫无意义,所以你必须在绘制汽车时通知显卡。当行states.transform *= getTransform();执行时,您将在states参数上传入转换并添加汽车的变换(通过矩阵乘法)以确保使用{使用{进行的所有更改来绘制它{1}}的功能。

由于您正在制作复合物体(汽车),因此您必须考虑单个物体(车身,车轮)的位置。请注意,如果单个对象也继承sf::Transformablesf::Transformable并按上述方式实现它们会发生什么:在绘制之前,它们将变换添加到汽车的变换(通过sf::Drawable参数传入)在屏幕上,所以你只需要保持相对于汽车本身的位置!