def __init__(self, **kw): self.map = map.ForestMap(margin=AreaScreen.margin) self.map.add_labels(map_label.NodeNote) self.renderer = kw.get("renderer", ForestMapRenderer)() self.vertices_pos = self.map.nodes() self.pc = PlayerCharacter('Valrus', 'sprites/walrus') self.pc_loc = choice(self.vertices_pos) self.nav_widgets = [] super(AreaScreen, self).__init__(**kw) self.terrain = MapTerrain(renderer=self.renderer) self.add_widget(self.terrain) self.features = MapFeatures(renderer=self.renderer) self.add_widget(self.features) self.overlay = MapOverlay(self.map.wall_dict) self.add_widget(self.overlay) self.ear = NoteCollector()
class AreaScreen(Screen): overlay = ObjectProperty(None) terrain = ObjectProperty(None) features = ObjectProperty(None) renderer = ObjectProperty(None) midi_in = ObjectProperty(None) margin = 60 def __init__(self, **kw): self.map = map.ForestMap(margin=AreaScreen.margin) self.map.add_labels(map_label.NodeNote) self.renderer = kw.get("renderer", ForestMapRenderer)() self.vertices_pos = self.map.nodes() self.pc = PlayerCharacter('Valrus', 'sprites/walrus') self.pc_loc = choice(self.vertices_pos) self.nav_widgets = [] super(AreaScreen, self).__init__(**kw) self.terrain = MapTerrain(renderer=self.renderer) self.add_widget(self.terrain) self.features = MapFeatures(renderer=self.renderer) self.add_widget(self.features) self.overlay = MapOverlay(self.map.wall_dict) self.add_widget(self.overlay) self.ear = NoteCollector() def on_midi_in(self, instance, value): value.watchers.add(self) self.register_event_type('on_midi') def on_terrain(self, instance, value): self.renderer.terrain = value self.draw_walls() def on_features(self, instance, value): self.renderer.features = value value.add_vertices(self.vertices_pos) value.add_pc(self.pc, self.pc_loc) self.draw_edges() self.resetNavigationWidgets() def on_overlay(self, instance, value): value.setup_fog(clear={self.pc_loc}) def resetNavigationWidgets(self, *args): """Set up labels describing how to move the PC. Takes *args because it's used as a callback for Animation.on_complete and I don't know what that passes in.""" for w in self.nav_widgets: self.features.remove_widget(w) del self.nav_widgets[:] self.nav_widgets = getNavigationWidgets(self.pc_loc, self.map, self.map.edges([self.pc_loc])) for w in self.nav_widgets: # print("adding widget", w.text, "with center", w.center) self.features.add_widget(w) def reveal_map_areas(self, loc, *args): clear_edges = defaultdict(list) for adjacent_node in self.map.neighbors(loc): if adjacent_node in self.overlay.clear: adjacent_edge = self.map.wall_between_nodes(loc, adjacent_node) clear_edges[adjacent_node].append(adjacent_edge) clear_edges[loc].append(adjacent_edge) self.overlay.reveal(loc, clear_edges) def on_midi(self, msg): self.ear.hear(msg) if not self.ear.heard_count() >= 1: return heard = self.ear.retrieve() print("Heard", heard) for neighbor in self.map.neighbors(self.pc_loc): if notes_match(heard, self.map.node_label(neighbor).container()): prev_loc = self.pc_loc self.pc_loc = neighbor anim = Animation( center=(self.pc_loc.x, self.pc_loc.y), duration=0.5, transition=AnimationTransition.in_out_quad ) anim.on_complete = self.resetNavigationWidgets if self.overlay: anim.on_start = partial(self.reveal_map_areas, self.pc_loc) print(self.map.wall_between_nodes(prev_loc, self.pc_loc)) anim.start(self.features.pcWidget) def draw_edges(self): """Draw lines between this map's vertices. """ self.renderer.draw_paths([ [v1, v2] for v1, v2 in self.map.edges_iter(self.vertices_pos) ]) def draw_walls(self): actual_walls = [w for w in self.map.walls if w] self.renderer.draw_walls([[Coords(*v1), Coords(*v2)] for v1, v2 in actual_walls])