这是我的代码,我正在关注SDL上的lazyfoos教程,这是我正在关注的确切教程-http://lazyfoo.net/tutorials/SDL/08_geometry_rendering/index.php
请注意对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 );
}
答案 0 :(得分:4)
为什么需要两次调用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
发生时,实际上实际上是在循环的 last 中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
调用之外