C++ 正确地将SDL矩形渲染到屏幕
这是我的代码,我正在关注关于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()调用) 这是我打电话的游戏循环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确实在上面解释了这一点,但对我来说仍然没有意义 在屏幕上绘制填充矩形是一项非常
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(渲染器),它会更新前缓冲区(我们看到的),并显示矩形和背景?完全正确。每次绘制操作(包括清除)使用上次设置的颜色进行绘制。因此,如果我们总是在绘制之前设置颜色,这很简单。否则可能会很复杂。有时我会忘记在复杂的序列中正确设置颜色,然后突然出现红色背景,因为这是其他地方绘制的其他形状所使用的颜色。:)