消失的 SDL 矩形。如何使用新的附加形状更新窗口
Posted
技术标签:
【中文标题】消失的 SDL 矩形。如何使用新的附加形状更新窗口【英文标题】:Dissapearing SDL Rects. How to update window with new additional shapes 【发布时间】:2021-12-11 10:31:41 【问题描述】:我正在尝试在按键时使用新的附加矩形更新窗口,但由于SDL_RenderClear
,它不断消失。是否建议删除SDL_RenderClear
?
while (!quit)
while (SDL_PollEvent( & e) != 0)
if (e.type == SDL_QUIT)
quit = true;
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(gRenderer); //if i remove this line, the new rectangle will remain there
SDL_Rect fillRect =
0,
0,
SCREEN_WIDTH / 5 - 5,
SCREEN_HEIGHT / 5 - 5
;
SDL_SetRenderDrawColor(gRenderer, 255, 205, 51, 0xFF);
SDL_RenderFillRect(gRenderer, & fillRect);
switch (e.type)
case SDL_KEYDOWN:
if (e.key.keysym.sym == SDLK_RIGHT)
SDL_Rect fillRect =
0,
200,
SCREEN_WIDTH / 5 - 5,
SCREEN_HEIGHT / 5 - 5
;
SDL_SetRenderDrawColor(gRenderer, 255, 205, 51, 0xFF);
SDL_RenderFillRect(gRenderer, & fillRect);
break;
SDL_RenderPresent(gRenderer);
【问题讨论】:
【参考方案1】:SDL_RenderClear() 非常好,事实上你应该使用它。您的问题(又名 rect 消失)是由您处理输入的方式引起的。 SDL_KEYDOWN 是一个事件,仅在您按下某个键的帧上发生,并且在您在短暂延迟后按住它时发生。如果在那个确切的帧上按下了键,你正在做的是绘制矩形,而不是在之前的任何帧上按下它。通过 bool 的解决方案可能如下所示:
bool keyPressed = false;
while( !quit )
while( SDL_PollEvent( &e ) != 0 )
if( e.type == SDL_QUIT )
quit = true;
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer ); //if i remove this line, the new rectangle will remain there
SDL_Rect fillRect = 0, 0, SCREEN_WIDTH / 5-5, SCREEN_HEIGHT / 5-5 ;
SDL_SetRenderDrawColor( gRenderer, 255, 205, 51, 0xFF );
SDL_RenderFillRect( gRenderer, &fillRect );
if(keyPressed)
SDL_Rect fillRect = 0, 200, SCREEN_WIDTH / 5-5, SCREEN_HEIGHT / 5-5 ;
SDL_SetRenderDrawColor( gRenderer, 255, 205, 51, 0xFF );
SDL_RenderFillRect( gRenderer, &fillRect );
switch(e.type)
case SDL_KEYDOWN:
if(e.key.keysym.sym==SDLK_RIGHT)
keyPressed = true;
break;
SDL_RenderPresent( gRenderer );
屏幕清除绝对应该在图形中完成,否则你在前一帧上绘制的形状将保留在那里。
【讨论】:
哦,太好了!非常感谢您的解释。是的,我知道如果不清除,这些形状就会相互堆叠。以上是关于消失的 SDL 矩形。如何使用新的附加形状更新窗口的主要内容,如果未能解决你的问题,请参考以下文章