为什么SFML仓位是浮动的?

时间:2018-08-03 12:01:49

标签: c++ sfml

在SFML文档中,我看到精灵和形状的位置是... float。为什么?它是否与sf::View链接,float的范围也一样?

文档链接:

sf::Transformable

sf::View

sf::RenderWindow

2 个答案:

答案 0 :(得分:3)

SFML中的坐标是浮点数而不是整数,因为实际的转换-从世界坐标到屏幕上的像素-不必以1:1的方式发生。

如何处理坐标及其映射完全取决于您。

例如,您可能希望使用浮点坐标,以便整数部分标识平铺地图中的平铺坐标,而小数表示平铺边界之间的空间。在其他情况下,您可能需要将1:1坐标映射到像素。

最后,sf::View与使用的sf::RenderTarget一起决定了如何解释坐标以及坐标的实际含义:

sf::RenderWindow window({512, 512}, "Test Window");

// This view is basically the default view for the window above.
// It maps coordinates 1:1 to pixels, which means a position (25,50) would map to the pixel at (25,50).
// This is the most common way.
sf::View pixelSpace({256, 256}, {512, 512});

// This view only shows things between (0, 0) and (1, 1), similar to how texture coordinates are usually handled.
// This can be useful, for example if you want to visualize the UV mapping of a model.
// You set this view and then just render based on the texture coordinate.
sf::View uvSpace({.5f, .5f}, {1, 1});

// This is an example for a tile based game, where the view allows you to
// make something 1.0 wide and high and it will automatically be the size of one tile.
// In this example I assume a 16:10 display ratio and I want 16x10 tiles to show.
sf::View tileSpace({8, 5}, {16, 10});

答案 1 :(得分:2)

您需要浮点才能正确地设置精灵的动画。想象一下x = 1的头寸,您将基于增量时间将头寸增加到1.1。将精灵移动到x = 2(下一个像素)需要10帧。使用整数x会四舍五入为1,并且您根本不会移动。

此外,为了渲染内容,您必须计算转换矩阵(使用浮点数),因此无论如何迟早都必须转换为浮点数。这是图形API在内部工作的方式,SFML只是将所有内容包装起来,因此您只需要担心屏幕坐标(在这种情况下为像素)。