Menu
CoddyTech

A classe Sprite

Parte da seção Sprites e imagens do Journey de Pygame da Coddy. Lição 16 de 36.

Até agora, todos os objetos do jogo tinham uma imagem, um Rect, um update e uma forma de serem desenhados. pygame tem uma classe criada exatamente para isso: pygame.sprite.Sprite. Seus objetos do jogo se tornam subclasses dela:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6

Três regras. Chame super().__init__() primeiro: isso configura o que a classe Sprite precisa internamente. Nomeie a imagem como self.image e a posição como self.rect, exatamente assim: o próprio código do pygame lê esses dois nomes. Coloque as regras de cada quadro em update.

A imagem da nave é carregada uma vez no início, como ship_image, e a classe a utiliza. Por enquanto, desenhe o sprite com um blit: screen.blit(player.image, player.rect). Na próxima lição, você verá o pygame desenhá-lo.

challenge icon

Desafio

Médio
  1. Escreva class Player(pygame.sprite.Sprite) como acima: self.image é ship_image, self.rect tem o ponto central inferior em (320, 470).
  2. O método update move o Rect 6 pixels para a esquerda ou para a direita usando as setas e o mantém dentro da janela: mova para ele as linhas do código inicial.
  3. Crie player = Player(), chame player.update() a cada quadro e desenhe player.image em player.rect usando blit.

Experimente você mesmo

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Sprite Ship")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship_image.get_rect(midbottom=(320, 470))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 6
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 6
    ship_rect.clamp_ip(screen.get_rect())

    screen.fill((20, 22, 40))
    screen.blit(ship_image, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas as lições de Sprites e imagens

Pratique por conta própria: Playground de Pygame