我正在尝试用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();
}
}
我只需要将车轮打印在汽车旁边(我会弄清楚现在的位置和现在的情况)但是现在我只是想知道我是朝着正确的方向前进,还是知道任何更好的实施方式
答案 0 :(得分:0)
你正确地做事。我希望以下内容有助于澄清您在上面发布的代码中发生的事情:
sf::Transformable
类用作数据(矩阵)的包装,可以表示图形编程中常用的转换,例如旋转,缩放和转换。通过继承sf::Transformable
类,您可以将所有转换函数添加到类中,并且还提供了一个为您提供数据的函数 - sf::Transformable::getTransform()
。您想要移动您的汽车,这为您提供了跟踪其移动所需的所有工具。
如果它没有改变屏幕上的位置,那么移动你的车将毫无意义,所以你必须在绘制汽车时通知显卡。当行states.transform *= getTransform();
执行时,您将在states
参数上传入转换并添加汽车的变换(通过矩阵乘法)以确保使用{使用{进行的所有更改来绘制它{1}}的功能。
由于您正在制作复合物体(汽车),因此您必须考虑单个物体(车身,车轮)的位置。请注意,如果单个对象也继承sf::Transformable
和sf::Transformable
并按上述方式实现它们会发生什么:在绘制之前,它们将变换添加到汽车的变换(通过sf::Drawable
参数传入)在屏幕上,所以你只需要保持相对于汽车本身的位置!