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.centerGambarnya 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))Tantangan
Mudah- Muat gambar kesatria:
knight_img = load("knight.png"). - Tulis class
Knightdi atas: gambarknight_img, danrectberukuran 24 kali 24 yang dipusatkan padacourtyard.center. - Tulis fungsi
draw(image, center). - Sebelum loop, buat
knight = Knight(), lalu gambar setelah background dengandraw(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