صنف فرعي
جزء من قسم الكائنات والصور في رحلة 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()، وينفّذ كل كائن نوع التحديث الخاص به.
التحدي
متوسط- اكتب
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame