תת־מחלקה
חלק מהיחידה ספרייטים ותמונות במסלול ה-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.dxclass Zigzag(Enemy) פירושו ש-Zigzag הוא Enemy. יש לו draw בלי שצריך לכתוב אותה. update משלה מחליפה את זו של מחלקת האב, ו-super().update() מריצה קודם את הגרסה של מחלקת האב, כך שלא צריך לכתוב פעמיים את הנפילה והחזרה למעלה. super().__init__(...) עושה אותו דבר לאתחול.
אובייקט Zigzag נכנס לאותה רשימה כמו האחרים: הלולאה קוראת ל-enemy.update() וכל אובייקט מריץ את סוג העדכון שלו.
אתגר
בינוני- כתבו
class Zigzag(Enemy): המתודה__init__שלה קוראת ל־super().__init__(image, x, y)ומגדירה אתself.dx = 3. - המתודה
updateשלה קוראת ל־super().update(), מוסיפה אתself.dxל־self.rect.x, והופכת את הסימן שלself.dxכאשר ה־Rect בולט מעבר לקצה השמאלי או הימני. - הפכו את האויב הצהוב ב־
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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ספרייטים ותמונות
5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין