def map_to_grid(self, position) -> tuple: return (int( utils.clamp(position.x, MAP_TILE_SIZE, self.map_size.x - MAP_TILE_SIZE - 1) / GRID_CELL_SIZE), int( utils.clamp(position.y, MAP_TILE_SIZE, self.map_size.y - MAP_TILE_SIZE - 1) / GRID_CELL_SIZE))
def handle_mouse(self, event): if event.type == pygame.MOUSEBUTTONDOWN: # Right button (1) : Drag map if event.button == 3: self.screen_drag = True pygame.mouse.get_rel() # Left button (3) : Select creature if event.button == 1: click_pos = pygame.math.Vector2(pygame.mouse.get_pos()) selection_pos = self.screen_to_map(click_pos) selection_rect = pygame.Rect(selection_pos - (8, 8), (16, 16)) for c in self.creatures: if c.rect.colliderect(selection_rect): self.selected = c elif event.type == pygame.MOUSEBUTTONUP: if event.button == 3: self.screen_drag = False elif event.type == pygame.MOUSEMOTION: if self.screen_drag: self.screen_offset += pygame.math.Vector2( pygame.mouse.get_rel()) / self.world_scale # Zoom elif event.type == pygame.MOUSEWHEEL: focus = self.screen_to_map((self.screen_size / 2).vector2) self.world_scale = utils.clamp(self.world_scale + 0.05 * event.y, *WORLD_SCALE) self.screen_offset += self.screen_to_map( (self.screen_size / 2).vector2) - focus
def handle_keyboard(self, event): # http://thepythongamebook.com/en:glossary:p:pygame:keycodes if event.type == pygame.KEYDOWN: # Simulation speed # - Faster if event.key == pygame.K_UP: self.speed = utils.clamp(self.speed + 1, *ENGINE_SPEED) if event.key == pygame.K_PAGEUP: self.speed = utils.clamp(self.speed + 10, *ENGINE_SPEED) # - Slower if event.key == pygame.K_DOWN: self.speed = utils.clamp(self.speed - 1, *ENGINE_SPEED) if event.key == pygame.K_PAGEDOWN: self.speed = utils.clamp(self.speed - 10, *ENGINE_SPEED) # - Reset if event.key == pygame.K_SPACE: self.speed = 30 # Chart selection if event.key in (pygame.K_LSHIFT, pygame.K_RSHIFT): self.chart_active = next(self.chart.active) # Quit if event.key == pygame.K_ESCAPE: self.running = False
def clamp_map_position( self, position: pygame.math.Vector2) -> pygame.math.Vector2: return pygame.math.Vector2( utils.clamp(position.x, MAP_MARGIN, self.map_size.x - MAP_MARGIN), utils.clamp(position.y, MAP_MARGIN, self.map_size.y - MAP_MARGIN))
def mutate(self): vrange = (self.VMAX - self.VMIN) * self.MUTATION_RATIO return self.__class__( utils.clamp(self.value + random.uniform(-vrange, vrange), self.VMIN, self.VMAX))
def __init__(self, value=None): if value is None: value = self.DEFAULT self.value = utils.clamp(value, self.VMIN, self.VMAX) self.cost = self._cost() * self.COST_RATIO