Menu
CoddyTech

Tembak dan Raih Skor

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 33 dari 36.

Laser melawan musuh adalah satu grup melawan grup lain, dengan groupcollide. Gambar laser berupa baut tipis di tengah persegi berukuran 48 piksel, jadi pengujian Rect akan membuat laser yang berjarak 20 piksel di samping musuh menghancurkannya. Uji gambar dengan mask:

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

Argumen kelima adalah pengujian, seperti pada spritecollide. Beri Laser dan Enemy masing-masing self.mask = pygame.mask.from_surface(self.image), agar mask dibuat sekali, bukan pada setiap pengujian.

Melakukan perulangan pada hits akan menelusuri musuh yang dihancurkan, satu per satu: masing-masing bernilai 10 poin. Tampilkan skor di kiri atas dengan font = pygame.font.Font(None, 32), yang dibuat sekali sebelum perulangan.

challenge icon

Tantangan

Sedang
  1. Beri Laser dan Enemy self.mask.
  2. Buat score = 0 dan font berukuran 32 sebelum perulangan.
  3. Setelah pembaruan, deteksi tabrakan antara enemies dan lasers menggunakan pygame.sprite.collide_mask, hapus keduanya, lalu tambahkan 10 ke score untuk setiap musuh yang terkena.
  4. Gambar Score: dan skor di (10, 10), dengan warna (240, 240, 240).

Coba sendiri

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

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame