消失的 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 矩形。如何使用新的附加形状更新窗口的主要内容,如果未能解决你的问题,请参考以下文章

使用 SDL2 绘制矩形

SDL2 无法正确绘制矩形

如何在 main() 函数之外制作形状

SDL TextInput(使用新的 1.3 结构)

渲染时如何使 SDL2 0,0 定位在窗口的中心?

在macOS中将窗口的形状从矩形更改为其他形状,可以吗?