2013-07-09 20 views
1

我需要根据某些水平和垂直速度在屏幕周围移动曲面。我需要这些速度是完全随机的。我的想法是产生随机的浮点数(我成功了),并用它们作为速度。这样我可以有很多不同的速度,从来不会太快或太慢。问题是:SDL_BlitSurface将只接受SDL_Rect作为参数来确定将绘制曲面的新矩形,并且SDL_Rect是由4构成的结构int s:两个用于坐标,两个用于维度;SDL - Blit Surface将float值作为直接参数

恢复:如何在SDL上对表面进行交接时使用精度?

回答

1

SDL_BlitSurface正在处理像素,不幸的是你不能有“半像素”。您仍然应该将对象的坐标表示为float,但在将它们传递到SDL_Rect时,将它们转换为int。由于您的SDL_Surface s将始终完美屏幕像素,您的图形应始终保持清晰。

这就是说,要更精确,我想你可以切换到渲染四边形OpenGL。硬件将负责计算纹理的像素颜色,当它们与屏幕像素不正确对齐时,会导致“模糊”纹理,但至少您可以完全控制其位置。

+0

现在我发现我错了。当然,没有像半像素这样的东西。我使用'SDL_GetTicks()'设置了一个FPS,从而减缓了我的动作 –

0

渲染时处理子像素精度没有意义,因为按照定义,像素是光栅图形中最小的可寻址元素。

您可以在渲染时将位置四舍五入到最接近的整数,例如, (Sint16)(x+0.5)。如果你需要的话,你的应用程序的其余部分仍然可以使用更高精度的坐标。

+0

如何在为iOS开发时将视图移动0.5px?我怎么能在Blits上获得更高的精度?速度1很好,但2速度太快。 –

+0

您可以在您的应用程序逻辑中指定任何您喜欢的单位:像素,纳米像素,米,光年等。但是当您实际渲染东西时(blit),整个像素是屏幕唯一可以理解的语言。 – Hilborn

+0

@gabriel_vincent只有当你将它们传递给SDL_Rect时,才使用浮点数进行所有计算。 – 2013-07-09 12:52:59

3

有一种解决方案实际显示具有半像素精度的表面。有一个性能成本,但它很好地呈现。这基本上是古老的反走样工作原理:以更高的分辨率渲染,然后缩小比例。

win = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); //create a new rendering window 
renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); //create a new renderer 
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // make the scaled rendering look smoother. 
SDL_RenderSetLogicalSize(renderer, width*2, height*2); //tell the renderer to work internally with this size, it will be scaled back when displayed on your screen 

您可以找到有关职能here或API页面herehere一些解释。

现在你可以使用你的窗口,就好像它是两倍大,但它仍然输出相同的大小。当你完成你的输出时,你把相同的SDL_Rect放在blitting函数中,除非所有的东西都加倍。这样你可以保持半像素精度。如果你的精灵也有更高的精度,你可以得到更清洁的输出。

你也可以用四分之一像素的精度来做,但性能成本会更大,所以它可能在你的应用程序中是不可能的。还有一个内存成本,因为表面更大(四倍半像素精度,四倍像素十六倍)。

相关问题