مقدمه

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

مدیریت رویدادهای کیبورد

Pygame هر بار که یک کلید فشرده می‌شود، یک رویداد KEYDOWN و هر بار که یک کلید رها می‌شود، یک رویداد KEYUP ایجاد می‌کند. ما می‌توانیم در حلقه اصلی بازی به این رویدادها گوش دهیم و بررسی کنیم که کدام کلید فشرده شده است.

ابتدا یک متد جدید به نام _check_events در کلاس AlienInvasion ایجاد می‌کنیم تا منطق مدیریت رویدادها را از حلقه اصلی جدا کنیم.

Copy Icon alien_invasion.py
# In the run_game method:
while True:
    self._check_events()
    # ...

# New method in AlienInvasion class:
def _check_events(self):
    """Respond to keypresses and mouse events."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                # Move the ship to the right.
                self.ship.rect.x += 1

در متد _check_events ما بررسی می‌کنیم که آیا نوع رویداد KEYDOWN است یا خیر. اگر بود، با بررسی event.key می‌توانیم بفهمیم کدام کلید فشرده شده است. در اینجا، اگر کلید جهت‌نمای راست (pygame.K_RIGHT) فشرده شود، ما مختصات x مستطیل سفینه را یک واحد افزایش می‌دهیم.

حرکت مداوم

کد بالا یک مشکل دارد: با هر بار فشردن کلید، سفینه تنها یک پیکسل حرکت می‌کند و برای حرکت مداوم، کاربر باید کلید را مکرراً فشار دهد. برای ایجاد یک حرکت روان و مداوم، ما باید وضعیت حرکت را با یک پرچم (flag) مدیریت کنیم.

ما یک اتریبیوت جدید به نام moving_right به کلاس Ship اضافه می‌کنیم. وقتی کلید راست فشرده می‌شود، این پرچم را True و وقتی رها می‌شود، آن را False می‌کنیم. سپس یک متد update در کلاس Ship ایجاد می‌کنیم که در هر بار تکرار حلقه اصلی بازی، موقعیت سفینه را بر اساس این پرچم به‌روزرسانی کند.

Copy Icon ship.py
# In Ship.__init__():
self.moving_right = False
self.moving_left = False

# New method in Ship class:
def update(self):
    """Update the ship's position based on the movement flag."""
    if self.moving_right:
        self.rect.x += 1
    if self.moving_left:
        self.rect.x -= 1

حالا باید منطق مدیریت رویدادها را در AlienInvasion به‌روزرسانی کنیم تا این پرچم‌ها را کنترل کند و متد update سفینه را فراخوانی کند.

Copy Icon alien_invasion.py
# In _check_events() method:
elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RIGHT:
        self.ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        self.ship.moving_left = True
elif event.type == pygame.KEYUP:
    if event.key == pygame.K_RIGHT:
        self.ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        self.ship.moving_left = False

# In run_game() method, before _update_screen():
self.ship.update()

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

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