C++ 正确地将SDL矩形渲染到屏幕

C++ 正确地将SDL矩形渲染到屏幕,c++,sdl,sdl-2,game-development,C++,Sdl,Sdl 2,Game Development,这是我的代码,我正在关注关于SDL的lazyfoos教程,这是我正在关注的确切教程- 请注意对SDL_SetRenderDrawColor的调用。我们用了255个红色和255个红色 绿色结合在一起变成黄色。还记得打电话给我吗 SDL_SetRenderDrawColor是否位于循环顶部?如果不是那样的话, 屏幕将以上次设置的任何颜色清除 SDL_SetRenderDrawColor,在本例中产生黄色背景 Lazyfoo确实在上面解释了这一点,但对我来说仍然没有意义 在屏幕上绘制填充矩形是一项非常

这是我的代码,我正在关注关于SDL的lazyfoos教程,这是我正在关注的确切教程-

请注意对SDL_SetRenderDrawColor的调用。我们用了255个红色和255个红色 绿色结合在一起变成黄色。还记得打电话给我吗 SDL_SetRenderDrawColor是否位于循环顶部?如果不是那样的话, 屏幕将以上次设置的任何颜色清除 SDL_SetRenderDrawColor,在本例中产生黄色背景

Lazyfoo确实在上面解释了这一点,但对我来说仍然没有意义

在屏幕上绘制填充矩形是一项非常简单的任务,但这项任务有时会导致很多混乱,例如,您需要调用SDL_SetRenderDrawColor()一次,而不是两次,一次是在清除渲染器之前,另一次是在调用SDL_RenderFillRect()之前

为什么需要调用SDL_SetRenderDrawColor()两次,为什么要按顺序调用?我注意到,如果在调用SDL_RenderFillRect()之前注释掉第一个SDL_SetRenderDrawColor(),则整个窗口将是您设置矩形的颜色,但当您包括对SDL_SetRenderDrawColor()的两个调用时按照我指定的顺序,窗口在屏幕中央显示一个彩色矩形,其余部分为白色(第一个SDL_SetRenderDrawColor()调用)

这是我打电话的游戏循环

while( !quit )
{
    while( SDL_PollEvent( &event ) != 0 )
    {
        if( event.type == SDL_QUIT )
        {
            quit = true;

        }
    }

    SDL_SetRenderDrawColor( renderer, 255, 255, 255, 0 ); // line of code in question
    SDL_RenderClear( renderer );

    SDL_Rect fillRect = { 500 / 4, 500 / 4, 500 / 2, 500 / 2 };
    SDL_SetRenderDrawColor( renderer, 0x00, 0xFF, 0x00, 0xFF ); // 2nd line of code in question
    SDL_RenderFillRect( renderer, &fillRect );

    SDL_RenderPresent( renderer );
}
为什么需要调用SDL_SetRenderDrawColor()两次,为什么要这样 点菜

SDL\u RenderClear
的名称有点误导。它不会将屏幕清除为“空”或任何内容-它只是用
SDL\u SetRenderDrawColor
设置的任何颜色填充屏幕。因此,如果您不在“清除”和绘制矩形之间更改颜色,那么您将看不到矩形,因为您所绘制的矩形的颜色与刚才填充整个屏幕的颜色相同

所以这里

SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer );
你把整个屏幕变成白色。我们通过设置白色来实现这一点,然后在整个屏幕上绘制白色

那么这里

SDL_SetRenderDrawColor( gRenderer, 0xFF, 0x00, 0x00, 0xFF );  
我们把红色设为矩形

SDL_RenderFillRect( gRenderer, &fillRect );
将是红色(不是白色)

如果我没记错教程的话,每次调用之前的
SDL\u SetRenderDrawColor
来设置正确的颜色时,它也会画一条线和其他一些东西

我注意到如果我注释掉第一个SDL_SetRenderDrawColor(),只需 在调用SDL_RenderFillRect()之前,完整窗口将是 将矩形设置为的颜色

非常好的观察!你看,因为你在循环(
而(!quit){
)你做了
SDL\u RenderClear
然后
SDL\u RenderFillRect
…但是
SDL\u RenderClear
再次出现,依此类推。所以当发生
SDL\u RenderClear
时,颜色实际上是在上一次循环中从
SDL\u 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\u SetRenderDrawColor
调用,
SDL\u RenderClear
SDL\u RenderFillRect
将始终以绿色绘制,除了第一帧中的第一个
SDL\u RenderClear
调用。

这很有意义:),我想我现在有了一般的想法,所以SDL\u RenderClear(渲染器)将SDL_SetRenderDrawColor(渲染器,255255,0)设置的颜色绘制为白色,下一个SDL_RenderFillRect(渲染器,&fillRect)将使用我们的SDL_Rect将指定的区域填充为调用SDL_SetRenderDrawColor(渲染器,0x00,0xFF,0x00,0xFF)所产生的颜色它是绿色的,但这只会绘制到后缓冲区,然后我们调用SDL_RenderPresent(渲染器),它会更新前缓冲区(我们看到的),并显示矩形和背景?完全正确。每次绘制操作(包括清除)使用上次设置的颜色进行绘制。因此,如果我们总是在绘制之前设置颜色,这很简单。否则可能会很复杂。有时我会忘记在复杂的序列中正确设置颜色,然后突然出现红色背景,因为这是其他地方绘制的其他形状所使用的颜色。:)