Şövalye
Coddy'nin Pygame Journey'sinin Projeler bölümünün bir parçası. Ders 23 / 33.
Şövalye haritadaki P üzerinde başlar.
Resmi tam bir karo boyutundadır: 48'e 48; duvarlar arasındaki boşluklar da öyledir. 48 piksellik bir Rect, boşluğa yalnızca tam piksele hizalandığında sığar. Bu yüzden şövalyenin Rect'i resminden daha küçüktür, 32'ye 32 boyutundadır ve resim bunun ortasına çizilir. Çarpışan Rect'tir; gördüğün ise resimdir.
def draw(image, rect):
screen.blit(image, image.get_rect(center=rect.center))
def cell_rect(col, row):
rect = pygame.Rect(0, 0, 32, 32)
rect.center = (col * TILE + 24, row * TILE + 24)
return rectcell_rect(col, row), bir karonun ortasındaki 32'ye 32 boyutlu Rect'tir. Şövalye de Sky Runner'daki koşucu gibi bir sprite'tır; bir noktada oluşturulur:
class Knight(pygame.sprite.Sprite):
def __init__(self, center):
super().__init__()
self.image = knight_img
self.rect = pygame.Rect(0, 0, 32, 32)
self.rect.center = centerGörev
OrtaŞövalyeyi ilk odaya, P'nin üzerine yerleştir.
drawvecell_rectişlevlerini yukarıya ekle.Roomiçindeself.start = (72, 72)olarak ayarla; birP,self.start = cell_rect(col, row).centerdeğerini ayarlar.- Yukarıdaki
Knightsınıfını yaz ve odadan sonraknight = Knight(room.start)oluştur. - Duvarlardan sonra
draw(knight.image, knight.rect)çağrısını yap.
“Oyna” düğmesine bas: şövalye P'nin üzerinde durur. Ardından “Kontrol et” düğmesine bas.
Kendin dene
import pygame
TILE = 48
MAP = [
"##############",
"#............#",
"#.P......K...#",
"#............#",
"#....##......D",
"#....##......#",
"##.#######.###",
"#............#",
"#...S....H...#",
"##############",
]
pygame.init()
screen = pygame.display.set_mode((672, 480))
pygame.display.set_caption("Rune Keep")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)
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")
door_img = load("dungeon_door.png")
key_img = load("key.png")
slime_img = load("slime.png")
spider_img = load("spider.png")
heart_img = load("heart.png")
empty_img = load("heart_empty.png")
sword_img = load("sword.png")
potion_img = load("potion_red.png")
class Room:
def __init__(self, lines):
self.walls = []
for row, line in enumerate(lines):
for col, char in enumerate(line):
if char == "#":
self.walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
room = Room(MAP)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for row in range(10):
for col in range(14):
screen.blit(floor_img, (col * TILE, row * TILE))
for wall in room.walls:
screen.blit(wall_img, wall)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Projeler bölümündeki tüm dersler
Kendi başına pratik yap: Pygame playground