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.
Aufgabe
Einfach- Setze in
Knight.__init__self.speed = 3. - Schreibe
move(self, keys): Jede Pfeiltaste bewegt das Rechteck umself.speed, danachself.rect.clamp_ip(courtyard). - 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