Add food connection rendering with orange bounding boxes and lines
This commit is contained in:
parent
de45db4393
commit
78438ae768
@ -13,6 +13,7 @@ WHITE = (255, 255, 255)
|
|||||||
RED = (255, 0, 0)
|
RED = (255, 0, 0)
|
||||||
BLUE = (0, 0, 255)
|
BLUE = (0, 0, 255)
|
||||||
GREEN = (0, 255, 0)
|
GREEN = (0, 255, 0)
|
||||||
|
ORANGE = (255, 165, 0)
|
||||||
LIGHT_BLUE = (52, 134, 235)
|
LIGHT_BLUE = (52, 134, 235)
|
||||||
SELECTION_BLUE = (0, 128, 255)
|
SELECTION_BLUE = (0, 128, 255)
|
||||||
SELECTION_GRAY = (128, 128, 128, 80)
|
SELECTION_GRAY = (128, 128, 128, 80)
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import pygame
|
|||||||
import math
|
import math
|
||||||
from config.constants import *
|
from config.constants import *
|
||||||
from world.base.brain import CellBrain
|
from world.base.brain import CellBrain
|
||||||
from world.objects import DefaultCell
|
from world.objects import DefaultCell, FoodObject
|
||||||
|
|
||||||
|
|
||||||
class Renderer:
|
class Renderer:
|
||||||
@ -251,3 +251,68 @@ class Renderer:
|
|||||||
size = camera.get_relative_size(width)
|
size = camera.get_relative_size(width)
|
||||||
rect = pygame.Rect(screen_x - size // 2, screen_y - size // 2, size, size)
|
rect = pygame.Rect(screen_x - size // 2, screen_y - size // 2, size, size)
|
||||||
pygame.draw.rect(self.render_area, SELECTION_BLUE, rect, 1)
|
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
|
||||||
|
)
|
||||||
|
|||||||
@ -259,6 +259,12 @@ class SimulationEngine:
|
|||||||
self.input_handler.selected_objects,
|
self.input_handler.selected_objects,
|
||||||
self.simulation_core.camera
|
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))
|
self.screen.blit(self.sim_view, (self.sim_view_rect.left, self.sim_view_rect.top))
|
||||||
|
|
||||||
def _update_and_render_ui(self, deltatime):
|
def _update_and_render_ui(self, deltatime):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user