class Editor: ''' Simulation map editor ''' def __init__(self, surface: pygame.Surface): self._screen = surface self._state = EditorState() self._widgets = self._build_widgets() self._uimanager = pygame_gui.UIManager(surface.get_size()) self._focus = Vec(surface.get_size()) // 2 self._camera = Camera(self._focus, surface.get_size()) self._camera.set_method(Follow(self._camera)) def _build_widgets(self): names = self._state.get_poi_names() on_clicks = [partial( self._state.set_poi, name) for name in names + [None]] button_array = ButtonArray((100, 10), (200, 20), self._screen, (len(names)+1, 1), border=0, texts=(names+['nenhum']), onClicks=on_clicks) button_save = Button((310, 10), (60, 20), screen, text='salvar', onClick=self._state.save) button_load = Button((380, 10), (60, 20), screen, text='carregar', onClick=self._ask_for_file) return [button_array, button_save, button_load] def _ask_for_file(self): self._state.set_poi(None) file_explorer = FileExplorer((0,0), (300, 300), self._screen, {'select': self._load_file, 'cancel':self._cancel_load}) self._widgets.append(file_explorer) def _load_file(self, file_path): self._state.load(file_path) del self._widgets[-1] def _cancel_load(self): del self._widgets[-1] def _process_click(self, mouse_pos) -> bool: [_, _, right] = self._state.last_pressed_mouse points = self._state.get_points() poi = self._state.get_poi() if poi is None: if not right: return True for point in points: point_rect = pygame.Rect(point.pos, point.get_size()) if point_rect.collidepoint(mouse_pos): self._state.remove_point(point) else: poi = poi.copy() poi.pos -= self._camera.offset new_point_rect = pygame.Rect(poi.pos, poi.get_size()) for point in points: point_rect = pygame.Rect(point.pos, poi.get_size()) collided_point = point_rect.colliderect(new_point_rect) if collided_point: if right: self._state.remove_point(point) break else: if right: return True new_point_rect = pygame.Rect(poi.pos, poi.get_size()) widgets_rects = [ w.get_rect() for w in self._widgets] collided_widget = sum([ 1 for r in widgets_rects if r.colliderect(new_point_rect)]) > 0 if not collided_widget: self._state.add_point(poi) return True return False def _process_keys(self): keys = pygame.key.get_pressed() offset = { pygame.K_w: (0,1), pygame.K_s: (0,-1), pygame.K_a: (1,0), pygame.K_d: (-1,0) } speed_factor = ( 8 if keys[pygame.K_LCTRL] else 2 if keys[pygame.K_LSHIFT] else 4) for key in offset: if keys[key]: self._focus.update(self._focus+(Vec(offset[key])*speed_factor)) def listen(self, events: List[pygame.event.Event], time_delta_): ''' Listen for events Args: events: queue of pygame events ''' mouse_pos = Vec(pygame.mouse.get_pos()) self._state.update_poi_pos(mouse_pos) for widget in self._widgets: widget.listen(events, time_delta_) for event in events: if event.type == pygame.MOUSEBUTTONUP: if self._process_click(mouse_pos): break if event.type == pygame.MOUSEBUTTONDOWN: self._state.last_pressed_mouse = pygame.mouse.get_pressed() break self._process_keys() def draw(self): ''' Draw components in the screen ''' self._camera.scroll() poi = self._state.get_poi() for point in self._state.get_points(): screen.blit(point.get_icon(), point.pos + self._camera.offset) if poi is not None: screen.blit(poi.get_icon(), poi.pos) for widget in self._widgets: widget.draw()
class SimulationPygame: ''' Simulation ''' def __init__(self, surface: pygame.Surface, infection_probability, proximity, recovery_probability, gravitation_tick, lockdown_strength): self._screen = surface self._widgets = self._build_widgets() self._uimanager = pygame_gui.UIManager(surface.get_size()) self._focus = Vec(surface.get_size()) // 2 self._camera = Camera(self._focus, surface.get_size()) self._camera.set_method(Follow(self._camera)) home_poi = POI("home", (0, 0, 255)) center_poi = POI("center", (255, 225, 255)) agent_poi = POI("agent", (0, 0, 255)) self._available_points = { home_poi.get_name(): home_poi, center_poi.get_name(): center_poi } self._simulation = Simulation('output/points.csv', infection_probability, proximity, recovery_probability, gravitation_tick, lockdown_strength) def _build_widgets(self): return [] def _process_keys(self): keys = pygame.key.get_pressed() offset = { pygame.K_w: (0, -1), pygame.K_s: (0, 1), pygame.K_a: (-1, 0), pygame.K_d: (1, 0) } speed_factor = (8 if keys[pygame.K_LCTRL] else 2 if keys[pygame.K_LSHIFT] else 4) for key in offset: if keys[key]: self._focus.update(self._focus + (Vec(offset[key]) * speed_factor)) def listen(self, events: List[pygame.event.Event], time_delta_): ''' Listen for events Args: events: queue of pygame events ''' mouse_pos = Vec(pygame.mouse.get_pos()) for widget in self._widgets: widget.listen(events, time_delta_) self._process_keys() def draw(self): ''' Draw components in the screen ''' self._camera.scroll() for center in self._simulation.get_centers(): screen.blit(self._available_points['center'].get_icon(), center + self._camera.offset) for home in self._simulation.get_homes(): screen.blit(self._available_points['home'].get_icon(), home + self._camera.offset) for agent in self._simulation.get_agents(): agent_surface = pygame.Surface((5, 5)) if agent.situation == "susceptible": agent_surface.fill((0, 255, 0)) else: agent_surface.fill((255, 0, 0)) screen.blit(agent_surface, agent.pos + self._camera.offset) for widget in self._widgets: widget.draw()
import pygame from pygame.locals import QUIT from pygame.math import Vector2 as Vec from components.camera import Camera, Follow # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~-~-~-~-~-~-~-~- SETUP ~-~-~-~-~-~-~-~- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pygame.init() screen = pygame.display.set_mode((600, 600)) focus = Vec(400, 400) camera = Camera(focus, (1000, 1000)) follow = Follow(camera) camera.set_method(follow) pygame.display.set_caption('Teste') clock = pygame.time.Clock() focus.update(0, 0) point = pygame.Surface((10, 10)) point.fill((255, 0, 0)) # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~-~-~-~-~-~-~-~- VARIABLES ~-~-~-~-~-~-~-~- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while True: events = pygame.event.get() for event in events: if event.type == QUIT: pygame.quit() # <----- HOLD KEYS ------> keys = pygame.key.get_pressed() offset = { pygame.K_UP: (0, 1), pygame.K_DOWN: (0, -1), pygame.K_LEFT: (1, 0),