Menu
CoddyTech

El caballero

Lección 2 de 20 del curso Proyecto con Pygame: Defiende la fortaleza de Coddy.

El caballero es un sprite: una clase basada en pygame.sprite.Sprite que guarda su imagen en self.image y su posición en self.rect.

class Knight(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = knight_img
        self.rect = pygame.Rect(0, 0, 24, 24)
        self.rect.center = courtyard.center

La imagen mide 48 píxeles por lado, pero el Rect mide solo 24. Los monstruos chocarán con el Rect, así que un monstruo tiene que llegar al cuerpo del caballero, no a una esquina del espacio vacío que lo rodea. Una caja de colisión pequeña le parece justa al jugador.

Como la imagen y el Rect tienen tamaños distintos, dibuja la imagen centrada en el centro del Rect. image.get_rect(center=point) devuelve un Rect del tamaño de la imagen, centrado en un punto, y blit lo acepta como la posición donde dibujar:

def draw(image, center):
    screen.blit(image, image.get_rect(center=center))
challenge icon

Desafío

Fácil
  1. Carga la imagen del caballero: knight_img = load("knight.png").
  2. Escribe la clase Knight de arriba: imagen knight_img, un rect de 24 por 24 centrado en courtyard.center.
  3. Escribe la función draw(image, center).
  4. Antes del bucle, crea knight = Knight() y, después de dibujar el fondo, dibújalo con draw(knight.image, knight.rect.center).

Pruébalo tú mismo

import pygame

WIDTH, HEIGHT = 720, 480
TILE = 48

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Hold the Keep")
clock = pygame.time.Clock()


def load(name):
    return pygame.image.load("assets/images/" + name).convert_alpha()


floor_img = load("floor.png")
wall_img = load("wall.png")

courtyard = pygame.Rect(TILE, TILE, WIDTH - 2 * TILE, HEIGHT - 2 * TILE)
background = pygame.Surface((WIDTH, HEIGHT))
for row in range(HEIGHT // TILE):
    for col in range(WIDTH // TILE):
        x = col * TILE
        y = row * TILE
        if courtyard.collidepoint(x, y):
            background.blit(floor_img, (x, y))
        else:
            background.blit(wall_img, (x, y))



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

    screen.blit(background, (0, 0))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas las lecciones de Proyecto con Pygame: Defiende la fortaleza

Practica por tu cuenta: Playground de Pygame