Objetos com imagens
Parte da seção Sprites e imagens do Journey de Pygame da Coddy. Lição 14 de 36.
Os inimigos são imagens que se movem em Rects, e o código inicial mantém três Rects e faz três blits manualmente. Uma classe pode armazenar uma imagem e seu Rect juntos:
class Enemy:
def __init__(self, image, x, y):
self.image = image
self.rect = image.get_rect(center=(x, y))
self.speed = 2
def update(self):
self.rect.y += self.speed
if self.rect.top > 480:
self.rect.bottom = 0
def draw(self, screen):
screen.blit(self.image, self.rect)A imagem é passada como argumento, não carregada em __init__. Carregue cada arquivo uma vez no início e passe a mesma Surface para todos os inimigos que a usam: dez inimigos vermelhos compartilham a mesma imagem vermelha. Cada inimigo recebe seu próprio Rect, porém, então cada um se move por conta própria.
Mover o inimigo é mover seu Rect, e desenhá-lo é fazer blit da imagem na posição do Rect: esses são os dois atributos que todo objeto do jogo nesta seção tem.
Desafio
Médio- Escreva a classe
Enemycom__init__(self, image, x, y),update(self)edraw(self, screen), como acima: o Rect centralizado em (x, y), movendo-se para baixo 2 pixels por quadro e voltando para cima do topo quando estiver abaixo da janela. - Crie
enemies, uma lista com três inimigos: o vermelho centralizado em (160, 100), o verde em (320, 100) e o amarelo em (480, 100). - Atualize e desenhe cada inimigo da lista; remova os três Rects.
Experimente você mesmo
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Rain")
clock = pygame.time.Clock()
red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()
red_rect = red.get_rect(center=(160, 100))
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for rect in (red_rect, green_rect, yellow_rect):
rect.y += 2
if rect.top > 480:
rect.bottom = 0
screen.fill((20, 22, 40))
screen.blit(red, red_rect)
screen.blit(green, green_rect)
screen.blit(yellow, yellow_rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Todas as lições de Sprites e imagens
1Carregando imagens
Carregue uma imagemPosicione-a com um RectMova a imagemLadrilhe o plano de fundoPixels transparentes2Girar, Inverter, Redimensionar
Girar em torno do centroFicar de frente para a direção do vooRedimensionar uma imagemGirar a partir do original3Classes para Objetos de Jogos
Sua primeira classeMétodosSelf é o objetoUma lista de objetosObjetos com imagensUma subclasse6Animação com Sprite Sheets
Recorte uma Sprite SheetUm contador de quadrosAnime com o tempoUma explosão de disparo únicoPratique por conta própria: Playground de Pygame