Don't use Repaint, Invalidate, etc. They will always cause some serious flickering and they're not intended for just erasing the background of a canvas either.

To properly erase the background, try this:

[pascal]
with Canvas do
begin
Pen.Color := Form1.Color;
Brush.Color := Form1.Color;
Rectangle(ClipRect);
end;
[/pascal]

To completely avoid flickering, draw everything on a buffer first and then draw it onto the canvas. Example:

[pascal]
var
Buffer: TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
Buffer := TBitmap.Create;
Buffer.Width := Form1.ClientWidth;
Buffer.Height := Form1.ClientHeight;
end;

procedure TForm1.FormClose(Sender: TObject);
begin
Buffer.Free;
end;

procedure TForm1.DrawMyStuff;
begin
with Buffer.Canvas do
begin
Pen.Color := clRed;
Brush.Color := clRed;
Rectangle(ClipRect);
Draw(PlayerX, PlayerY, Image1.Picture.Bitmap);
end;

// Flip the buffer onto the screen
Form1.Canvas.Draw(0, 0, Buffer);
end;

procedure TForm1.FormKeyDown(....);
begin
if Key = VK_LEFT then
PlayerX := PlayerX - 1
...
DrawMyStuff;
end;
[/pascal]

If you choose to draw directly onto the form canvas instead of the canvas of paint box, you should also handle the OnPaint event. Otherwise the stuff you draw onto the canvas will get lost when someone drags another window over yours.