Home >Backend Development >Python Tutorial >How to Create a Pygame Game with Multiple Levels and a Main Menu?

How to Create a Pygame Game with Multiple Levels and a Main Menu?

Susan Sarandon
Susan SarandonOriginal
2024-11-28 15:41:14704browse

How to Create a Pygame Game with Multiple Levels and a Main Menu?

Pygame level/menu states

Pygame is a popular Python library for creating 2D games. It provides a variety of modules for handling graphics, sound, input, and more.

In this article, we'll discuss how to use Pygame to create games with multiple levels and menus. We'll start by creating a simple game with a single level, and then we'll expand on that to create a game with multiple levels and a main menu.

Creating a simple game with a single level

To create a simple game with a single level, we'll need to create a Pygame window, load some graphics, and create a game loop.

Here's a code snippet that shows how to do this:

import pygame

# Initialize the Pygame library
pygame.init()

# Set the window size
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Create the Pygame window
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# Set the window title
pygame.display.set_caption("My Game")

# Load the background image
background_image = pygame.image.load("background.png").convert()

# Create the player sprite
player = pygame.sprite.Sprite()
player.image = pygame.image.load("player.png").convert()
player.rect = player.image.get_rect()
player.rect.center = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)

# Create the enemy sprite
enemy = pygame.sprite.Sprite()
enemy.image = pygame.image.load("enemy.png").convert()
enemy.rect = enemy.image.get_rect()
enemy.rect.center = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 100)

# Create a group to hold all the sprites
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
all_sprites.add(enemy)

# Create a clock to control the game loop
clock = pygame.time.Clock()

# Run the game loop
running = True
while running:

    # Process events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Update the game state
    all_sprites.update()

    # Draw the game画面
    screen.blit(background_image, (0, 0))
    all_sprites.draw(screen)

    # Flip the display
    pygame.display.flip()

    # Cap the frame rate at 60 FPS
    clock.tick(60)

# Quit the game
pygame.quit()

This code creates a Pygame window with a background image and two sprites: a player and an enemy. The game loop runs until the player quits the game, and during each iteration of the loop, the game state is updated, the screen is drawn, and the display is flipped.

Expanding the game to include multiple levels and a main menu

To expand the game to include multiple levels and a main menu, we'll need to create a new Scene class. A Scene represents a particular part of the game, such as a level or a menu.

Here's a code snippet that shows how to create a Scene class:

class Scene:

    def __init__(self):
        self.next = None

    def update(self):
        pass

    def draw(self, screen):
        pass

    def handle_events(self, events):
        pass

The Scene class has three methods: update, draw, and handle_events. The update method is called each frame to update the game state, the draw method is called each frame to draw the game画面, and the handle_events method is called each frame to handle user input.

We can now create a new Scene for each level and for the main menu. Here's a code snippet that shows how to do this:

class Level1(Scene):

    def __init__(self):
        super().__init__()

        # Create the player sprite
        self.player = pygame.sprite.Sprite()
        self.player.image = pygame.image.load("player.png").convert()
        self.player.rect = self.player.image.get_rect()
        self.player.rect.center = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)

        # Create the enemy sprite
        self.enemy = pygame.sprite.Sprite()
        self.enemy.image = pygame.image.load("enemy.png").convert()
        self.enemy.rect = self.enemy.image.get_rect()
        self.enemy.rect.center = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 100)

        # Create a group to hold all the sprites
        self.all_sprites = pygame.sprite.Group()
        self.all_sprites.add(self.player)
        self.all_sprites.add(self.enemy)

    def update(self):
        # Update the game state
        self.all_sprites.update()

    def draw(self, screen):
        # Draw the game画面
        screen.blit(background_image, (0, 0))
        self.all_sprites.draw(screen)

    def handle_events(self, events):
        # Handle user input
        for event in events:
            if event.type == pygame.QUIT:
                # The user has quit the game
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    # The user has pressed the left arrow key
                    self.player.rect.x -= 10
                elif event.key == pygame.K_RIGHT:
                    # The user has pressed the right arrow key
                    self.player.rect.x += 10
                elif event.key == pygame.K_UP:
                    # The user has pressed the up arrow key
                    self.player.rect.y -= 10
                elif event.key == pygame.K_DOWN:
                    # The user has pressed the down arrow key
                    self.player.rect.y += 10

class MainMenu(Scene):

    def __init__(self):
        super().__init__()

        # Create the title text
        self.title_text = pygame.font.Font(None, 50)
        self.title_text_image = self.title_text.render("My Game", True, (255, 255, 255))
        self.title_text_rect = self.title_text_image.get_rect()
        self.title_text_rect.center = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)

        # Create the start button
        self.start_button = pygame.draw.rect(screen, (0, 255, 0), (SCREEN_WIDTH / 2 - 50, SCREEN_HEIGHT / 2 + 100, 100, 50))

    def update(self):
        pass

    def draw(self, screen):
        # Draw the game画面
        screen.blit(background_image, (0, 0))
        screen.blit(self.title_text_image, self.title_text_rect)
        pygame.draw.rect(screen, (0, 255, 0), self.start_button)

    def handle_events(self, events):
        # Handle user input
        for event in events:
            if event.type == pygame.QUIT:
                # The user has quit the game
                pygame.quit()
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                # The user has clicked the start button
                if self.start_button.collidepoint(event.pos):
                    # Set the next scene to Level1
                    self.next = Level1()

We can now create a new SceneManager class to manage the different scenes. The SceneManager keeps track of the current scene and switches to the next scene when the current scene is finished.

Here's a code snippet that shows how to create a SceneManager class:

class SceneManager:

    def __init__(self):
        self.current_scene = MainMenu()

    def run(self):
        # Run the game loop
        running = True
        while running:

            # Process events
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    # The user has quit the game
                    running = False

            # Update the current scene
            self.current_scene.update()

            # Draw the current scene
            self.current_scene.draw(screen)

            # Flip the display
            pygame.display.flip()

            # Check if the current scene is finished
            if self.current_scene.next is not None:

The above is the detailed content of How to Create a Pygame Game with Multiple Levels and a Main Menu?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn