Add food connection rendering with orange bounding boxes and lines

This commit is contained in:
Sam 2025-11-09 01:30:33 -06:00
parent de45db4393
commit 78438ae768
3 changed files with 73 additions and 1 deletions

View File

@ -13,6 +13,7 @@ WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
ORANGE = (255, 165, 0)
LIGHT_BLUE = (52, 134, 235)
SELECTION_BLUE = (0, 128, 255)
SELECTION_GRAY = (128, 128, 128, 80)

View File

@ -5,7 +5,7 @@ import pygame
import math
from config.constants import *
from world.base.brain import CellBrain
from world.objects import DefaultCell
from world.objects import DefaultCell, FoodObject
class Renderer:
@ -251,3 +251,68 @@ class Renderer:
size = camera.get_relative_size(width)
rect = pygame.Rect(screen_x - size // 2, screen_y - size // 2, size, size)
pygame.draw.rect(self.render_area, SELECTION_BLUE, rect, 1)
def render_food_connections(self, world, camera, selected_objects):
"""Render orange bounding boxes around closest food and lines from selected cells."""
if not selected_objects:
return
# Find closest food to each selected cell
for selected_cell in selected_objects:
# Check if selected cell can have food interactions (DefaultCell)
if not isinstance(selected_cell, DefaultCell):
continue
# Find all food objects in world
all_objects = world.get_objects()
food_objects = [obj for obj in all_objects if isinstance(obj, FoodObject)]
if not food_objects:
continue
# Get selected cell position
cell_x, cell_y = selected_cell.position.get_position()
# Find closest food object
closest_food = None
closest_distance = float('inf')
for food in food_objects:
food_x, food_y = food.position.get_position()
distance = ((food_x - cell_x) ** 2 + (food_y - cell_y) ** 2) ** 0.5
if distance < closest_distance:
closest_distance = distance
closest_food = food
# Draw bounding box around closest food and connecting line
if closest_food and closest_food != selected_cell:
food_x, food_y = closest_food.position.get_position()
food_width = closest_food.max_visual_width
food_size = int(food_width * camera.zoom)
# Calculate bounding box position (centered on food)
box_x, box_y = camera.world_to_screen(food_x, food_y)
box_rect = pygame.Rect(
box_x - food_size,
box_y - food_size,
food_size * 2,
food_size * 2
)
# Draw orange bounding box (2 pixel width)
pygame.draw.rect(self.render_area, ORANGE, box_rect, 2)
# Draw line from selected cell to closest food
screen_x, screen_y = camera.world_to_screen(cell_x, cell_y)
# Calculate line thickness based on zoom (minimum 1 pixel)
line_thickness = max(1, int(2 * camera.zoom))
pygame.draw.line(
self.render_area,
ORANGE,
(screen_x, screen_y),
(box_x, box_y),
line_thickness
)

View File

@ -259,6 +259,12 @@ class SimulationEngine:
self.input_handler.selected_objects,
self.simulation_core.camera
)
if self.input_handler.show_interaction_radius:
self.renderer.render_food_connections(
self.simulation_core.world,
self.simulation_core.camera,
self.input_handler.selected_objects
)
self.screen.blit(self.sim_view, (self.sim_view_rect.left, self.sim_view_rect.top))
def _update_and_render_ui(self, deltatime):