Menu
CoddyTech

Gehen

Lektion 3 von 20 im Kurs Pygame-Projekt: Verteidige den Bergfried von Coddy.

pygame.key.get_pressed() gibt an, welche Tasten gerade gedrückt gehalten werden. Lies es in jedem Frame aus, und der Ritter läuft so lange, wie eine Pfeiltaste gedrückt gehalten wird, ohne auf Tastenwiederholungen zu warten.

Gib dem Ritter eine speed und eine move-Methode, damit die Regeln für seine Bewegung beim Ritter selbst liegen:

def move(self, keys):
    if keys[pygame.K_LEFT]:
        self.rect.x -= self.speed
    if keys[pygame.K_RIGHT]:
        self.rect.x += self.speed
    self.rect.clamp_ip(courtyard)

Vier separate if-Anweisungen, keine elif-Anweisungen: Werden Up und Right gleichzeitig gedrückt gehalten, läuft der Ritter diagonal.

clamp_ip verschiebt ein Rect zurück in ein anderes Rect, falls es dieses verlassen hat, sodass der Ritter an den Wänden anhält. _ip bedeutet in place: Es ändert self.rect selbst, statt ein neues Rect zurückzugeben.

challenge icon

Aufgabe

Einfach
  1. Setze in Knight.__init__ self.speed = 3.
  2. Schreibe move(self, keys): Jede Pfeiltaste bewegt das Rechteck um self.speed, danach self.rect.clamp_ip(courtyard).
  3. Rufe in der Spielschleife vor dem Zeichnen knight.move(pygame.key.get_pressed()) auf.

Probier es selbst

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")
knight_img = load("knight.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))


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


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


knight = Knight()

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

    screen.blit(background, (0, 0))
    draw(knight.image, knight.rect.center)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Pygame-Projekt: Verteidige den Bergfried

Übe selbstständig: Pygame-Playground