2014-03-06 22 views
0

我是SDL的初學者,我只是嘗試在SDL中移動精靈。我在屏幕的底部有一個矩形,可以左右移動。但是,當您向左和向右移動精靈時,它會「重複」,當您向左和向右移動播放器時會創建一種跟蹤/蛇遊戲般的效果。有想法該怎麼解決這個嗎?C++ SDL移動播放器「重複」?

///the headers 
#include "stdafx.h" 
#include <SDL.h> 
#include <SDL_image.h> 
#include <string> 
using namespace std; 

//screen attributes 
const int SCREEN_WIDTH = 800; 
const int SCREEN_HEIGHT = 480; 
const int SPRITE_SIZE = 32; 

//the surfaces 
SDL_Surface *image = NULL; 
SDL_Surface *screen = NULL; 

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

int gameover; 

//initiailise sdl 
SDL_Init(SDL_INIT_VIDEO); 

SDL_WM_SetCaption("Pong Move Test", "Pong Move Test"); 
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); 

//load the sprite (paddle) 
temp = SDL_LoadBMP("pongpaddle1.bmp"); 
sprite = SDL_DisplayFormat(temp); 
SDL_FreeSurface(temp); 


//set positions of sprite 
rcSprite.x = 400; 
rcSprite.y = 450; 
gameover = 0; 

//message pump 
while (!gameover) 
{ 
    //look for an event 
    if (SDL_PollEvent(&event)) 
    { 
     switch (event.type) 
     { 
     case SDL_QUIT: 
      gameover = 1; 
      break; 

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

    //handle sprite movement 
    keystate = SDL_GetKeyState(NULL); 
    if (keystate[SDLK_LEFT]) 
    { 
     rcSprite.x -= 1; 
    } 
    if (keystate[SDLK_RIGHT]) 
    { 
     rcSprite.x += 1; 
    } 

    //colide with edges of screen 
    if (rcSprite.x < 0) 
    { 
     rcSprite.x =0; 
    } 
    else if (rcSprite.x > (SCREEN_WIDTH - SPRITE_SIZE)) 
    { 
     rcSprite.x = (SCREEN_WIDTH - SPRITE_SIZE); 
    } 


    //draw the sprite 

    SDL_BlitSurface(sprite, NULL, screen, &rcSprite); 

    //update the screen 
    SDL_UpdateRect(screen, 0, 0, 0, 0); 



} 

//clean up area 
SDL_FreeSurface(sprite); 
SDL_Quit(); 


return 0; 

}

回答

1

您還沒有清除繪製每個幀之前的屏幕,所以你實際上是在畫前一幀,這就是爲什麼你會得到一個「尾」效應。

您可在繪製每一幀之前使用SDL_FillRect與背景顏色填充整個屏幕解決這個問題:

SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); 
+0

啊我明白了,謝謝您的幫助! – Tom