import pygame from settings import * from items import get_item class Hotbar: """Hotbar UI for quick access to items and weapons""" def __init__(self, inventory, weapon_manager): self.inventory = inventory self.weapon_manager = weapon_manager self.selected_slot = 0 self.visible_slots = HOTBAR_SLOT_COUNT # UI positioning self.slot_size = 50 self.slot_padding = 8 self.background_color = (40, 40, 40) self.selected_color = (100, 150, 255) self.border_color = (150, 150, 150) # Center hotbar at bottom of screen total_width = (self.slot_size * self.visible_slots) + (self.slot_padding * (self.visible_slots - 1)) + 20 self.x = (SCREEN_WIDTH - total_width) // 2 self.y = SCREEN_HEIGHT - 80 self.font = pygame.font.SysFont("consolas", 14) def handle_input(self, event): """Handle hotbar input (number keys 1-8 and mouse clicks)""" if event.type == pygame.KEYDOWN: # Number keys 1-8 if pygame.K_1 <= event.key <= pygame.K_8: slot_index = event.key - pygame.K_1 if slot_index < self.visible_slots: self.selected_slot = slot_index self.switch_weapon_at_slot() return True if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 4: # Scroll up self.selected_slot = (self.selected_slot - 1) % self.visible_slots self.switch_weapon_at_slot() return True elif event.button == 5: # Scroll down self.selected_slot = (self.selected_slot + 1) % self.visible_slots self.switch_weapon_at_slot() return True # Click on hotbar slots if event.button == 1: self.handle_click(event.pos) return True return False def handle_click(self, mouse_pos): """Handle clicking on hotbar slots""" for i in range(self.visible_slots): slot_x = self.x + i * (self.slot_size + self.slot_padding) slot_y = self.y slot_rect = pygame.Rect(slot_x, slot_y, self.slot_size, self.slot_size) if slot_rect.collidepoint(mouse_pos): self.selected_slot = i self.switch_weapon_at_slot() break def switch_weapon_at_slot(self): """Switch to weapon in selected slot""" items_list = list(self.inventory.slots.items()) if self.selected_slot < len(items_list): item_id, _ = items_list[self.selected_slot] # Check if it's a weapon if item_id in WEAPON_STATS: self.weapon_manager.switch_weapon(item_id) def get_selected_item(self): """Get the item in the selected hotbar slot""" items_list = list(self.inventory.slots.items()) if self.selected_slot < len(items_list): return items_list[self.selected_slot] return None, None def draw(self, screen): """Draw hotbar on screen""" # Get inventory items items_list = list(self.inventory.slots.items()) for i in range(self.visible_slots): # Calculate slot position slot_x = self.x + i * (self.slot_size + self.slot_padding) slot_y = self.y slot_rect = pygame.Rect(slot_x, slot_y, self.slot_size, self.slot_size) # Draw background if i == self.selected_slot: pygame.draw.rect(screen, self.selected_color, slot_rect) else: pygame.draw.rect(screen, self.background_color, slot_rect) # Draw border pygame.draw.rect(screen, self.border_color, slot_rect, 2) # Draw item if exists if i < len(items_list): item_id, amount = items_list[i] item = get_item(item_id) if item: # Draw item icon (colored square) icon_rect = pygame.Rect( slot_x + 6, slot_y + 6, self.slot_size - 12, self.slot_size - 12 ) pygame.draw.rect(screen, item.color, icon_rect) # Draw amount text if amount > 1: amount_text = self.font.render(str(amount), True, (255, 255, 255)) screen.blit(amount_text, (slot_x + 4, slot_y + self.slot_size - 20)) # Draw slot number num_text = self.font.render(str(i + 1), True, (200, 200, 200)) screen.blit(num_text, (slot_x + 4, slot_y + 4))