在屏幕上正确渲染一个SDL矩形

时间:2018-12-11 13:43:20

标签: c++ sdl sdl-2 game-development

这是我的代码,我正在关注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 );
}

1 个答案:

答案 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_RenderClearSDL_RenderFillRect都将始终绘制为绿色,除了第一帧中的第一个SDL_RenderClear调用之外