Почему вам нужно дважды вызывать SDL_SetRenderDrawColor () и почему в этом порядке?
Имя SDL_RenderClear
немного вводит в заблуждение.Он не очищает экран от «пустого» или чего-либо еще - он просто заполняет его тем цветом, который был установлен SDL_SetRenderDrawColor
.Поэтому, если вы не измените цвет между «очисткой» и рисованием прямоугольника, то вы не увидите прямоугольник, потому что рисуете его тем же цветом, которым вы только что заполнили весь экран.
Так вот
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer );
Вы делаете весь экран белым.Мы делаем это, устанавливая белый цвет, а затем закрашивая весь экран белым цветом.
Затем здесь
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0x00, 0x00, 0xFF );
Мы устанавливаем красный цвет, поэтому прямоугольник здесь
SDL_RenderFillRect( gRenderer, &fillRect );
Будет красным (не белым).
И если я правильно помню урок, он также рисует линию и некоторые другие вещи, каждый раз вызывая SDL_SetRenderDrawColor
прямо перед тем, чтобы установить правильный цвет.
Я заметил, что если я закомментирую первый SDL_SetRenderDrawColor () непосредственно перед вызовом SDL_RenderFillRect (), полное окно будет цветом, для которого вы установите прямоугольник
Очень хорошее наблюдение!Видите ли, поскольку вы зацикливаетесь (while(!quit){
), вы делаете SDL_RenderClear
, а затем SDL_RenderFillRect
... но затем снова приходит SDL_RenderClear
и так далее.Таким образом, когда происходит SDL_RenderClear
, цвет фактически устанавливается прямо перед SDL_RenderFillRect
в последнем , проходящем через цикл.Следовательно, почему он имеет этот цвет тоже.
Так что на самом деле, я не знаю, какой цвет в первый раз, потому что он еще не установлен (может быть значением по умолчанию белого или чего-то еще),но мы, вероятно, не видим этого, потому что это все равно только при первом запуске цикла.Примерно так:
...
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor( renderer, 0x00, 0xFF, 0x00, 0xFF );
SDL_RenderFillRect( renderer, &fillRect );
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor( renderer, 0x00, 0xFF, 0x00, 0xFF );
SDL_RenderFillRect( renderer, &fillRect );
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor( renderer, 0x00, 0xFF, 0x00, 0xFF );
SDL_RenderFillRect( renderer, &fillRect );
...
Итак, вы видите, что только с этим вторым вызовом SDL_SetRenderDrawColor
оба SDL_RenderClear
и SDL_RenderFillRect
всегда будут отображаться зеленым, кроме самого первого вызова SDL_RenderClear
в первом кадре.