import pygame from settings import * from world import World from player import Player from camera import Camera from inventory import Inventory from enemy_manager import EnemyManager class Game: def __init__(self): pygame.init() # <-- IMPORTANT self.show_inventory = False # ---------------------------------- # Display Setup # ---------------------------------- flags = pygame.SCALED self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags) pygame.display.set_caption(GAME_TITLE) self.clock = pygame.time.Clock() self.running = True self.paused = False # ---------------------------------- # Core Systems # ---------------------------------- self.world = World() self.player = Player(100, 100) self.camera = Camera(self.player) self.inventory = Inventory() self.enemy_manager = EnemyManager(self.world, self.player) # ---------------------------------- # Debug self.font = pygame.font.SysFont("consolas", 18) # ========================================================== # MAIN LOOP # ========================================================== def run(self): while self.running: dt = self.clock.tick(FPS) / 1000 self.handle_events() if not self.paused: self.update(dt) self.draw() pygame.quit() # ========================================================== # EVENTS # ========================================================== def handle_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.paused = not self.paused # Toggle inventory if event.key == pygame.K_i: self.show_inventory = not self.show_inventory # ------------------------------- # Mouse input for breaking/placing # ------------------------------- if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: # Left click self.world.break_block( pygame.mouse.get_pos(), self.camera, self.inventory ) if event.button == 3: # Right click self.world.place_block( pygame.mouse.get_pos(), self.camera ) # ========================================================== # UPDATE # ========================================================== def update(self, dt): # If inventory is open, pause gameplay if self.show_inventory: return self.player.update(dt, self.world) self.camera.update() self.enemy_manager.update(dt) # ========================================================== # DRAW # ========================================================== def draw(self): self.screen.fill(BACKGROUND_COLOR) # Draw world relative to camera self.world.draw(self.screen, self.camera) # Draw entities self.enemy_manager.draw(self.screen, self.camera) self.player.draw(self.screen, self.camera) # UI if self.show_inventory: self.inventory.draw(self.screen) self.draw_ui() pygame.display.flip() # ========================================================== # UI / DEBUG # ========================================================== def draw_ui(self): if SHOW_FPS: fps = self.clock.get_fps() fps_text = self.font.render(f"FPS: {int(fps)}", True, (255, 255, 255)) self.screen.blit(fps_text, (10, 10)) if DEBUG_MODE: debug_text = self.font.render( f"Player: ({int(self.player.rect.x)}, {int(self.player.rect.y)})", True, (255, 255, 255) ) self.screen.blit(debug_text, (10, 30)) if self.paused: pause_text = self.font.render("PAUSED", True, (255, 0, 0)) rect = pause_text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)) self.screen.blit(pause_text, rect)