Menu
CoddyTech

הליכה

שיעור 3 מתוך 20 בקורס פרויקט Pygame: להגן על המצודה של Coddy.

pygame.key.get_pressed() מציינת אילו מקשים לחוצים כרגע. קראו לה בכל פריים, והאביר ילך כל עוד מקש חץ לחוץ, בלי להמתין לחזרות על הקשות.

תנו לאביר speed ומתודת move, כדי שהכללים של אופן הליכתו יהיו חלק מהאביר:

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)

ארבע הוראות if נפרדות, ולא elif: כשהמקשים למעלה ולימינה לחוצים יחד, האביר הולך באלכסון.

clamp_ip מחזירה Rect אל תוך Rect אחר אם הוא יצא ממנו, כך שהאביר נעצר בקירות. המשמעות של _ip היא במקום: היא משנה את self.rect עצמו במקום להחזיר Rect חדש.

challenge icon

אתגר

קל
  1. ב-Knight.__init__ הגדירו את self.speed = 3.
  2. כתבו move(self, keys): כל אחד ממקשי החצים מזיז את המלבן ב-self.speed, ולאחר מכן קוראים ל-self.rect.clamp_ip(courtyard).
  3. בלולאת המשחק, לפני הציור, קראו ל-knight.move(pygame.key.get_pressed()).

נסו בעצמכם

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()

כל השיעורים ביחידה פרויקט Pygame: להגן על המצודה

תרגלו בעצמכם: Pygame אונליין