Tom
Tom

Reputation: 2472

C++ SDL Movement Player "duplication"?

I'm a beginner in SDL and I am simply experimenting with movement of sprites in SDL. I have a rectangle at the bottom of the screen that you can move left and right. However, when you move the sprite left and right, it "duplicates", creating a sort of trace/snake-game-like effect when you move the player left and right. Any ideas on how to fix this?

///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;

}

Upvotes: 0

Views: 274

Answers (1)

Collin Dauphinee
Collin Dauphinee

Reputation: 13993

You aren't clearing the screen before drawing each frame, so you're actually drawing over the previous frame, which is why you get a 'trailing' effect.

You can solve this by using SDL_FillRect to fill the entire screen with a background color before drawing each frame:

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

Upvotes: 1

Related Questions