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::Transformable
和 sf::Drawable
并像上面那样实现它们会发生什么:它们在绘制之前将它们的变换添加到汽车的变换(通过 states
参数传入)到屏幕上,所以你只需要保持他们相对于汽车本身的位置!
我正在尝试编写一辆有 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::Transformable
和 sf::Drawable
并像上面那样实现它们会发生什么:它们在绘制之前将它们的变换添加到汽车的变换(通过 states
参数传入)到屏幕上,所以你只需要保持他们相对于汽车本身的位置!