Menu
CoddyTech

Düşmanlar Geliyor

Coddy'nin Pygame Journey'sinin Sprite'lar ve Görseller bölümünün bir parçası. Ders 32 / 36.

Şimdi düşmanlar. Bir Enemy sprite'ı oluşturulduğunda görselini ve hızını alır, böylece tek bir sınıf her türü çizebilir:

class Enemy(pygame.sprite.Sprite):
    def __init__(self, image, x, y, speed):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = speed

    def update(self):
        self.rect.y += self.speed

Bir dalga, pencerenin üstünde sıraya dizilmiş birkaç düşmandan oluşur; böylece her biri bir öncekinden 120 piksel yukarıda ve rastgele bir x konumunda olacak şekilde art arda gelirler:

def spawn_wave(image, count, speed):
    for i in range(count):
        x = random.randint(40, 600)
        enemies.add(Enemy(image, x, -40 - i * 120, speed))

İlki y = -40 konumunda ortalanır, sonraki -160 konumunda olur ve böyle devam eder: başlangıçta hepsi görünüm alanının dışındadır. Bir işlev dalgayı tek bir yerde tutar; önceki ders bunu her dalga için çağırır.

Alt kenarı geçip düşen bir düşman kaldırılmalıdır. Ana döngüde, enemies.update() çağrısından sonra üst kenarı 480'i geçmiş olan tüm düşmanları öldür. Daha sonra bu bir cana mal olacak.

challenge icon

Görev

Orta
  1. import random ekleyin, enemy_red.png dosyasını red_image içine yükleyin ve Enemy ile spawn_wave yazın.
  2. enemies = pygame.sprite.Group() oluşturun, ardından spawn_wave(red_image, 6, 2) çağırın.
  3. Her karede düşmanları güncelleyin, rect.top değeri 480'i aşanları yok edin ve onları lazerlerden önce çizin.

Kendin dene

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()
last_shot = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    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
    lasers.update()

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

pygame.quit()
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Sprite'lar ve Görseller bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground