Menu
CoddyTech

Şövalye

Coddy'nin Pygame Projesi: Kale Avlusunu Savun kursunda ders 2 / 20.

Şövalye bir sprite'tır: görselini self.image içinde, konumunu ise self.rect içinde tutan, pygame.sprite.Sprite tabanlı bir sınıftır.

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

Görsel 48 piksel kare boyutundadır, ancak Rect yalnızca 24 boyutundadır. Canavarların çarpışacağı şey Rect olduğundan, canavarın etrafındaki boş alanın bir köşesine değil, şövalyenin bedenine ulaşması gerekir. Küçük bir çarpışma kutusu oyuncuya adil gelir.

Görsel ile Rect farklı boyutlarda olduğundan, görseli Rect'in merkezine ortalayarak çiz. image.get_rect(center=point), bir noktanın merkezine ortalanmış, görsel boyutlarında bir Rect verir ve blit bunu çizim konumu olarak kabul eder:

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

Görev

Kolay
  1. Şövalyenin resmini yükle: knight_img = load("knight.png").
  2. Yukarıdaki Knight sınıfını yaz: resim olarak knight_img, courtyard.center üzerinde ortalanmış 24'e 24 boyutunda bir rect.
  3. draw(image, center) işlevini yaz.
  4. Döngüden önce knight = Knight() oluştur ve arka planı çizdikten sonra draw(knight.image, knight.rect.center) ile şövalyeyi çiz.

Kendin dene

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

Pygame Projesi: Kale Avlusunu Savun bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground