Menu
CoddyTech

Vur ve Puan Kazan

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

Lazerlerin düşmanlara karşı kullanılması, groupcollide ile bir grubun başka bir gruba karşı kullanılmasıdır. Lazerin görüntüsü, 48 piksellik bir karenin ortasında bulunan ince bir ışın olduğundan, Rect testi lazerin 20 piksel yana isabet etmesinin bile bir düşmanı yok etmesine izin verir. Görüntüleri maskelerle test et:

hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
    score += 10

Beşinci argüman, spritecollide örneğinde olduğu gibi testtir. Maskelerin her testte değil, bir kez oluşturulması için hem Laser hem de Enemy için self.mask = pygame.mask.from_surface(self.image) tanımla.

hits üzerinde döngü kurmak, yok edilen düşmanları teker teker işler: her biri 10 puan değerindedir. Döngüden önce bir kez oluşturulan font = pygame.font.Font(None, 32) ile puanı sol üstte göster.

challenge icon

Görev

Orta
  1. Laser ve Enemy için bir self.mask tanımla.
  2. Döngüden önce score = 0 değerini ayarla ve boyutu 32 olan bir yazı tipi oluştur.
  3. Güncellemelerden sonra, enemies ile lasers çarpışmalarını pygame.sprite.collide_mask kullanarak denetle, her ikisini de yok et ve isabet alan her düşman için score değerine 10 ekle.
  4. Score: metnini ve puanı (10, 10) konumunda, (240, 240, 240) renginde çiz.

Kendin dene

import random
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()
red_image = pygame.image.load("assets/images/enemy_red.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()


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


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))


player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
spawn_wave(red_image, 6, 2)

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()
    enemies.update()
    for enemy in enemies:
        if enemy.rect.top > 480:
            enemy.kill()

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

pygame.quit()

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

Kendi başına pratik yap: Pygame playground