האביר
חלק מהיחידה פרויקטים במסלול ה-Pygame של Coddy. שיעור 23 מתוך 33.
האביר מתחיל על ה־P שבמפה.
התמונה שלו תופסת אריח שלם, 48 על 48, וכך גם הרווחים בין הקירות. מלבן Rect בגודל 48 פיקסלים יתאים לרווח רק כשהוא מיושר לפיקסל המדויק. לכן ה־Rect של האביר קטן מהתמונה שלו, 32 על 32, והתמונה מצוירת במרכזו. ה־Rect הוא זה שמתנגש; התמונה היא מה שרואים.
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) הוא Rect בגודל 32 על 32 במרכז אריח. האביר הוא ספרייט, כמו הרץ של Sky Runner, שנוצר בנקודה:
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 = centerאתגר
בינוניהצב את האביר בחדר הראשון, כשהוא עומד על P.
- הוסף את הפונקציות
drawו־cell_rectלמעלה. - ב־
Room, הגדרself.start = (72, 72); Pמגדיר אתself.start = cell_rect(col, row).center. - כתוב את המחלקה
Knightלמעלה, וצורknight = Knight(room.start)אחרי החדר. - אחרי הקירות, קרא ל־
draw(knight.image, knight.rect).
לחץ על "שחק": האביר עומד על P. לאחר מכן לחץ על "בדיקה".
נסו בעצמכם
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()
כל השיעורים ביחידה פרויקטים
תרגלו בעצמכם: Pygame אונליין