مقدمه

اکنون که ناوگان بیگانگان در حال حرکت است و بازیکن نیز می‌تواند شلیک کند، مرحله بعدی پیاده‌سازی منطق اصلی بازی است: از بین بردن بیگانگان. برای این کار، ما باید برخورد بین گلوله‌ها و بیگانگان را تشخیص دهیم. Pygame ابزارهای بسیار کارآمدی برای تشخیص برخورد بین Spriteها و گروه‌ها فراهم می‌کند که این کار را برای ما بسیار ساده می‌کند.

استفاده از sprite.groupcollide()

تابع pygame.sprite.groupcollide() دو گروه از spriteها را گرفته و آنها را با هم مقایسه می‌کند. این تابع یک دیکشنری برمی‌گرداند که در آن، هر کلید یک sprite از گروه اول است که با یک یا چند sprite از گروه دوم برخورد داشته و مقدار آن، لیستی از spriteهای گروه دوم است که با آن برخورد کرده‌اند.

این تابع همچنین دو آرگومان بولی دیگر نیز می‌پذیرد. این دو آرگومان به ترتیب مشخص می‌کنند که آیا spriteهای برخورد کرده از گروه اول و دوم باید به صورت خودکار از گروه خود حذف شوند یا خیر. ما از این قابلیت برای حذف همزمان گلوله و بیگانه پس از برخورد استفاده خواهیم کرد.

Copy Icon alien_invasion.py
# In _update_bullets method (which you should create from the bullet logic in `run_game`):
def _update_bullets(self):
    """Update position of bullets and get rid of old bullets."""
    self.bullets.update()
    
    # Get rid of bullets that have disappeared.
    for bullet in self.bullets.copy():
        if bullet.rect.bottom <= 0:
            self.bullets.remove(bullet)

    self._check_bullet_alien_collisions()

def _check_bullet_alien_collisions(self):
    """Respond to bullet-alien collisions."""
    # Check for any bullets that have hit aliens.
    # If so, get rid of the bullet and the alien.
    collisions = pygame.sprite.groupcollide(
            self.bullets, self.aliens, True, True)

    if not self.aliens:
        # Destroy existing bullets and create new fleet.
        self.bullets.empty()
        self._create_fleet()

ما منطق به‌روزرسانی گلوله‌ها را به یک متد جداگانه به نام _update_bullets منتقل کرده‌ایم. در داخل این متد، یک متد جدید دیگر به نام _check_bullet_alien_collisions را فراخوانی می‌کنیم.

این متد جدید، قلب منطق برخورد ماست. ما groupcollide را با دو گروه bullets و aliens فراخوانی می‌کنیم. دو آرگومان True به تابع می‌گویند که هم گلوله و هم بیگانه را پس از برخورد، از گروه‌های مربوطه حذف کند.

ایجاد مجدد ناوگان

در کد بالا، ما همچنین بررسی می‌کنیم که آیا گروه aliens خالی شده است یا خیر. اگر تمام بیگانگان از بین رفته باشند، ما باید تمام گلوله‌های باقی‌مانده در صفحه را پاک کرده و با فراخوانی مجدد _create_fleet یک ناوگان جدید ایجاد کنیم تا سطح بعدی بازی شروع شود.

با این تغییرات، بازی ما اکنون کاملاً قابل بازی است! بازیکن می‌تواند به سمت بیگانگان شلیک کرده و آنها را از بین ببرد و با نابود کردن تمام ناوگان، به مرحله بعد برود.

در این درس، با پیاده‌سازی منطق تشخیص برخورد، هسته اصلی گیم‌پلی بازی خود را تکمیل کردیم. یاد گرفتیم که چگونه با استفاده از تابع قدرتمند sprite.groupcollide به صورت کارآمد برخوردها را مدیریت کرده و عناصر بازی را حذف کنیم. در درس پایانی این فصل، به «تکمیل بازی» خواهیم پرداخت و منطق مربوط به پایان یافتن بازی در صورت برخورد بیگانه با سفینه یا رسیدن ناوگان به پایین صفحه را پیاده‌سازی خواهیم کرد.