استمر في إطلاق النار
جزء من قسم الكائنات والصور في رحلة 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: طريقة واحدة للإطلاق، بقاعدة واحدة.
التحدي
متوسط- أزل إطلاق النار عند
KEYDOWNمن حلقة الأحداث. - اجعل
last_shot = 0قبل الحلقة. - في جزء التحديث، أطلق شعاعًا ليزريًا أثناء الضغط على مفتاح المسافة وبعد مرور 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()
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة7دورية النجوم
سفينة الدوريةأطلق أشعة الليزر2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame