我需要根据特定的水平和垂直速度在屏幕上移动表面。我需要这些速度是完全随机的。我的想法是生成随机 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 页面上 here和 here .
现在您可以使用您的窗口,就好像它大两倍一样,但它仍然以相同的大小输出。当你做你的输出时,你把相同的 SDL_Rect 放在 blitting 函数中,除了一切都加倍。这样你就可以保持半像素精度。如果您的 Sprite 也具有更高的精度,您可以获得更清晰的输出。
您也可以使用四分之一像素精度来实现,但性能成本会更高,因此在您的应用程序中可能无法实现。还有内存成本,因为表面更大(半像素精度是四倍,四分之一像素是十六倍)。
关于c - SDL - Blit Surface 将浮点值作为 rect 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17547264/