Image not showing up on pygame screen

Viewed 280

I am making my own game with pygame for the first time, and I'm using sprites. I'm trying to blit an image onto the screen but it doesn't work. All it shows is a blank white screen. Here is the code:

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)
class SpriteSheet(object):
    def __init__(self, file_name):
        self.sprite_sheet = pygame.image.load(file_name).convert()
    def get_image(self, x, y, width, height):
        image = pygame.Surface([width, height]).convert()
        image.blit(self.sprite_sheet, (0, 0), (x, y, width, height))
        image.set_colorkey(BLACK)
        return image

class Bomb(pygame.sprite.Sprite):
    change_x =0
    change_y = 0
    def __init__(self):
        image = pygame.Surface([256, 256]).convert()
        sprite_sheet = SpriteSheet("Bomb_anim0001.png")
        image = sprite_sheet.get_image(0, 0, 256, 256)

pygame.init()
screen_width = 700
screen_height = 400
screen = pygame.display.set_mode([screen_width, screen_height])
pygame.display.set_caption("Game")
clock = pygame.time.Clock()
done = False
  
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
    
    screen.fill(WHITE)
    bomb  = Bomb()
    clock.tick(60)
    pygame.display.flip()
pygame.quit()

This is the image: Click on this link.

Any help will be highly appreciated. Thanks!

1 Answers

You must blit the image on the screen Surface.

But there is more to be done. Add a rect attribute to the Bomb class:

class Bomb(pygame.sprite.Sprite):
    
    def __init__(self, x, y):
        super().__init__()
        sprite_sheet = SpriteSheet("Bomb_anim0001.png")
        self.image = sprite_sheet.get_image(0, 0, 256, 256)
        self.rect = self.image.get_rect(topleft = (x, y) 
        self.change_x = 0
        self.change_y = 0

Create a pygame.sprite.Group and add the bomb to the Group. draw all the sprites in the Group on the screen:_

bomb  = Bomb(100, 100)
all_sprites = pygame.sprite.Group()
all_sprites.add(bomb)

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
    
    screen.fill(WHITE)
    all_sprites.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

pygame.sprite.Group.draw() and pygame.sprite.Group.update() are methods which are provided by pygame.sprite.Group.

The former delegates the to the update mehtod of the contained pygame.sprite.Sprites - you have to implement the method. See pygame.sprite.Group.update():

Calls the update() method on all Sprites in the Group [...]

The later uses the image and rect attributes of the contained pygame.sprite.Sprites to draw the objects - you have to ensure that the pygame.sprite.Sprites have the required attributes. See pygame.sprite.Group.draw():

Draws the contained Sprites to the Surface argument. This uses the Sprite.image attribute for the source surface, and Sprite.rect. [...]

Related