Mantén pulsado para disparar
Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 31 de 36.
Presionar la barra espaciadora para cada disparo cansa los dedos. La mayoría de los juegos de disparos disparan mientras se mantiene presionado el botón, pero un láser en cada fotograma sería un haz continuo. Un tiempo de recarga limita la frecuencia: después de un disparo, el siguiente espera 250 milisegundos.
Recuerda cuándo fue el último disparo y dispara solo cuando se mantenga presionada la barra espaciadora y haya transcurrido suficiente tiempo:
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 = nownow - last_shot indica cuánto tiempo ha pasado desde el último disparo. Asigna last_shot = 0 antes del bucle. Si mantienes presionada la barra espaciadora, ahora se disparan cuatro láseres por segundo, y si la pulsas rápidamente, no se dispara más rápido que eso.
Esto reemplaza el disparo con KEYDOWN: una forma de disparar, con una sola regla.
Desafío
Intermedio- Elimina el disparo de
KEYDOWNdel bucle de eventos. - Establece
last_shot = 0antes del bucle. - En la parte de actualización, mientras mantengas pulsada la barra espaciadora y hayan pasado al menos 250 ms desde
last_shot, dispara un láser y establecelast_shoten el momento actual.
Pruébalo tú mismo
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()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
lasers.add(Laser(player.rect.centerx, player.rect.top))
player.update()
lasers.update()
screen.fill((12, 14, 30))
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