【问题标题】:SDL Not redrawing screen after Flip or Update翻转或更新后 SDL 不重绘屏幕
【发布时间】:2013-12-19 10:43:11
【问题描述】:

我最近开始使用 SDL 进行编程,并且一直在关注有关 gamedevgeek 和lazyfoo 的一些教程。我必须在屏幕上显示图像,但是当我尝试移动它们时,我意识到屏幕没有正确更新,使精灵留下痕迹,如下图所示:

如您所见,精灵从左上角开始,并在其路径中一直到右下角留下了痕迹。

一些可以提供帮助的信息:

  1. 我正在使用带有 raspbian 的树莓派。
  2. 我使用的是 SDL 1.2。

我尝试了什么:

  1. 我尝试将SDL_SetVideoMode的最后一个参数改为SDL_HWSURFACE、SDL_SWSURFACE、SDL_DOUBLEBUF、SDL_FULLSCREEN
  2. 我尝试在 SDL_Flip(screen) 和 SDL_UpdateRect(screen, 0, 0, 0, 0) 之间切换;当我更改了 SDL_SetVideoMode 的参数时。

这是我的代码。

#include "SDL.h"

#define SCREEN_WIDTH  640
#define SCREEN_HEIGHT 480

int main ( int argc, char *argv[] )
{
  SDL_Surface *screen, *temp, *sprite;
  SDL_Rect rcSprite;
  SDL_Event event;
  Uint8 *keystate;

  int colorkey, gameover;

  SDL_Init(SDL_INIT_VIDEO);

  // screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_DOUBLEBUF | SDL_FULLSCREEN);
  // screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_HWSURFACE);
  screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_SWSURFACE);

  temp   = SDL_LoadBMP("sprite.bmp");
  sprite = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);

  colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
  SDL_SetColorKey(sprite, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);

  rcSprite.x = 0;
  rcSprite.y = 0;

  gameover = 0;


  while (!gameover)
  {
    if (SDL_PollEvent(&event)) {
      switch (event.type) {

        case SDL_KEYDOWN:
          switch (event.key.keysym.sym) {
            case SDLK_ESCAPE:
              gameover = 1;
              break;
        }
      break;
    }
  }

    keystate = SDL_GetKeyState(NULL);
    if (keystate[SDLK_LEFT] )
      rcSprite.x -= 2;
    if (keystate[SDLK_RIGHT] )
      rcSprite.x += 2;
    if (keystate[SDLK_UP] )
      rcSprite.y -= 2;
    if (keystate[SDLK_DOWN] )
      rcSprite.y += 2;

    SDL_BlitSurface(sprite, NULL, screen, &rcSprite);
    // SDL_Flip(screen);
    SDL_UpdateRect(screen, 0, 0, 0, 0);
  }

  SDL_FreeSurface(sprite);
  SDL_FreeSurface(grass);
  SDL_Quit();

  return 0;
}

我做错了什么?不用说,我对 linux 世界以及 raspberry pi 和 SDL 都很陌生:)

【问题讨论】:

  • 污迹证明它正在重绘,但屏幕没有清除。您只需要使用 SDL_FillRect 清除每一帧的开头。如果您学习 SDL,我建议您从 SDL2 开始。它比 SDL1.* 有许多改进。
  • 你如何在 SDL2 中使用SDL_SetVideoMode()
  • @genpfault 好吧,事实证明我不是。我正在重新阅读设置教程,并且 apt-get 命令指向 1.2。我将编辑我的问题并更新信息。感谢您的提醒。

标签: sdl raspberry-pi


【解决方案1】:

你调用 SDL_SetVideoMode() 不正确,你的代码不应该编译,启用你的编译器警告。

该函数有四个参数:

SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);

所以应该是这样的:

screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32 , SDL_SWSURFACE);
if( !screen )
    //print your warning and exit.

此外,您的屏幕表面永远不会被清除,精灵仍然存在。要么用精灵重绘整个屏幕,要么清除表面

SDL_FillRect( screen , NULL , 0x0 ) ;    //fills the entire surface with 0x0 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多