الإزالة باستخدام kill()
جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 18 من 36.
اضغط على مفتاح المسافة، فستطلق السفينة النار: كل ضغطة تضيف كائنًا مرئيًا من نوع Laser إلى المجموعة lasers، ويعرض العداد في أعلى اليسار عدد الكائنات التي تضمها المجموعة. أطلق بضع طلقات وراقب العداد وهو يرتفع. تطير أشعة الليزر خارج أعلى النافذة ولا تُرى مجددًا، لكن المجموعة تظل تحتفظ بكل واحد منها، وتواصل تحديثها ورسمها جميعًا. بعد بضع دقائق من اللعب، يصبح لديك آلاف من أشعة الليزر غير المرئية.
الكائن المرئي الذي ينتهي دوره يزيل نفسه باستخدام kill():
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()تزيل kill() الكائن المرئي من كل مجموعة ينتمي إليها. ولن يعود يُحدَّث أو يُرسم، وتحرره Python بمجرد ألا يعود أي متغير يشير إليه. اختبر bottom، لا top: يختفي الليزر عندما تغادر آخر بكسل منه النافذة، وليس بينما لا يزال جزء منه ظاهرًا.
تكون sprite.alive() مساويةً لـ True ما دام الكائن المرئي ينتمي إلى مجموعة واحدة على الأقل.
التحدي
سهلفي Laser.update، بعد التحريك، استدعِ self.kill() عندما يكون rect.bottom الخاص بالليزر أعلى من أعلى النافذة (أقل من 0). يجب أن يعود العداد إلى 0 بمجرد مغادرة جميع أشعة الليزر.
جرّب بنفسك
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Lasers")
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()
font = pygame.font.Font(None, 32)
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
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((20, 22, 40))
lasers.draw(screen)
screen.blit(player.image, player.rect)
count = font.render(f"Lasers: {len(lasers)}", True, (240, 240, 240))
screen.blit(count, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame