2

I've been trying to make a game in Python but when I move my character it leaves a trail behind. I know it doesn't show that much but if you get close you can see the trail and it really bothers me.

Screenshot

Here's my code:

import pygame
import os
from pygame import mixer

pygame.init()
mixer.init()

width = 800
height = 600

black = (0,0,0)
white = (255,255,255)

ship_width = 56
ship_height = 64

disp = pygame.display.set_mode((width,height))

pygame.display.set_caption("space_game")

clock = pygame.time.Clock()

background = pygame.image.load(os.path.join("Backgrounds", "Space.png"))

Ship00 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship00.png"))
Ship01 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship01.png"))
Ship02 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship02.png"))
Ship03 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship03.png"))
Ship04 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship04.png"))
Ship05 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship05.png"))
Ship06 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship06.png"))
Ship07 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship07.png"))
Ship08 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship08.png"))
Ship09 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship09.png"))
Ship10 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship10.png"))
Ship11 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship11.png"))
Ship12 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship12.png"))
Ship13 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship13.png"))
Ship14 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship14.png"))
Ship15 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship15.png"))
Ship16 = pygame.image.load(os.path.join("Images", "Animations", "Ship 
Animation", "Ship16.png"))

images = [Ship00, Ship01, Ship02, Ship03, Ship04, Ship05, Ship06, Ship07, 
Ship08, Ship09, Ship10, Ship11, Ship12, Ship13, Ship14, Ship15, Ship16]

mixer.music.load(os.path.join("Music", "space_song.wav"))
mixer.music.play()

def gameLoop():
    x = (width * 0.45)
    y = (height * 0.8)

    x_ch = 0
    y_ch = 0

    x_bg = 0

    index = 0

    gameExit = False

    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True

            if event.type == pygame.KEYDOWN:
                if event.key == ord("a"):
                    x_ch = -5

                elif event.key == ord("d"):
                    x_ch = 5

                elif event.key == ord("w"):
                    y_ch = -5

                elif event.key == ord("s"):
                    y_ch = 5

            if event.type == pygame.KEYUP:
                if event.key == ord("a") or event.key == ord("d"):
                    x_ch = 0

                if event.key == ord("w") or event.key == ord("s"):
                    y_ch = 0

        x += x_ch
        y += y_ch

        if x > width - ship_width or x < 0:
            x_ch = 0

        if y > height - ship_height or y < 0:
            y_ch = 0

        x_loop = x_bg % background.get_rect().height
        disp.blit(background, (0, x_loop - background.get_rect().height))

        if x_loop < height:
            disp.blit(background, (0, x_loop))

        x_bg += 5

        index += 1
        index %= len(images)
        current_image = images[index]
        disp.blit(current_image, (x,y))

        pygame.display.update()

        clock.tick(60)

gameLoop()
pygame.quit()
quit()

How can I fix this? (I know the trail is almost invisible but I want my game to be good) I have a background that is moving down in a loop why doesn't the trail move with it?

Eren Biçer
  • 171
  • 3
  • 10

3 Answers3

6

Before you flip the display you need to blit the background. This will 'erase' the trail. Then draw the current image and flip the display.

    disp.blit(background, (0,0)) # or whatever location you need
    disp.blit(current_image, (x,y))
    pygame.display.flip()
DinosauRuss
  • 146
  • 3
  • when i do this my background does not go down in a loop it just stays and there is still trail. i have a moving background that goes down – Eren Biçer Jun 21 '17 at 21:12
  • Change the (0,0) in 'disp.blit(background, (0,0))' to the x_loop location. Does you background image have transparency? You may need to fill the screen with a solid color first using disp.fill((0,0,0)) – DinosauRuss Jun 21 '17 at 21:17
2

This is a complete solution with a scrolling background:

import pygame

pygame.init()
width = 800
height = 600
black = (0, 0, 0)
white = (255, 255, 255)
ship_width = 56
ship_height = 64
disp = pygame.display.set_mode((width, height))
pygame.display.set_caption("space_game")
clock = pygame.time.Clock()
background = pygame.image.load('background.png')
background_height = background.get_rect().height
ship = pygame.image.load('ship.png')

def game_loop():
    x = width * 0.45
    y = height * 0.80
    x_ch = 0
    y_ch = 0
    x_bg = 0
    game_exit = False
    while not game_exit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_exit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    x_ch = -5
                if event.key == pygame.K_d:
                    x_ch = 5
                if event.key == pygame.K_w:
                    y_ch = -5
                if event.key == pygame.K_s:
                    y_ch = 5
                if (event.key == pygame.K_ESCAPE) or (event.key == pygame.K_q):
                    game_exit = True
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_a or event.key == pygame.K_d:
                    x_ch = 0
                if event.key == pygame.K_w or event.key == pygame.K_s:
                    y_ch = 0
        if (x + x_ch) > width - ship_width or (x + x_ch) < 0:
            x_ch = 0
        if (y + y_ch) > height - ship_height or (y + y_ch) < 0:
            y_ch = 0
        x += x_ch
        y += y_ch
        x_loop = x_bg % background_height
        disp.blit(background, (0, x_loop - background_height))
        if x_loop < height:
            disp.blit(background, (0, x_loop))
        x_bg += 5
        disp.blit(ship, (x, y))
        pygame.display.update()
        clock.tick(60)

game_loop()
pygame.quit()

The result:

space_game.gif

A ship with transparent background:

ship.png

The starry background:

background.png

I am posting this answer in case someone needs a working example as a starting point.

-2

I think you're missing a pygame.display.flip(). Add it after your pygame.display.update() line.

Sam Chats
  • 2,271
  • 1
  • 12
  • 34