Рисование шахматной доски с помощью SDL_RenderDrawRect SDL2

#c

#c

Вопрос:

Я довольно новичок в 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, amp;rect);
        }
    }    
    SDL_RenderPresent(render);
    while (!quit) {
        SDL_WaitEvent(amp;event);
        
        switch (event.type) {
            case SDL_QUIT:
                quit = true;
                break;
        }
    }       
    SDL_Quit();     
    return 0;
}
 

Никакие прямоугольники не хотят отображаться, когда я использую SDL_RenderDrawRect их в цикле. Есть какие-нибудь идеи, почему это так?

Ваше здоровье!

Комментарии:

1. for (int x = 0; x > 3; x ) { Ваши условия цикла обратные. x не больше 3, поэтому цикл никогда не будет введен.

2. О, это объясняет, почему прямоугольники никогда не появлялись!

Ответ №1:

В ваших циклах for есть несколько ошибок.

Вы должны изменить свои условия в циклах for. Обе переменные итерации (x и y) начинаются с 0, но ваше условие для запуска цикла foor заключается в том, что они больше 3 или 8, поэтому они не будут выполнены. Измените его на меньшее значение(< вместо >)

Вы должны изменить переменную итерации вашего второго цикла for. Вы создаете y, но условие и изменение значения относятся к x

Ваш прямоугольник имеет размер 128×128, но вы умножаете 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, amp;rect);              
    }
    startPos = 1 - startPos;
}
 

Объяснение:
В первой строке первое поле будет окрашено, потому что startPos равно 0.
Поскольку каждая строка имеет противоположное начало своей предшественницы, мы должны изменить startPos, как только будет нарисована последняя ячейка строки.
Поскольку нам нужно рисовать только каждую вторую ячейку, x нужно увеличивать на две с каждой итерацией

Надеюсь, это вам немного помогло

Комментарии:

1. Спасибо! Теперь я вижу, что я сделал не так, теперь результат, наконец, дает квадраты, а не просто пустой экран.