gpt4 book ai didi

c++ - 将 SDL 矩形正确渲染到屏幕上

转载 作者:太空狗 更新时间:2023-10-29 20:50:36 26 4
gpt4 key购买 nike

这是我的代码,我正在关注 SDL 上的 lazyfoos 教程,这是我正在关注的确切教程 - http://lazyfoo.net/tutorials/SDL/08_geometry_rendering/index.php

Notice the call to SDL_SetRenderDrawColor. We're using 255 red and 255 green which combine together to make yellow. Remember that call to SDL_SetRenderDrawColor at the top of the loop? If that wasn't there, the screen would be cleared with whatever color was last set with SDL_SetRenderDrawColor, resulting in a yellow background in this case.

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 );
}

最佳答案

Why do you need to call SDL_SetRenderDrawColor() twice and why in that order?

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 之前设置正确的颜色。

I noticed if I comment out the first SDL_SetRenderDrawColor() just before the call to SDL_RenderFillRect(),the full window will be the colour you set the rectangle to be

很好的观察!你看,因为你在循环 (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 在第一帧调用。

关于c++ - 将 SDL 矩形正确渲染到屏幕上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53725405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com