简体   繁体   中英

Image not showing up on pygame screen

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!

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 apygame.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.Sprite s - 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.Sprite s to draw the objects - you have to ensure that the pygame.sprite.Sprite s 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 . [...]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM