2016-04-13 4 views
0
class Pong { 
public: 
    Pong(int speed) { 
     gSpeed = speed; 

     gPongBG = SDL_LoadBMP("pongBG.bmp"); 

     gPongBGSurf = gPongBG; 

     gPongRect.w = 800; 
     gPongRect.h = 460; 
     gPongRect.x = 700; 
     gPongRect.y = 220; 

     gPongPlayer = SDL_LoadBMP("pongPlayer.bmp"); 

     gPongPlayerRect.h = 50; 
     gPongPlayerRect.w = 10; 

     gPongPlayerRect.x = 50; 
     gPongPlayerRect.y = 0; 


    } 

    ~Pong() { 


    } 

    void drawPong() { 
     gPongBGSurf = gPongBG; 
     SDL_BlitSurface(gPongBGSurf, NULL, gScreenSurface, &gPongRect); 
     SDL_BlitSurface(gPongPlayer, NULL, gPongBGSurf, &gPongPlayerRect); 
    } 

    void movePlayer() { 
     gPongPlayerRect.y++; 
    } 

Следующий код делает это так, что gPongPlayerRect делает несколько копий самого себя, а не перемещает его, как я планировал. Позже в коде я обновляю главное окно с именем gWindow, а поверхность главного окна - wScreenSurface. Если я блистал плеер прямо на поверхности окна, он перемещается, поэтому я предполагаю, что проблема в том, что старая поверхность gPongBGSurf остается даже обновленной. Как я могу это исправить? Благодаря!Рисование нескольких экземпляров одного и того же прямоугольника вместо его перемещения

ответ

1

Я думаю, что вы забыли стереть Pong Поверхность:

Uint32 black= SDL_MapRGBA(gPongBGSurf->format,0,0,0,255); 
SDL_FillRect(gPongBGSurf, NULL, black); 
SDL_BlitSurface(gPongPlayer, NULL, gPongBGSurf, &gPongPlayerRect); 
SDL_BlitSurface(gPongBGSurf, NULL, gScreenSurface, &gPongRect); 

Для полного примера SDL2 игры с несколькими поверхностями блиттинг друг на друга, а затем на поверхность экрана, вы можете прочитать небольшой исходный код Rock Dodger CE, который является только одним файлом.

+0

Спасибо! Посмотрю на него, когда я вернусь домой :) –

+0

Как-то это сработало. Я не уверен, как, Джозеф, вам интересно объяснить, как это сделать? :) –

+0

И, gPongBGSurf является фактически файлом bmp ... как я мог перезагрузить картинку вместо этого? –