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...