Menu
CoddyTech

Acertar y sumar puntos

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 33 de 36.

Los láseres contra los enemigos forman un grupo contra otro grupo, con groupcollide. La imagen de un láser es un rayo delgado en el centro de un cuadrado de 48 píxeles, así que una prueba con Rect permitiría que un láser situado a 20 píxeles de distancia destruyera a un enemigo. Comprueba las imágenes con máscaras:

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

El quinto argumento es la prueba, igual que con spritecollide. Asigna a cada Laser y Enemy un self.mask = pygame.mask.from_surface(self.image) para que las máscaras se creen una sola vez, no en cada prueba.

Recorrer hits pasa por los enemigos destruidos, uno por uno: cada uno vale 10 puntos. Muestra la puntuación en la esquina superior izquierda con font = pygame.font.Font(None, 32), creado una sola vez antes del bucle.

challenge icon

Desafío

Intermedio
  1. Añade un self.mask a Laser y a Enemy.
  2. Antes del bucle, establece score = 0 y una fuente de tamaño 32.
  3. Después de las actualizaciones, haz colisionar enemies con lasers usando pygame.sprite.collide_mask, eliminando ambos, y suma 10 a score por cada enemigo alcanzado.
  4. Dibuja Score: y la puntuación en (10, 10), en (240, 240, 240).

Pruébalo tú mismo

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

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame