Menu
CoddyTech

אובייקטים עם תמונות

חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 14 מתוך 36.

האויבים הם תמונות שנעות על גבי Rects, וקוד ההתחלה שומר שלושה Rects ומבצע שלוש פעולות blit ידנית. מחלקה יכולה להכיל תמונה ואת ה־Rect שלה יחד:

class Enemy:
    def __init__(self, image, x, y):
        self.image = image
        self.rect = image.get_rect(center=(x, y))
        self.speed = 2

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > 480:
            self.rect.bottom = 0

    def draw(self, screen):
        screen.blit(self.image, self.rect)

התמונה מועברת פנימה, ולא נטענת בתוך __init__. טענו כל קובץ פעם אחת בחלק העליון, והעבירו את אותו Surface לכל אויב שמשתמש בו: עשרה אויבים אדומים חולקים תמונה אדומה אחת. עם זאת, לכל אויב יש Rect משלו, כך שכל אחד נע בפני עצמו.

הזזת האויב פירושה הזזת ה־Rect שלו, וציורו פירושו ביצוע blit של התמונה שלו במיקום ה־Rect: אלה שני המאפיינים שיש לכל אובייקט משחק ביחידה הזאת.

challenge icon

אתגר

בינוני
  1. כתבו את המחלקה Enemy עם __init__(self, image, x, y), update(self) ו־draw(self, screen), כמו למעלה: ה־Rect ממורכז ב־(x, y), נע למטה 2 פיקסלים בכל פריים, וחוזר למעלה מעל הקצה העליון ברגע שהוא נמצא מתחת לחלון.
  2. צרו את enemies, רשימה של שלושה אויבים: האדום ממורכז ב־(160, 100), הירוק ב־(320, 100), והצהוב ב־(480, 100).
  3. עדכנו וציירו כל אויב ברשימה; הסירו את שלושת ה־Rect.

נסו בעצמכם

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Rain")
clock = pygame.time.Clock()

red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()

red_rect = red.get_rect(center=(160, 100))
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for rect in (red_rect, green_rect, yellow_rect):
        rect.y += 2
        if rect.top > 480:
            rect.bottom = 0

    screen.fill((20, 22, 40))
    screen.blit(red, red_rect)
    screen.blit(green, green_rect)
    screen.blit(yellow, yellow_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

כל השיעורים ביחידה ספרייטים ותמונות

תרגלו בעצמכם: Pygame אונליין