Menu
CoddyTech

תת־מחלקה

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

יש אויבים שצריכים לנוע בזיגזג. הם נופלים כמו האחרים וגם מחליקים לצדדים, ומשנים כיוון בקצות החלון. העתקת כל מחלקת Enemy כדי לשנות מתודה אחת תצריך לתקן כל באג פעמיים. מחלקת משנה יורשת את כל מה שיש במחלקת האב ומשנה רק את מה ששונה:

class Zigzag(Enemy):
    def __init__(self, image, x, y):
        super().__init__(image, x, y)
        self.dx = 3

    def update(self):
        super().update()
        self.rect.x += self.dx
        if self.rect.left < 0 or self.rect.right > 640:
            self.dx = -self.dx

class Zigzag(Enemy) פירושו ש-Zigzag הוא Enemy. יש לו draw בלי שצריך לכתוב אותה. update משלה מחליפה את זו של מחלקת האב, ו-super().update() מריצה קודם את הגרסה של מחלקת האב, כך שלא צריך לכתוב פעמיים את הנפילה והחזרה למעלה. super().__init__(...) עושה אותו דבר לאתחול.

אובייקט Zigzag נכנס לאותה רשימה כמו האחרים: הלולאה קוראת ל-enemy.update() וכל אובייקט מריץ את סוג העדכון שלו.

challenge icon

אתגר

בינוני
  1. כתבו class Zigzag(Enemy): המתודה __init__ שלה קוראת ל־super().__init__(image, x, y) ומגדירה את self.dx = 3.
  2. המתודה update שלה קוראת ל־super().update(), מוסיפה את self.dx ל־self.rect.x, והופכת את הסימן של self.dx כאשר ה־Rect בולט מעבר לקצה השמאלי או הימני.
  3. הפכו את האויב הצהוב ב־enemies ל־Zigzag; האויבים האדום והירוק נשארים Enemy.

נסו בעצמכם

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

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)


enemies = [Enemy(red, 160, 100), Enemy(green, 320, 100), Enemy(yellow, 480, 100)]

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

    for enemy in enemies:
        enemy.update()

    screen.fill((20, 22, 40))
    for enemy in enemies:
        enemy.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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