Menu
CoddyTech

استمر في إطلاق النار

جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 31 من 36.

إن الضغط على مفتاح المسافة لإطلاق كل طلقة يُتعب الأصابع. تطلق معظم ألعاب إطلاق النار أثناء الضغط على الزر، لكن إطلاق الليزر في كل إطار سيحوّله إلى شعاع متصل. يحدّ زمن التهدئة من معدل الإطلاق: بعد إطلاق طلقة، تنتظر الطلقة التالية 250 ميلي ثانية.

تذكّر وقت إطلاق الطلقة الأخيرة، ولا تطلق إلا عند الضغط على مفتاح المسافة ومرور وقت كافٍ:

keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
    lasers.add(Laser(player.rect.centerx, player.rect.top))
    last_shot = now

تمثّل now - last_shot المدة التي انقضت منذ إطلاق الطلقة الأخيرة. عيّن last_shot = 0 قبل الحلقة. أصبح الضغط المستمر على مفتاح المسافة يطلق أربع طلقات ليزر في الثانية، كما أن النقر عليه بسرعة لا يؤدي إلى إطلاقها بمعدل أسرع من ذلك.

يستبدل هذا طريقة الإطلاق باستخدام KEYDOWN: طريقة واحدة للإطلاق، بقاعدة واحدة.

challenge icon

التحدي

متوسط
  1. أزل إطلاق النار عند KEYDOWN من حلقة الأحداث.
  2. اجعل last_shot = 0 قبل الحلقة.
  3. في جزء التحديث، أطلق شعاعًا ليزريًا أثناء الضغط على مفتاح المسافة وبعد مرور 250 ms على الأقل منذ last_shot، ثم عيّن last_shot إلى الوقت الحالي.

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6
        if keys[pygame.K_RIGHT]:
            self.rect.x += 6
        self.rect.clamp_ip(screen.get_rect())


class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


player = Player()
lasers = pygame.sprite.Group()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            lasers.add(Laser(player.rect.centerx, player.rect.top))

    player.update()
    lasers.update()

    screen.fill((12, 14, 30))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

جميع دروس الكائنات والصور

تدرّب بنفسك: Playground لـ Pygame