مقدمه
به فصل سیزدهم خوش آمدید! در این فصل، ما دشمنان بازی، یعنی بیگانگان، را به بازی اضافه خواهیم کرد.
هدف ما ایجاد یک ناوگان کامل از بیگانگان است که در بالای صفحه در یک شبکه منظم قرار میگیرند. این
فرآیند شامل ایجاد یک کلاس جدید برای بیگانگان و نوشتن منطقی برای محاسبه و قرار دادن آنها در
موقعیتهای صحیح است.
کلاس Alien
مانند سفینه و گلولهها، ما تمام منطق مربوط به یک بیگانه را در کلاس خودش کپسولهسازی میکنیم. یک
فایل جدید به نام alien.py ایجاد کنید. این کلاس بسیار شبیه به کلاس Ship خواهد بود.
alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""A class to represent a single alien in the fleet."""
def __init__(self, ai_game):
"""Initialize the alien and set its starting position."""
super().__init__()
self.screen = ai_game.screen
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
این کلاس یک تصویر بیگانه را بارگذاری کرده و rect آن را تنظیم میکند. ما موقعیت اولیه هر بیگانه
را در نزدیکی گوشه بالا و چپ صفحه قرار میدهیم.
ایجاد ناوگان
اکنون باید منطقی را بنویسیم که یک ردیف کامل از بیگانگان را ایجاد کند و سپس این کار را برای ایجاد
چندین ردیف تکرار کند تا یک ناوگان کامل تشکیل شود. ما این منطق را در کلاس AlienInvasion
پیادهسازی خواهیم کرد.
محاسبه تعداد بیگانگان در یک ردیف
برای این کار، ما به عرض صفحه و عرض یک بیگانه نیاز داریم. ما فضایی را برای هر بیگانه در نظر
میگیریم که برابر با دو برابر عرض آن است (یک عرض برای خود بیگانه و یک عرض برای فضای خالی سمت
راست).
alien_invasion.py
self.aliens = pygame.sprite.Group()
self._create_fleet()
def _create_fleet(self):
"""Create the fleet of aliens."""
alien = Alien(self)
alien_width, alien_height = alien.rect.size
available_space_x = self.settings.screen_width - (2 * alien_width)
number_aliens_x = available_space_x // (2 * alien_width)
ship_height = self.ship.rect.height
available_space_y = (self.settings.screen_height -
(3 * alien_height) - ship_height)
number_rows = available_space_y // (2 * alien_height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
self._create_alien(alien_number, row_number)
def _create_alien(self, alien_number, row_number):
"""Create an alien and place it in the row."""
alien = Alien(self)
alien_width, alien_height = alien.rect.size
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
self.aliens.add(alien)
در متد _create_fleet ما ابتدا یک نمونه موقت از Alien میسازیم تا ابعاد آن را به دست
آوریم. سپس فضای افقی و عمودی موجود را محاسبه کرده و بر اساس آن، تعداد بیگانگان در هر ردیف و
تعداد کل ردیفها را تعیین میکنیم.
در نهایت، با استفاده از دو حلقه تودرتو، روی تمام ردیفها و ستونها پیمایش کرده و در هر موقعیت،
با فراخوانی متد کمکی _create_alien یک بیگانه جدید ساخته و آن را به گروه aliens اضافه
میکنیم.
نمایش ناوگان
آخرین قدم، ترسیم تمام بیگانگان روی صفحه است. ما این کار را با فراخوانی متد draw روی گروه
aliens در متد _update_screen انجام میدهیم.
alien_invasion.py
self.aliens.draw(self.screen)
متد draw روی یک گروه، به صورت خودکار متد draw را برای هر Sprite داخل آن گروه فراخوانی
میکند. این یک راه بسیار کارآمد برای ترسیم تمام عناصر یک گروه است.
اکنون با اجرای بازی، باید یک ناوگان کامل از بیگانگان را در بالای صفحه مشاهده کنید. در این درس،
ما با موفقیت دشمنان بازی را به صحنه اضافه کردیم. با ایجاد یک کلاس Alien و نوشتن منطقی برای
ایجاد یک شبکه منظم، ساختار اصلی بازی خود را تکمیل کردیم. در درس بعدی، به سراغ «حرکت ناوگان»
خواهیم رفت و به بیگانگان جان خواهیم بخشید تا به سمت پایین و طرفین حرکت کنند.