c - SDL - Blit Surface 将浮点值作为 rect 参数传递

标签 c sdl floating-point-precision rect blit

我需要根据特定的水平和垂直速度在屏幕上移动表面。我需要这些速度是完全随机的。我的想法是生成随机 float (我成功了)并将它们用作速度。这样我就可以有很多不同的速度,永远不会太快或太慢。问题是:SDL_BlitSurface 将只接受一个 SDL_Rect 作为参数来确定将用来绘制表面的新矩形,而 SDL_Rect 是一个由 4 个 int 组成的结构:两个用于坐标,两个用于维度;

恢复:如何在 SDL 上对表面进行位 block 传输时精确工作?

最佳答案

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

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 函数中,除了一切都加倍。这样你就可以保持半像素精度。如果您的 Sprite 也具有更高的精度,您可以获得更清晰的输出。

您也可以使用四分之一像素精度来实现,但性能成本会更高,因此在您的应用程序中可能无法实现。还有内存成本,因为表面更大(半像素精度是四倍,四分之一像素是十六倍)。

关于c - SDL - Blit Surface 将浮点值作为 rect 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17547264/

相关文章:

C 错误 : undefined reference to '_itoa'

c++ - 在Linux上使用GCC/Sublime编译SDL程序

opengl - SDL2/SFML2 中的软件和硬件渲染

javascript - 使用 ULP 比较 double (最后一位的单位)

c - 关于 GDT 和流程

c - 如何在atmega32上实现此代码

c - C 中函数返回局部变量地址时的 NULL 行为

c++ - C++ 中的自定义阻塞函数

java - float 到 string 转换错误

Python: float 无限长度(精度 float )