diff --git a/src/item.py b/src/item.py index 4f937b9..e0cec9e 100644 --- a/src/item.py +++ b/src/item.py @@ -18,7 +18,7 @@ class Item: # timer to store time when item appeared self.spawn_time = pygame.time.get_ticks() - # try to load sprite + # try to load sprite with item type try: path = f"assets/items/{item_type}.png" self.image = pygame.image.load(path).convert_alpha() @@ -50,40 +50,41 @@ class Item: pygame.draw.rect(screen, color, draw_rect) pygame.draw.rect(screen, COLOR_HP_BAR_BG, draw_rect, 2) + +# try 50 times to find a free position to spawn item +def _random_position(room_rect, blocked_rects): + attempts = 0 + max_attempts = 50 + + while attempts < max_attempts: + # generate random x/y coordinates with room boundaries + # * 2 to have a margin to walls + x = random.randint(room_rect.left + ITEM_SIZE, room_rect.right - ITEM_SIZE * 2) + y = random.randint(room_rect.top + ITEM_SIZE, room_rect.bottom - ITEM_SIZE * 2) + + # create a rect at this position for testing collision + test_rect = pygame.Rect(x, y, ITEM_SIZE, ITEM_SIZE) + blocked = False + for b in blocked_rects: + if test_rect.colliderect(b): + blocked = True + break + + # if position is not blocked, return the position + if not blocked: + return x, y + + attempts += 1 + + # no spot after 50 attempts -> return + return None + + class ItemManager: def __init__(self): self.items = [] self.last_spawn_time = pygame.time.get_ticks() - # try 50 times to find a free position to spawn item - def _random_position(self, room_rect, blocked_rects): - attempts = 0 - max_attempts = 50 - - while attempts < max_attempts: - # generate random x/y coordinates with room boundaries - # * 2 to have a margin to walls - x = random.randint(room_rect.left + ITEM_SIZE, room_rect.right - ITEM_SIZE * 2) - y = random.randint(room_rect.top + ITEM_SIZE, room_rect.bottom - ITEM_SIZE * 2) - - # create a rect at this position for testing collision - test_rect = pygame.Rect(x, y, ITEM_SIZE, ITEM_SIZE) - blocked = False - for b in blocked_rects: - if test_rect.colliderect(b): - blocked = True - break - - # if position is not blocked, return the position - if not blocked: - return x, y - - attempts += 1 - - # no spot after 50 attempts -> return - return None - - # remove expired items and spawn new ones def update(self, room_rect, blocked_rects): now = pygame.time.get_ticks() @@ -97,9 +98,31 @@ class ItemManager: # replace the old list with the new temp_list self.items = remaining_items - # todo spawn logic for ned ones with random time? (in settings we can set the time range?) + # spawn logic for new items + if room_rect is not None: + if now - self.last_spawn_time >= ITEM_SPAWN_INTERVAL: + pos = _random_position(room_rect, blocked_rects) + if pos is not None: + x, y = pos + item_type = random.choice(["coffee", "beer"]) + self.items.append(Item(x, y, item_type)) - # draw active items + self.last_spawn_time = now + + # check if player press "e" to buy + def check_collect(self, player_rect, keys): + if keys[pygame.K_e]: + for item in self.items: + if player_rect.colliderect(item.rect): + return item + return None + + # delete item from list after buying it + def remove_item(self, item): + if item in self.items: + self.items.remove(item) + + # draw all active items def draw(self, screen, cam_x, cam_y): for item in self.items: item.draw(screen, cam_x, cam_y)