Menu
CoddyTech

كائنات مع صور

جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 14 من 36.

الأعداء صور تتحرك على كائنات Rect، والشيفرة الابتدائية تحتفظ بثلاثة كائنات Rect وثلاث عمليات 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()

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

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