【发布时间】:2021-05-06 18:19:04
【问题描述】:
我正在使用这个简单的函数制作矩形:
int render_cell(SDL_Renderer *renderer, int x, int y, const SDL_Color *color) {
SDL_Rect rect;
rect.x = x * CELL_WIDTH;
rect.y = y * CELL_HEIGHT + 30;
rect.w = CELL_HEIGHT;
rect.h = CELL_WIDTH;
SDL_SetRenderDrawColor(renderer, color->r, color->g, color->b, 255);
SDL_RenderDrawRect(renderer, &rect);
SDL_RenderFillRect(renderer, &rect);
}
我已经尝试避免与其他物体发生碰撞,但这没有任何区别。
此外,如您所见,线条是直的,矩形的其他边也是如此。
这是下载我的项目的谷歌驱动器链接:您需要导航到构建并在终端中输入“make”,然后输入“./game”,它就会运行。如果您有 CMake,这将起作用 https://drive.google.com/file/d/1txmb2IKEYcJOcFSUBVSZyqWyCZQDp2uR/view?usp=sharing
【问题讨论】:
-
猜测,这看起来像是帧间“撕裂”。也就是说,绘图代码正在与显示器齐平。因此,代码正在绘制到试图显示的框架中。您的(例如)
SDL_RenderPresent在哪里刷新以前对屏幕的更改?通常是这样的:start new frame, draw, draw, draw, flush frame to display, sleep重复。你是双缓冲吗?也就是说,绘制到一个表面,刷新那个,绘制到另一个表面,刷新那个,然后翻转缓冲区? -
您的程序看起来足够小,可以编辑您的问题并发布完整的 MRE,我们可以下载、编译和运行。
-
将minimal reproducible example作为文本编辑到问题中;示例见this answer末尾的程序:single-file & self-contained。
-
在您的系统上创建一个 single
.c文件,该文件通过编辑和/或剪切和粘贴仅具有#include的标准代码来包含您的所有代码,例如stdio.h或SDL.h。您可能必须重新排序,以便(例如)如果funcB调用funcA,则funcA被定义之前funcB。它应该使用(例如)干净地编译:cc -o single single.c `pkg-config --cflags --libs sdl2`然后可以将single.c发布在问题底部的代码块中。使用{}图标创建另一个代码块。或者,将文本用```换行。 -
@AndreiMikhov:断边是调用函数
render_grid还是调用函数render_board造成的?请提供minimal reproducible example,其中仅包含重现问题所需的代码。