0
votes

I'm trying to make a Space Invaders game using Pygame. However, I'm having trouble figuring out how to make the spaceship continuously shoot multiple bullets and have the bullets move along with it. The only way I have actually made the program shoot multiple bullets is through a for loop, although the bullets stop shooting once the for loop hits its end. Should I create a list to store all the bullets? Any help is appreciated :D.

Below is my Python code so far (It only has the spaceship that fires one bullet).

from __future__ import print_function
import pygame
import os, sys
from pygame.locals import *

x_location = 357
y_location = 520
bullet_location_x = x_location + 35
bullet_location_y = y_location - 5

def load_image(path, colorkey): # loads an image given the file path
    try:
        image = pygame.image.load(path)
    except pygame.error, message:
        print("Cannot load image: {0}".format(path)) # print out error message

    image = image.convert() # convert image so that it can be displayed properly

    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0, 0))
        image.set_colorkey(colorkey, RLEACCEL)

    return image, image.get_rect() # Return the image and the image's rectangular area

def main():
    global x_location, y_location, bullet_location_x, bullet_location_y

    pygame.init()

    background_color = (0, 0, 0) # green background
    width, height = (800, 600) # width and height of screen

    screen = pygame.display.set_mode((width, height)) # set width and height
    pygame.display.set_caption('space invaders') # set title of game

    clock = pygame.time.Clock() # create the clock

    spaceship_img, spaceship_rect = load_image("spaceship.png", (0, 0, 0))
    bullet_img, bullet_rect = load_image("bullet.png", (0, 0, 0))

    while True:
        screen.fill(background_color) # make the background green

        ##############################################################
        # DISPLAY BULLET                                             #
        ##############################################################
        screen.blit(bullet_img, (bullet_location_x, bullet_location_y))

        # Render the images
        screen.blit(spaceship_img, (x_location, y_location))
        keys = pygame.key.get_pressed() # get the keysnpressed

        for event in pygame.event.get(): # check the events

            if event.type == pygame.QUIT: # if the user presses quit
                pygame.quit() # quit pygame
                sys.exit() # terminate the process
            if event.type == KEYDOWN:
                if event.key == K_LEFT:
                    screen.fill(background_color)
                    x_location -= 5
                    screen.blit(spaceship_img, (x_location, y_location))
                if event.key == K_RIGHT:
                    screen.fill(background_color)
                    x_location += 5
                    screen.blit(spaceship_img, (x_location, y_location))
                if event.key == K_UP:
                    screen.blit(bullet_img, (bullet_location_x, bullet_location_y))

                display_bullets = True

        pygame.display.flip() # refresh the pygame window
        clock.tick(60) # Makes the game run at around 60 FPS
        bullet_location_y -= 5
        pass

if __name__ == '__main__':
    main()
1

1 Answers

0
votes

You should separate your game into a loop that contains 3 different functions:

LOOP
    UPDATE_LOGIC
    INPUT_HANDLING
    DRAW_ELEMENTS
END-LOOP

In the input_handling, put a bullet into a list of bullets if the player is not in cool-down.

In the update_logic, iterate of the bullet list calculating the positions through time, and cool-down time of the player.

In the draw_elements, simply draw every thing on your scene. (iterate over the bullet list)

and you can use different timers for the draw and update_logic. That way will help you to add new elements to your game easily