مقدمه

به فصل چهاردهم خوش آمدید! در این فصل پایانی از پروژه ساخت بازی، ما قابلیت‌های نهایی را برای پولیش کردن و تکمیل آن اضافه خواهیم کرد. در حال حاضر، بازی به محض اجرا شدن شروع می‌شود. ما می‌خواهیم به بازیکن کنترل بیشتری بدهیم و یک دکمه Play اضافه کنیم تا بازی تنها زمانی آغاز شود که کاربر آماده باشد. همچنین، بازی باید پس از اتمام (باختن بازیکن) دوباره قابل شروع باشد.

ایجاد کلاس Button

از آنجایی که Pygame ابزار داخلی برای ساخت دکمه ندارد، ما خودمان یک کلاس Button برای نمایش یک دکمه متنی روی صفحه خواهیم ساخت. یک فایل جدید به نام button.py ایجاد کنید.

Copy Icon button.py
import pygame.font

class Button:
    def __init__(self, ai_game, msg):
        """Initialize button attributes."""
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        
        # Set the dimensions and properties of the button.
        self.width, self.height = 200, 50
        self.button_color = (0, 255, 0)
        self.text_color = (255, 255, 255)
        self.font = pygame.font.SysFont(None, 48)
        
        # Build the button's rect object and center it.
        self.rect = pygame.Rect(0, 0, self.width, self.height)
        self.rect.center = self.screen_rect.center
        
        # The button message needs to be prepped only once.
        self._prep_msg(msg)

    def _prep_msg(self, msg):
        """Turn msg into a rendered image and center text on the button."""
        self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
        self.msg_image_rect = self.msg_image.get_rect()
        self.msg_image_rect.center = self.rect.center

    def draw_button(self):
        # Draw blank button and then draw message.
        self.screen.fill(self.button_color, self.rect)
        self.screen.blit(self.msg_image, self.msg_image_rect)

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

افزودن دکمه به بازی

حالا باید یک نمونه از این دکمه را در AlienInvasion بسازیم و آن را تنها زمانی نمایش دهیم که بازی غیرفعال است.

Copy Icon alien_invasion.py
# In __init__():
self.play_button = Button(self, "Play")

# In _update_screen():
# Draw the play button if the game is inactive.
if not self.game_active:
    self.play_button.draw_button()

ما یک نمونه از Button را در سازنده بازی می‌سازیم. سپس در متد _update_screen بررسی می‌کنیم که آیا بازی فعال است یا خیر. اگر غیرفعال باشد، دکمه Play را ترسیم می‌کنیم.

شروع بازی با کلیک روی دکمه

اکنون باید به کلیک ماوس روی دکمه واکنش نشان دهیم. ما این کار را در متد _check_events انجام خواهیم داد.

Copy Icon alien_invasion.py
# In _check_events():
elif event.type == pygame.MOUSEBUTTONDOWN:
    mouse_pos = pygame.mouse.get_pos()
    self._check_play_button(mouse_pos)

# New method in AlienInvasion class:
def _check_play_button(self, mouse_pos):
    """Start a new game when the player clicks Play."""
    button_clicked = self.play_button.rect.collidepoint(mouse_pos)
    if button_clicked and not self.game_active:
        # Reset the game statistics.
        self.stats.reset_stats()
        self.game_active = True

        # Get rid of any remaining aliens and bullets.
        self.aliens.empty()
        self.bullets.empty()
        
        # Create a new fleet and center the ship.
        self._create_fleet()
        self.ship.center_ship()

ما یک رویداد جدید MOUSEBUTTONDOWN را بررسی می‌کنیم. اگر این رویداد رخ دهد، مختصات ماوس را گرفته و به متد جدید _check_play_button پاس می‌دهیم. این متد با استفاده از collidepoint بررسی می‌کند که آیا کلیک ماوس در محدوده مستطیل دکمه بوده است یا خیر.

اگر روی دکمه کلیک شده باشد و بازی غیرفعال باشد، ما آمار بازی را ریست می‌کنیم، پرچم game_active را True کرده، صفحه را پاک‌سازی و یک ناوگان و سفینه جدید ایجاد می‌کنیم. این کار باعث شروع مجدد بازی می‌شود.

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