[Python] Pygame dá erro quando carregando variável "is_crouching" [fechada]

Discussão em 'Python' iniciado por Stack, Outubro 30, 2024.

  1. Stack

    Stack Membro Participativo

    Quando vou usar o meu código, o Pygame dá os seguintes erros (nota, integrei o Pygame com o Tkiher):

    Traceback (most recent call last):
    File "d:\Python\Lib\tkinter\__init__.py", line 1968, in __call__
    return self.func(*args)
    return self.func(*args)
    ^^^^^^^^^^^^^^^^
    File "c:\Users\arthu\OneDrive\Desktop\platformer\main.py", line 116, in start_game
    game_loop() # Inicia o loop do jogo
    ^^^^^^^^^^^
    File "c:\Users\arthu\OneDrive\Desktop\platformer\main.py", line 180, in game_loop
    if is_crouching:
    ^^^^^^^^^^^^
    UnboundLocalError: cannot access local variable 'is_crouching' where it is not associated with a value
    PS C:\Users\arthu\OneDrive\Desktop\platformer> c:; cd 'c:\Users\arthu\OneDrive\Desktop\platformer'; & 'd:\Python\python.exe' 'c:\Users\arthu\.vscode\extensions\ms-python.debugpy-2024.12.0-win32-x64\bundled\libs\debugpy\adapter/../..\debugpy\launcher' '59377' '--' 'C:\Users\arthu\OneDrive\Desktop\platformer\main.py'
    pygame 2.6.0 (SDL 2.28.4, Python 3.12.6)
    Hello from the pygame community. https://www.pygame.org/contribute.html
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "d:\Python\Lib\tkinter\__init__.py", line 1968, in __call__
    return self.func(*args)
    ^^^^^^^^^^^^^^^^
    File "C:\Users\arthu\OneDrive\Desktop\platformer\main.py", line 116, in start_game
    game_loop() # Inicia o loop do jogo
    ^^^^^^^^^^^
    File "C:\Users\arthu\OneDrive\Desktop\platformer\main.py", line 180, in game_loop
    if is_crouching:
    ^^^^^^^^^^^^
    UnboundLocalError: cannot access local variable 'is_crouching' where it is not associated with a value
    PS C:\Users\arthu\OneDrive\Desktop\platformer>


    Onde meu código é:

    import pygame
    import sys
    import random
    import ctypes # Para usar a função Beep
    import tkinter as tk
    from tkinter import messagebox

    # Inicializa o Pygame
    pygame.init()
    pygame.mixer.init() # Inicializa o mixer de áudio

    # Carrega o som de vida e o som de colisão
    sound_collect = pygame.mixer.Sound('som_coletar.wav') # Som ao coletar comida
    sound_collision = pygame.mixer.Sound('som_colisao.wav') # Som ao colidir com espinhos

    # Constantes
    WIDTH, HEIGHT = 800, 600
    BLACK = (0, 0, 0)
    BLUE = (0, 100, 255)
    GREEN = (0, 255, 0)
    RED = (255, 0, 0)
    YELLOW = (255, 255, 0) # Cor para as comidinhas
    FPS = 60
    SPEED = 5

    # Configura a tela
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("Plataforma Simples com Obstáculos")

    # Configurações do jogador
    player_width = 50
    player_height = 50
    player_x = WIDTH // 2 - player_width // 2
    player_y = HEIGHT - player_height - 50 # Começa acima do chão
    player_speed = SPEED
    crouch_speed = player_speed * 0.8 # 20% mais lento ao agachar
    is_crouching = False

    # Configurações de gravidade
    gravity = 0.5
    player_velocity_y = 0
    on_ground = True

    # Configurações do jogo
    lives = 3
    spike_height = 20
    spikes = []
    food_items = [] # Lista para armazenar comidinhas
    invincibility_duration = 1000 # Duração da invencibilidade em milissegundos
    invincibility_start_time = 0
    invincible = False
    blink_time = 0.1 # Tempo de piscar em segundos
    blink_count = 2 # Número de piscadas

    # Função para criar espinhos
    def create_spike(x):
    return pygame.draw.polygon(screen, RED, [(x, HEIGHT - 50), (x + 25, HEIGHT - 50 - spike_height), (x + 50, HEIGHT - 50)])

    # Gera um novo espinho com espaçamento aleatório entre 400 e 900 pixels
    def generate_spike(last_x):
    x = last_x + random.randint(400, 900) # Novo x baseado no último espinho
    return create_spike(x)

    # Função para criar comidinha
    def create_food(x, y):
    return pygame.draw.rect(screen, YELLOW, (x, y, 30, 30)) # Comidinha de 30x30 pixels

    # Gera uma nova comidinha em uma posição aleatória
    def generate_food():
    x = random.randint(0, WIDTH - 30) # Posição aleatória na largura da tela
    y = random.randint(50, HEIGHT - 100) # Posição aleatória na altura
    return (x, y)

    # Gera espinhos iniciais
    last_x = 0 # Inicializa a posição do último espinho
    for _ in range(5):
    spikes.append(generate_spike(last_x))
    last_x += 400 # Atualiza a posição do último espinho para o próximo

    # Gera comidinhas iniciais
    for _ in range(2): # Cria 2 comidinhas no início
    food_items.append(generate_food())

    # Fonte para exibir texto
    font = pygame.font.Font(None, 36)

    # Função para reiniciar o jogo
    def reset_game():
    global player_x, player_y, player_velocity_y, on_ground, lives, spikes, food_items, invincible, invincibility_start_time, last_x
    player_x = WIDTH // 2 - player_width // 2
    player_y = HEIGHT - player_height - 50
    player_velocity_y = 0
    on_ground = True
    lives = 3
    spikes.clear()
    food_items.clear() # Limpa as comidinhas
    invincible = False
    invincibility_start_time = 0
    last_x = 0 # Reinicia a posição do último espinho
    for _ in range(5):
    spikes.append(generate_spike(last_x))
    last_x += 400 # Atualiza a posição do último espinho para o próximo
    for _ in range(2): # Cria 2 comidinhas no reinício
    food_items.append(generate_food())

    # Função para tocar um som usando Beep
    def beep_sound():
    frequency = 1000 # Frequência em hertz
    duration = 100 # Duração em milissegundos
    ctypes.windll.kernel32.Beep(frequency, duration)

    # Função para mostrar a janela do menu principal
    def main_menu():
    def start_game():
    root.destroy() # Fecha a janela do menu
    game_loop() # Inicia o loop do jogo

    def exit_game():
    pygame.quit()
    sys.exit()

    root = tk.Tk()
    root.title("Menu Principal")

    # Botão para iniciar o jogo
    start_button = tk.Button(root, text="Iniciar Jogo", command=start_game)
    start_button.pack(pady=20)

    # Botão para sair do jogo
    exit_button = tk.Button(root, text="Sair", command=exit_game)
    exit_button.pack(pady=20)

    root.mainloop() # Inicia a janela do menu

    # Loop principal do jogo
    def game_loop():
    global lives, invincible
    clock = pygame.time.Clock()
    while True:
    # Checa se o jogador perdeu todas as vidas
    if lives <= 0:
    screen.fill(BLACK)
    game_over_text = font.render("Game Over! Pressione R para Reiniciar", True, GREEN)
    screen.blit(game_over_text, (WIDTH // 2 - game_over_text.get_width() // 2, HEIGHT // 2))
    pygame.display.flip()

    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()
    if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
    reset_game()
    break # Sai do loop para reiniciar o jogo

    else:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()

    # Captura as teclas pressionadas
    keys = pygame.key.get_pressed()

    # Movimento horizontal
    if keys[pygame.K_LEFT]:
    player_x -= crouch_speed if is_crouching else player_speed
    if keys[pygame.K_RIGHT]:
    player_x += crouch_speed if is_crouching else player_speed

    # Pular
    if keys[pygame.K_UP] and on_ground:
    player_velocity_y = -10 # Velocidade do salto
    on_ground = False

    # Agachar
    if keys[pygame.K_DOWN]:
    is_crouching = True
    player_y += player_height // 2 # Move o jogador para baixo ao agachar
    else:
    if is_crouching:
    player_y -= player_height // 2 # Move o jogador para cima ao soltar o agachamento
    is_crouching = False

    # Aplica a gravidade
    if not on_ground:
    player_velocity_y += gravity # Aplica a gravidade
    player_y += player_velocity_y # Move o jogador para baixo

    # Verifica colisão com o chão
    if player_y >= HEIGHT - player_height - 50:
    player_y = HEIGHT - player_height - 50 # Reseta a posição do jogador ao nível do chão
    player_velocity_y = 0
    on_ground = True

    # Define a altura do jogador com base no estado de agachamento
    current_player_height = player_height // 2 if is_crouching else player_height

    # Verifica colisão com os espinhos
    player_rect = pygame.Rect(player_x, player_y, player_width, current_player_height)
    for spike in spikes:
    spike_rect = pygame.Rect(spike[0], HEIGHT - 50 - spike_height, 50, spike_height) # Define a posição dos espinhos
    if player_rect.colliderect(spike_rect) and not invincible:
    lives -= 1 # Perde uma vida ao colidir com espinhos
    invincible = True # Ativa a invencibilidade
    invincibility_start_time = pygame.time.get_ticks() # Marca o tempo da colisão
    sound_collision.play() # Toca o som de colisão
    player_x = WIDTH // 2 - player_width // 2 # Reseta a posição do jogador

    # Verifica coleta de comidinhas
    for food in food_items:
    food_rect = pygame.Rect(food[0], food[1], 30, 30)
    if player_rect.colliderect(food_rect):
    food_items.remove(food) # Remove a comidinha coletada
    sound_collect.play() # Toca o som de coleta
    beep_sound() # Toca o som Beep
    break

    # Limpa a tela
    screen.fill(BLACK)

    # Desenha os espinhos
    for spike in spikes:
    create_spike(spike[0])

    # Desenha o jogador
    pygame.draw.rect(screen, BLUE, (player_x, player_y, player_width, current_player_height))

    # Desenha as comidinhas
    for food in food_items:
    create_food(food[0], food[1])

    # Desenha vidas
    for i in range(lives):
    pygame.draw.rect(screen, GREEN, (10 + i * 40, 10, 30, 30)) # Desenha um quadrado verde para cada vida

    # Verifica o tempo de invencibilidade
    if invincible:
    current_time = pygame.time.get_ticks()
    if current_time - invincibility_start_time > invincibility_duration:
    invincible = False # Desativa a invencibilidade
    else:
    # Altera a transparência do jogador para piscar
    if (current_time // 200) % 2 == 0: # Pisca a cada 200 ms
    pygame.draw.rect(screen, BLACK, (player_x, player_y, player_width, current_player_height)) # Desenha o jogador invisível

    # Atualiza a tela
    pygame.display.flip()
    clock.tick(FPS)

    # Inicia o menu principal
    main_menu()


    Como conserto isso?

    Continue reading...

Compartilhe esta Página