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 += 10El 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.
Desafío
Intermedio- Añade un
self.maskaLasery aEnemy. - Antes del bucle, establece
score = 0y una fuente de tamaño 32. - Después de las actualizaciones, haz colisionar
enemiesconlasersusandopygame.sprite.collide_mask, eliminando ambos, y suma 10 ascorepor cada enemigo alcanzado. - 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
1Cargar imágenes
Cargar una imagenColocarla con un rectánguloMover la imagenRepetir un fondo en mosaicoPíxeles transparentes4Sprites y grupos
La clase SpriteGruposEliminar con kill()Detectar colisiones con spritecollideGrupo contra grupo7Patrulla estelar
La nave de patrullaDisparar láseres2Girar, voltear y escalar
Girar alrededor del centroApuntar en la dirección del vueloEscalar una imagenGirar desde la imagen original5Colisiones precisas a nivel de píxel
Los rectángulos parecen injustosMáscarasSprites precisos a nivel de píxelHitboxes circulares3Clases para objetos del juego
Tu primera claseMétodosSelf es el objetoUna lista de objetosObjetos con imágenesUna subclase6Animación con hojas de sprites
Recortar una hoja de spritesUn contador de fotogramasAnimar con el tiempoUna explosión de una sola vezPractica por tu cuenta: Playground de Pygame