Menu
CoddyTech

Ksatria

Pelajaran 2 dari 20 dalam kursus Proyek Pygame: Pertahankan Benteng di Coddy.

Ksatria adalah sprite: class yang dibuat berdasarkan pygame.sprite.Sprite dan menyimpan gambarnya di self.image serta posisinya di 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

Gambarnya berukuran 48 piksel persegi, tetapi Rect hanya berukuran 24. Monster akan bertabrakan dengan Rect, jadi monster harus mencapai tubuh ksatria, bukan sudut ruang kosong di sekitarnya. Hitbox kecil terasa adil bagi pemain.

Karena gambar dan Rect memiliki ukuran berbeda, gambar harus digambar dengan titik tengahnya sejajar dengan titik tengah Rect. image.get_rect(center=point) menghasilkan Rect sebesar gambar yang titik tengahnya berada pada suatu titik, dan blit menerimanya sebagai posisi untuk menggambar:

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

Tantangan

Mudah
  1. Muat gambar kesatria: knight_img = load("knight.png").
  2. Tulis class Knight di atas: gambar knight_img, dan rect berukuran 24 kali 24 yang dipusatkan pada courtyard.center.
  3. Tulis fungsi draw(image, center).
  4. Sebelum loop, buat knight = Knight(), lalu gambar setelah background dengan draw(knight.image, knight.rect.center).

Coba sendiri

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

Semua pelajaran di Proyek Pygame: Pertahankan Benteng

Latihan sendiri: Playground Pygame