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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الكائنات والصور

تدرّب بنفسك: Playground لـ Pygame