如何通过键盘按键在鼠标坐标处绘制指定纹理?
问题分析与解决
你的代码核心问题是在键盘事件中错误使用了鼠标事件专属字段:
处理SDL_KEYDOWN事件时,e.motion.x和e.motion.y是无效值——motion成员仅在SDL_MOUSEMOTION、SDL_MOUSEBUTTONDOWN这类鼠标事件中有效,键盘事件的结构体不会给这个字段赋值,你拿到的是随机垃圾坐标,自然无法把纹理绘制到鼠标位置。
修复代码
将SDLK_1的处理分支替换为以下代码,用SDL_GetMouseState直接获取当前鼠标的实时坐标:
case SDLK_1: { int mouseX, mouseY; // 获取当前鼠标在窗口中的坐标 SDL_GetMouseState(&mouseX, &mouseY); SDL_Rect rect = {mouseX - 8, mouseY - 8, 16, 16}; // 确保纹理加载成功再执行绘制 if (gT[3] != NULL) { SDL_RenderCopy(gRenderer, gT[3], NULL, &rect); } printf("1\n"); break; }
额外注意事项
- 确认主循环末尾调用了
SDL_RenderPresent(gRenderer),这一步是把渲染缓冲区的内容刷新到窗口,没有它的话所有绘制操作都不会显示。 - 检查
gT[3]的加载逻辑,确保纹理初始化成功(可在加载后打印gT[3]地址,非NULL即为正常)。
内容的提问来源于stack exchange,提问作者yesyes
相关产品推荐
相关产品推荐

