c++ - 使用 SDL2 的 SDL_RenderDrawRect 绘制棋盘
问题描述
我对 SDL2 相当陌生,作为我的第一个项目,我只想创建一个棋盘。事实证明,这比我想象的要难。
我尝试了很多不同的方法来绘制棋盘的区域SDL_RenderDrawRect
,这是当前状态:
#include <SDL2/SDL.h>
int main()
{
bool quit = false;
SDL_Event event;
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window *window = SDL_CreateWindow("Chess", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, 680, 680, 0);
SDL_Renderer *render = SDL_CreateRenderer(window, -1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
for (int x = 0; x > 3; x++) {
for (int y = 0; x > 8; x++) {
SDL_Rect rect;
rect.x = x*10;
rect.y = y*10;
rect.w = 128;
rect.h = 128;
SDL_SetRenderDrawColor(render, 159, 84, 8, 255);
SDL_RenderFillRect(render, &rect);
}
}
SDL_RenderPresent(render);
while (!quit) {
SDL_WaitEvent(&event);
switch (event.type) {
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Quit();
return 0;
}
SDL_RenderDrawRect
当我在循环中使用时,不想显示任何矩形。任何想法为什么会这样?
干杯!
解决方案
您的 for 循环中有多个错误。
您必须在 for 循环中更改条件。两个迭代变量(x 和 y)都以 0 开头,但是运行 foror 循环的条件是它们大于 3 或 8,因此它们不会被执行。将其更改为小于值(< 而不是 >)
您必须更改第二个 for 循环的迭代变量。您创建 y 但条件和值更改是针对 x
您的 Rect 是 128x128 大,但是您将循环中的 x 和 y 乘以 10,这意味着您的 Rectangles 将重叠。你必须至少乘以 128。
如果你看一个棋盘,从左上角开始,从左到右,每隔一个区域就会被着色。要实现这一点,您必须从左上角开始,遍历每个单元格,然后跳到下一行。每隔一个字段,您必须绘制一个 Rect。
这是您的算法的略微编辑版本:
int startPos = 0;
for (int y = 0; y < 8; y++) {
for (int x = startPos; x < 3; x+=2) {
SDL_Rect rect;
rect.x = x * 129;
rect.y = y * 129;
rect.w = 128;
rect.h = 128;
SDL_SetRenderDrawColor(render, 159, 84, 8, 255);
SDL_RenderFillRect(render, &rect);
}
startPos = 1 - startPos;
}
说明:在第一行中,第一个字段将被着色,因为 startPos 为 0。由于每一行的开始位置都与前一行相反,所以我们必须在绘制一行的最后一个单元格时立即更改 startPos。由于我们只需要每隔一个单元格绘制一次,因此每次迭代 x 必须增加 2
希望这对您有所帮助
推荐阅读
- javascript - 图像坐标随浏览器宽度变化而变化
- spring - 如何创建只监听 Redis 通道和 dispatch 事件的 Spring Boot 应用?
- r - 时区转换:无效的 'tz' 值 - R
- c# - 如何在 C# 中直接写入内存
- typescript - React-Native undefined 无法解析模块
- php - 如何使用 $.post 将带有 Ajax 的输入类型文件中的图像文件传递给 PHP
- tensorflow - 在云端训练大型数据集(例如:30GB+)?
- jboss - 带有外部 Jar 的 Keycloak 自定义 SPI 部署
- ssh - SSH“kex_exchange_identification:读取:对等方重置连接”
- c# - UTF-8 数据在使用 Methodinfo.invoke 方法从 c++ 调用 c# 方法时丢失