我需要根据某些水平和垂直速度在屏幕周围移动表面。我需要那些速度完全随机。我的想法是生成随机浮点数(我成功了)并将它们用作速度。这样我可以有很多不同的速度,从不太快或太慢。问题是:SDL_BlitSurface
只接受SDL_Rect
作为参数来确定将用于绘制曲面的新矩形,而SDL_Rect
是由4 {{1}组成的结构} s:两个用于坐标,两个用于维度;
恢复:如何在SDL上blitting曲面时使用精度?
答案 0 :(得分: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页面here和here的一些说明。
现在你可以使用你的窗口,好像它的两倍大,但它仍然以相同的大小输出。当您进行输出时,您将相同的SDL_Rect放在blitting函数中,除非所有内容都加倍。这样你可以保持半像素精度。如果你的精灵也提高了精度,你可以获得更清晰的输出。
您也可以使用四分之一像素精度来实现,但性能成本会更高,因此在您的应用中可能无法实现。还有一个内存成本,因为表面更大(半像素精度为四倍,四分之一像素为十六)。
答案 1 :(得分:1)
SDL_BlitSurface
正在使用像素,不幸的是你不能拥有“半像素”。您仍应将对象的坐标表示为float
,但在将其传递给int
时将其转换为SDL_Rect
。由于您的SDL_Surface
将始终完美地落在屏幕像素上,因此您的图形应始终保持清晰。
话虽如此,为了获得更高的精度,我想你可以切换到OpenGL
中的渲染四边形。当硬件与屏幕像素没有正确对齐时,硬件将负责计算纹理的像素颜色,从而产生“模糊”纹理,但至少你可以完全控制它们的位置。
答案 2 :(得分:0)
渲染时处理子像素精度没有意义,因为按照定义像素是光栅图形中最小的可寻址元素。
您可以在渲染时将位置舍入到最接近的整数,例如(Sint16)(x+0.5)
。如果需要,应用程序的其余部分仍然可以使用更高精度的坐标。