Pygame: problems with shooting in Space Invaders

You have to create a list of bullets:

bullet_list = []

Add a new bullet position to the list when SPACE is pressed:

elif event.key == pygame.K_SPACE:
    bullet_list.append([x + 15, y - 20])

Move and draw the bullets in the list in a loop:

for bullet in bullet_list:
    pygame.draw.rect(screen, (250, 250, 0),
                        [*bullet, height_rect, width_rect])
    bullet[1] -= 5

Delete a bullet from the list if the y-coordinate is less than 0:

for bullet in bullet_list[:]:
    if bullet[1] < 0:
        bullet_list.remove(bullet)

Complete example:

import pygame

pygame.init()

screen_size = (500, 500)
ship_size = (50, 50)
x, y = 250, 450
x_rect, y_rect = x + 15, y - 20
height_rect, width_rect = 20, 20
vel = 50
bullet_list = []

"""Loads screen and set gives it a title."""
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption("Space Invaders")

"""Initializes images for the game and resizes them."""
space_ship = pygame.image.load("Space Invaders Ship.jpg")
space_ship = pygame.transform.scale(space_ship, ship_size)
space = pygame.image.load("Space.jpg")
space = pygame.transform.scale(space, screen_size)

clock = pygame.time.Clock()
run = True
while run:
    """Controls the fps."""
    clock.tick(60)

    """Registers keyboard's input."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and x > 0:
                x -= vel
            elif event.key == pygame.K_RIGHT and x + 50 < 500:
                x += vel
            elif event.key == pygame.K_SPACE:
                bullet_list.append([x + 15, y - 20])

    """Constantly draws on the screen."""
    screen.fill((0, 0, 0))
    screen.blit(space, (0, 0))
    screen.blit(space_ship, [x, y])

    """Shoots a bullet from where the ship currently is."""
    for bullet in bullet_list:
        pygame.draw.rect(screen, (250, 250, 0),
                        [*bullet, height_rect, width_rect])
        bullet[1] -= 5

    for bullet in bullet_list[:]:
        if bullet[1] < 0:
            bullet_list.remove(bullet)
    
    pygame.display.flip()

Leave a Comment