c++ 使用SDL2的SDL_RenderDrawRect绘制国际象棋棋盘

gzjq41n4  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(144)

我对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时,没有矩形出现。你知道为什么吗?
干杯!

wqnecbli

wqnecbli1#

for循环中存在多个错误。
你必须改变for循环中的条件。两个迭代变量(x和y)都从0开始,但是你运行foor循环的条件是它们大于3或8,所以它们不会被执行。把它改为小于这个值(〈而不是〉)
你必须改变第二个for循环的迭代变量,你创建了y,但是条件和值的改变是针对x的
你的矩形是128x128大,但是你把循环中的x和y乘以10,这意味着你的矩形会重叠。你必须把它乘以至少128。
如果你看一个国际象棋棋盘,从左上角开始,从左到右,每隔一个区域都是彩色的。要实现这一点,你必须从左上角开始,遍历每个单元格,然后跳到下一行。每隔一个区域,你必须画一个矩形。
这是一个稍微编辑过的算法版本:

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
希望这对你有点帮助

qxsslcnc

qxsslcnc2#

虽然你的问题解决了,离开这个人谁面临这样的问题(无论如何它很容易使董事会,我写了这段代码)这将创建一个标准的8x8棋盘

void Create_Board() {
    SDL_Rect Box = { 0,0,80,80}; COORD position = { 0 };
    bool toggle_color = 0;
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if (toggle_color)
                SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
            else
                SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
            SDL_RenderFillRect(renderer, &Box);
            Box.x += 80;
            if(j != 7) //needed for chess color pattern
            toggle_color = !toggle_color;
        }
        Box.x = 0;
        Box.y += 80;
    }
}

相关问题