مقدمه

در این درس، ما ناوگان بیگانگان را به حرکت در می‌آوریم. هدف ما این است که ناوگان به صورت یکپارچه به سمت راست حرکت کند تا به لبه صفحه برسد، سپس کمی به سمت پایین حرکت کرده و جهت خود را به سمت چپ تغییر دهد و این الگو را تکرار کند.

حرکت به سمت راست

ابتدا، منطق حرکت افقی را به کلاس Alien اضافه می‌کنیم. ما یک اتریبیوت fleet_direction در کلاس Settings تعریف می‌کنیم که می‌تواند مقدار 1 (برای حرکت به راست) یا -1 (برای حرکت به چپ) داشته باشد.

Copy Icon alien.py
# In Alien class:
def update(self):
    """Move the alien to the right."""
    self.x += self.settings.alien_speed * self.settings.fleet_direction
    self.rect.x = self.x

سپس در حلقه اصلی بازی، متد update را برای گروه aliens فراخوانی می‌کنیم تا تمام بیگانگان حرکت کنند.

تغییر جهت و حرکت به پایین

اکنون باید بررسی کنیم که آیا هیچ بیگانه‌ای به لبه صفحه رسیده است یا خیر. اگر چنین بود، باید جهت کل ناوگان را تغییر داده و آنها را کمی به سمت پایین حرکت دهیم.

Copy Icon alien_invasion.py
def _update_aliens(self):
    """
    Check if the fleet is at an edge,
      then update the positions of all aliens in the fleet.
    """
    self._check_fleet_edges()
    self.aliens.update()

def _check_fleet_edges(self):
    """Respond appropriately if any aliens have reached an edge."""
    for alien in self.aliens.sprites():
        if alien.check_edges():
            self._change_fleet_direction()
            break

def _change_fleet_direction(self):
    """Drop the entire fleet and change the fleet's direction."""
    for alien in self.aliens.sprites():
        alien.rect.y += self.settings.fleet_drop_speed
    self.settings.fleet_direction *= -1

ما این منطق را در سه متد جداگانه سازماندهی کرده‌ایم. متد _check_fleet_edges روی تمام بیگانگان پیمایش کرده و بررسی می‌کند که آیا به لبه رسیده‌اند یا خیر. اگر حتی یک بیگانه به لبه رسیده باشد، متد _change_fleet_direction فراخوانی می‌شود. این متد تمام ناوگان را به پایین حرکت داده و با ضرب کردن fleet_direction در -1، جهت حرکت را معکوس می‌کند.

کلاس Alien نیز به یک متد check_edges نیاز دارد تا بررسی کند که آیا در لبه صفحه قرار دارد یا نه.

Copy Icon alien.py
# In Alien class:
def check_edges(self):
    """Return true if alien is at edge of screen."""
    screen_rect = self.screen.get_rect()
    if self.rect.right >= screen_rect.right or self.rect.left <= 0:
        return True

در این درس، با افزودن منطق حرکت به کلاس Alien و مدیریت وضعیت ناوگان در کلاس AlienInvasion به دشمنان بازی خود جان بخشیدیم. ناوگان ما اکنون به صورت یکپارچه حرکت کرده و با رسیدن به لبه‌های صفحه، جهت خود را تغییر می‌دهد. در درس بعدی، به سراغ یکی از هیجان‌انگیزترین بخش‌های بازی، یعنی «از بین بردن بیگانگان»، خواهیم رفت و برخورد بین گلوله‌ها و بیگانگان را پیاده‌سازی خواهیم کرد.