首页 > 解决方案 > 使用 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当我在循环中使用时,不想显示任何矩形。任何想法为什么会这样?

干杯!

标签: c++

解决方案


您的 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

希望这对您有所帮助


推荐阅读