Ejemplo n.º 1
0
 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()
Ejemplo n.º 2
0
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])