Beispiel #1
0
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()
Beispiel #2
0
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()
Beispiel #3
0
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),