【发布时间】:2013-12-19 10:43:11
【问题描述】:
我最近开始使用 SDL 进行编程,并且一直在关注有关 gamedevgeek 和lazyfoo 的一些教程。我必须在屏幕上显示图像,但是当我尝试移动它们时,我意识到屏幕没有正确更新,使精灵留下痕迹,如下图所示:
如您所见,精灵从左上角开始,并在其路径中一直到右下角留下了痕迹。
一些可以提供帮助的信息:
- 我正在使用带有 raspbian 的树莓派。
- 我使用的是 SDL 1.2。
我尝试了什么:
- 我尝试将SDL_SetVideoMode的最后一个参数改为SDL_HWSURFACE、SDL_SWSURFACE、SDL_DOUBLEBUF、SDL_FULLSCREEN
- 我尝试在 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