SDL绘制矩形消失问题:按键新增形状时应如何正确更新窗口?
问题结论
不推荐直接移除SDL_RenderClear解决该问题,这是错误的治标方案。
为什么不能删SDL_RenderClear
SDL_RenderClear的核心作用是每一帧绘制前清空整个渲染缓冲区,清除上一帧的残留画面。如果直接移除会出现大量后续问题:
- 画面出现拖影、旧内容无法清除的残留问题
- 动态元素移动时会留下大量重影轨迹
- 多图层绘制时会出现画面叠加混乱的问题
代码问题根源
当前绘制逻辑存在两个明显错误:
SDL_KEYDOWN事件仅会在按键按下的瞬间触发一次,你只在事件触发的那一帧绘制额外矩形,后续帧清屏后没有再执行矩形绘制逻辑,自然会消失- 你把按键判断写在了事件循环之外,
e变量最终存储的是事件队列的最后一个事件,大部分帧里e.type都不是SDL_KEYDOWN,自然不会触发绘制逻辑
正确解决方案
新增一个状态变量标记是否需要显示额外矩形,按键触发时修改状态,每一帧都根据状态决定是否绘制对应矩形,参考修正后代码:
// 新增状态变量,标记是否显示额外矩形 bool showExtraRect = false; while (!quit) { while (SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) quit = true; // 把事件判断放到事件循环内部,按下右键修改状态 if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_RIGHT) { showExtraRect = true; } } SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF); SDL_RenderClear(gRenderer); // 绘制固定矩形 SDL_Rect fillRect = { 0, 0, SCREEN_WIDTH / 5 - 5, SCREEN_HEIGHT / 5 - 5 }; SDL_SetRenderDrawColor(gRenderer, 255, 205, 51, 0xFF); SDL_RenderFillRect(gRenderer, &fillRect); // 每帧根据状态判断是否绘制额外矩形 if (showExtraRect) { SDL_Rect extraRect = { 0, 200, SCREEN_WIDTH / 5 - 5, SCREEN_HEIGHT / 5 - 5 }; SDL_SetRenderDrawColor(gRenderer, 255, 205, 51, 0xFF); SDL_RenderFillRect(gRenderer, &extraRect); } SDL_RenderPresent(gRenderer); }
内容的提问来源于stack exchange,提问作者Sukri
相关产品推荐
相关产品推荐

