コード例 #1
0
    def __init__(self, stage, elements):
        self.stage = stage
        self.layer = Layer()
        self.elements_layer = Layer()
        from yaml import load
        data = load(file('data/common/backpack.yaml'))
        self.elements = elements
        self.close_button = stage.create_button(data["close"], self)[0]
        self.next_button = stage.create_button(data["next"], self)[0]
        self.previous_button = stage.create_button(data["previous"], self)[0]
        self.description_text = stage.create_text(data["description"])[0]
        self.element_count_text = stage.create_text_count(
            data["element_count"], len(elements))[0]
        self.previous_button.set_visible(False)
        self.current_page = 0
        self.create_elements(data, elements)
        if len(elements) <= self.ITEMS_PER_PAGE:
            self.next_button.set_visible(False)
        self.set_elements()

        self.other = stage.create_items_from_yaml(data["other"])
        for other in self.other:
            self.layer.add(other)
        self.layer.add(self.close_button)
        self.layer.add(self.next_button)
        self.layer.add(self.previous_button)
        self.layer.add(self.description_text)
        self.layer.add(self.element_count_text)
        self.current_items = []
コード例 #2
0
 def __init__(self, stage, tests):
     self.layer = Layer()
     self.stage = stage
     self.tests = tests
     data = DictClass(load(file('data/common/tests_viewer.yaml')))
     layers = [test.get_layer() for test in tests]
     self.paginator = Paginator(self.stage, layers,
                                data.get("pagination", None))
     for item in self.stage.create_items_from_yaml(data.other, self):
         self.layer.add(item)
コード例 #3
0
 def create_items(self, data):
     items = DictClass()
     layer = Layer()
     self.stage._items_manager = self
     for i in data:
         item = items[i.name] = self.stage.create_item(i)[0]
         item.data = i
         layer.add(item)
     self.stage._items_manager = None
     items["layer"] = layer
     return items
コード例 #4
0
    def __load_items(self, text, data, top, height):
        self.items = []

        def create_text(stage, next, text, top, height):
            text_item = stage.create_text(data.text)[0]
            text_item.break_text_into(next)
            text_item.set_text(text)
            text_item.set_top(top)
            text_item.set_dimensions(data.text.width, height)
            text_item.break_text_into(None)
            return text_item

        # Usamos una clase que tiene el metodo set_text para saber si hay que dividir el texto
        class Next:
            def __init__(self):
                self.text = None

            def set_text(self, text):
                self.text = text

        next = Next()
        layer = Layer()
        layer.add(create_text(self.stage, next, text, top, height))
        self.items.append(layer)
        while next.text:
            layer = Layer()
            layer.add(create_text(self.stage, next, next.text, top, height))
            self.items.append(layer)
コード例 #5
0
    def view_post_web_cb(self, result):
        if result.error:
            self.error_try_again_later()
            return
        data = DictClass(result.data)
        self.layers.view_post.title.set_text(self.title)
        self.layers.view_post.author.set_text(data.author_name + ":")
        # Usamos una clase que tiene el metodo set_text para saber si hay que dividir el texto
        items = []
        next = Next()
        layer = Layer()

        def create_text(stage, next, text, data):
            text_item = stage.create_text(data)[0]
            set_text(next, text, text_item)
            return text_item

        layer.add(
            create_text(self.stage, next, data.text,
                        self.layers.view_post.post.data))
        items.append(layer)
        while next.text:
            layer = Layer()
            layer.add(
                create_text(self.stage, next, next.text,
                            self.layers.view_post.post.data))
            items.append(layer)
        paginator = Paginator(self.stage, items, self.data.pager_post)
        self.change_layer([self.layers.view_post.layer] +
                          paginator.get_layers() + [self.layers.logged.layer])
コード例 #6
0
 def create_layers(self, data):
     class ExtraLayers:
         pass
     layers = ExtraLayers()
     layer_list = []
     for layer in data:
         new_layer = Layer()
         layer_list.append(new_layer)
         if "name" in layer:
             setattr(layers, layer["name"], new_layer)
         items = self.create_items_from_yaml(layer["items"])
         if items:
             for item in items:
                 new_layer.add(item)
     return layers, layer_list
コード例 #7
0
class TestsViewer():
    def __init__(self, stage, tests):
        self.layer = Layer()
        self.stage = stage
        self.tests = tests
        data = DictClass(load(file('data/common/tests_viewer.yaml')))
        layers = [test.get_layer() for test in tests]
        self.paginator = Paginator(self.stage, layers,
                                   data.get("pagination", None))
        for item in self.stage.create_items_from_yaml(data.other, self):
            self.layer.add(item)

    def handle_confirm(self, item, args):
        failed = 0
        for test in self.tests:
            if not test.check():
                failed += 1
        if failed:
            fail_dialog = Fail(self.stage, failed)
            fail_dialog.start()
        else:
            self.stop()
            win = Win(self.stage)
            win.start()

    def handle_close(self, item, args):
        self.stop()

    def exit(self):
        self.paginator.exit()
        self.paginator = None
        self.stage = None
        self.layer.exit()
        self.layer = None
        for test in self.tests:
            test.exit()
        self.tests = None

    def stop(self):
        for layer in self.paginator.get_layers():
            self.stage.remove_layer(layer)
        self.stage.close_dialog(self.layer)

    def start(self):
        self.stage.show_dialog(self.layer, None)
        for layer in self.paginator.get_layers():
            self.stage.add_layer(layer)
コード例 #8
0
 def __init__(self, stage, on_no=None):
     self.stage = stage
     layer = self.layer = Layer()
     data = load(file('data/common/quit_dialog.yaml'))
     items = stage.create_items_from_yaml(data['items'], self)
     self.on_no = on_no
     for item in items:
         layer.add(item)
コード例 #9
0
 def __init__(self, stage, title, text):
     self.layer = Layer()
     self.stage = stage
     data = DictClass(load(file('data/common/content_viewer.yaml')))
     title_item = self.title_text = stage.create_text(data.title)[0]
     title_item.set_top(data.container.top)
     self.title_text.set_text(title)
     text_top = title_item.get_top() + title_item.get_height() + 10
     text_height = data.container.height - (text_top - data.container.top)
     self.close = stage.create_button(data.close, self)[0]
     self.__load_items(text, data, text_top, text_height)
     self.paginator = Paginator(self.stage, self.items,
                                data.get("pagination", None))
     for item in self.stage.create_items_from_yaml(data.other):
         self.layer.add(item)
     self.layer.add(self.title_text)
     self.layer.add(self.close)
コード例 #10
0
 def show_items(self, items):
     if items:
         if hasattr(self, "actual_layer") and self.actual_layer:
             self.actual_layer.exit()
         self.actual_layer = Layer()
         layer = self.actual_layer
         for item in items:
             layer.add(item)
         self.add_layer(layer)
コード例 #11
0
 def __init__(self, stage, on_ok=None):
     self.stage = stage
     layer = self.layer = Layer()
     data = self.get_data()
     items = stage.create_items_from_yaml(data['items'], self)
     self.on_ok = on_ok
     self.items = DictClass()
     for item in items:
         layer.add(item)
     self.message = stage.create_item(data["message"])[0]
     layer.add(self.message)
コード例 #12
0
 def __init__(self, stage):
     self.layer = Layer()
     self.stage = stage
     data = DictClass(load(file('data/common/games_viewer.yaml')))
     for item in stage.create_items_from_yaml(data.other):
         self.layer.add(item)
     self.close = stage.create_button(data.close, self)[0]
     self.layer.add(self.close)
     quantity = stage.game.datastore.datamodel.unlocked_level - 1
     if quantity == 1:
         data.header['text'] = data.header.singular.pre + str(
             quantity) + data.header.singular.pos
     else:
         data.header['text'] = data.header.plural.pre + str(
             quantity) + data.header.plural.pos
     self.header = stage.create_text(data.header)[0]
     self.layer.add(self.header)
     self.footer = stage.create_text(data.footer)[0]
     for data_game in data.games:
         Game(stage, self.layer, data_game, self.footer)
コード例 #13
0
class Content():
    def __init__(self, stage, title, text):
        self.layer = Layer()
        self.stage = stage
        data = DictClass(load(file('data/common/content_viewer.yaml')))
        title_item = self.title_text = stage.create_text(data.title)[0]
        title_item.set_top(data.container.top)
        self.title_text.set_text(title)
        text_top = title_item.get_top() + title_item.get_height() + 10
        text_height = data.container.height - (text_top - data.container.top)
        self.close = stage.create_button(data.close, self)[0]
        self.__load_items(text, data, text_top, text_height)
        self.paginator = Paginator(self.stage, self.items,
                                   data.get("pagination", None))
        for item in self.stage.create_items_from_yaml(data.other):
            self.layer.add(item)
        self.layer.add(self.title_text)
        self.layer.add(self.close)

    def __load_items(self, text, data, top, height):
        self.items = []

        def create_text(stage, next, text, top, height):
            text_item = stage.create_text(data.text)[0]
            text_item.break_text_into(next)
            text_item.set_text(text)
            text_item.set_top(top)
            text_item.set_dimensions(data.text.width, height)
            text_item.break_text_into(None)
            return text_item

        # Usamos una clase que tiene el metodo set_text para saber si hay que dividir el texto
        class Next:
            def __init__(self):
                self.text = None

            def set_text(self, text):
                self.text = text

        next = Next()
        layer = Layer()
        layer.add(create_text(self.stage, next, text, top, height))
        self.items.append(layer)
        while next.text:
            layer = Layer()
            layer.add(create_text(self.stage, next, next.text, top, height))
            self.items.append(layer)

    def handle_close(self, item, args):
        self.stop()

    def stop(self):
        for layer in self.paginator.get_layers():
            self.stage.remove_layer(layer)
        self.stage.close_dialog(self.layer)

    def start(self):
        self.stage.show_dialog(self.layer, None)
        for layer in self.paginator.get_layers():
            self.stage.add_layer(layer)
コード例 #14
0
ファイル: map.py プロジェクト: sugar-activities/4444-activity
 def prepare(self):
     data = DictClass(load(file('data/map/common.yaml')))
     self.gui = Layer()
     for item in self.create_items_from_yaml(data.gui):
         self.gui.add(item)
     self.create_selected_map_character(data.character)
     self.load_quadrant()
     self.tests_counter = self.create_text(data.counters.tests)[0]
     self.backpack_counter = self.create_text(data.counters.backpack)[0]
     self.games_counter = self.create_text(data.counters.games)[0]
     self.gui.add(self.tests_counter)
     self.gui.add(self.backpack_counter)
     self.gui.add(self.games_counter)
     self.backpack_counter.set_text(
         str(
             len(self.game.datastore.datamodel.backpack[
                 self.game.datastore.datamodel.level - 1])))
     self.tests_counter.set_text(
         str(
             len(self.game.datastore.levels[
                 self.game.datastore.datamodel.level].tests)))
     self.games_counter.set_text(
         str(self.game.datastore.datamodel.unlocked_level - 1))
コード例 #15
0
    def __init__(self, stage):
        self.stage = stage
        layer = self.layer = Layer()
        data = DictClass(load(file('data/common/next_level.yaml')))
        items = stage.create_items_from_yaml(data.other, self)
        for item in items:
            layer.add(item)
        text = stage.create_text(data.text)[0]
        text.set_text(
            data.text.texts[self.stage.game.datastore.datamodel.level])
        layer.add(text)

        # Load the sound
        item_found_sound = assets.load_sound('DGI_item_found.ogg')
        item_found_sound.play()
コード例 #16
0
    def __init__(self, stage):
        global DEFAULT_NAME, DEFAULT_ROOM

        self.go_to_last = False
        self.dialog = None
        self.paginator = None
        self.background = Layer()
        self.foreground = Layer()
        self.focus_group = FocusGroup()
        self.stage = stage
        self.current_callback = None
        self.current_id = None
        data = self.data = DictClass(load(file('data/common/activity.yaml')))
        self.clock_image = ItemImage(0, 0, assets.load_image(data.clock.src))
        layers = self.layers = DictClass()
        for k, i in data.layers.items():
            layers[k] = self.create_items(i)
        self.layers.main.name_input.set_focus_group(self.focus_group)
        self.layers.main.name_input.set_on_enter(self.handle_next)
        self.layers.main.name_input.set_text(DEFAULT_NAME)
        self.layers.main.room_input.set_focus_group(self.focus_group)
        self.layers.main.room_input.set_on_enter(self.handle_next)
        self.layers.main.room_input.set_text(DEFAULT_ROOM)
        self.current_layers = [layers.main.layer]
        text_box = self.layers.post.text_box = self.create_text_box(
            data.text_box)
        self.layers.post.layer.add(text_box)

        for item in self.stage.create_items_from_yaml(data["background"],
                                                      self):
            self.background.add(item)
        for item in self.stage.create_items_from_yaml(data["foreground"],
                                                      self):
            self.foreground.add(item)

        self.stage.start_timer('msgclock', 15000, self.update_messages_tick)
コード例 #17
0
    def __init__(self, stage, amount):
        self.stage = stage
        layer = self.layer = Layer()
        self.amount = amount
        data = DictClass(load(file('data/common/fail_tests.yaml')))
        text = stage.create_text(data.text)[0]
        if amount == 1:
            text.set_text(data.text.singular)
        else:
            text.set_text(data.text.plural % dict(amount=amount))
        items = stage.create_items_from_yaml(data.other, self)
        for item in items:
            layer.add(item)
        layer.add(text)

        # Load the sound
        wrong_sound = assets.load_sound('DGI_wrong.ogg')
        wrong_sound.play()
コード例 #18
0
 def __init__(self, stage, title, description, data):
     self.stage = stage
     layer = self.layer = Layer()
     if title:
         title_item = stage.create_text(data.title)[0]
         title.set_top(data.top_container.top)
         title_item.set_text(title)
         layer.add(title_item)
     else:
         title_item = Item(0, data.top_container.top, 0, 0)
     if description:
         description_item = self.description = stage.create_text(
             data.description)[0]
         extra = 0
         if title:
             extra = data.top_container.after_title
         description_item.set_top(title_item.get_top() +
                                  title_item.get_height() + extra)
         description_item.set_text(description)
         layer.add(description_item)
     else:
         self.description = Item(
             0,
             title_item.get_top() + title_item.get_height(), 0, 0)
コード例 #19
0
class Intro:
    def __init__(self, stage, data, next_cb):
        self.next_cb = next_cb
        self.layer = Layer()
        self.stage = stage
        self.layer.add(stage.create_image(data.intro)[0])
        self.layer.add(stage.create_button(data.next, self)[0])

    def stop(self):
        self.stage.close_dialog(self.layer)

    def start(self):
        self.stage.show_dialog(self.layer, None)

    def handle_next(self, *args, **kwargs):
        self.stop()
        self.next_cb()
        self.next_cb = None
        self.layer.exit()
        self.stage = None
コード例 #20
0
    def __init__(self, stage, items, optional_data=None):
        self.layer = Layer()
        self.items_layer = Layer()
        self.items = items
        self.stage = stage
        from yaml import load
        data = load(file('data/common/pagination.yaml'))
        if optional_data is not None:
            data.update(optional_data)
        self.current = 1
        if len(self.items):
            self.current_layer = self.items[0]
        else:
            self.current_layer = Layer()
        self.min = 1
        self.max = len(self.items)
        self.count = len(self.items)
        for item in items:
            item.set_visible(False)
        self.previous = stage.create_button(data["previous"], self)[0]
        self.next = stage.create_button(data["next"], self)[0]
        self.last = None
        if "last" in data:
            self.last = stage.create_button(data["last"], self)[0]
        if "page_count" in data and data["page_count"]:
            self.page_count_text = stage.create_text(data["page_count"])[0]
            self.page_count_base_text = data["page_count"]["text"]
        else:
            self.page_count_text = None
        self.update_page_count()
        self.update_items()
        self.update_buttons()

        self.layer.add(self.previous)
        self.layer.add(self.next)
        if self.page_count_text:
            self.layer.add(self.page_count_text)
        if self.last:
            self.layer.add(self.last)
コード例 #21
0
class MemoryMinigame(GameStage):
    GO_BACK_TIME = 3000
    ONE_SECOND_INTERVAL = 1000

    def __init__(self, game):
        GameStage.__init__(self, game)

    def initialize(self):
        GameStage.initialize(self)
        stream = file('data/fonts.yaml', 'r')
        fonts = load(stream)
        for font in fonts:
            setattr(
                self, font,
                assets.load_font(fonts[font]['file_name'],
                                 fonts[font]['size']))

        self.data = DictClass(load(file('data/memory.yaml')))

        self.game_over_layer = Layer()
        image = assets.load_image(
            self.data.game_over[self.game.datastore.datamodel.character].src)
        item = ItemImage(self.data.game_over.left, self.data.game_over.top,
                         image)
        self.game_over_layer.add(item)

        self.main_layer = Layer()
        self.top_layer = Layer()

        self.time = self.data.time.max
        self.timer = DictClass({})
        image = assets.load_image(self.data.time.src)
        self.timer['skin'] = ItemImage(self.data.time.left, self.data.time.top,
                                       image)
        self.timer['value'] = ItemText(self.data.time.left,
                                       self.data.time.top,
                                       self.font,
                                       0,
                                       format_time(self.time),
                                       width=image.get_width(),
                                       height=image.get_height(),
                                       h_align=2,
                                       v_align=2)
        self.top_layer.add(self.timer.skin)
        self.top_layer.add(self.timer.value)

        self.score = 0
        self.score_board = DictClass({})
        image = assets.load_image(self.data.score.src)
        self.score_board['skin'] = ItemImage(self.data.score.left,
                                             self.data.score.top, image)
        self.score_board['value'] = ItemText(self.data.score.left,
                                             self.data.score.top,
                                             self.font,
                                             0,
                                             str(self.score),
                                             width=image.get_width(),
                                             height=image.get_height(),
                                             h_align=2,
                                             v_align=2)
        self.top_layer.add(self.score_board.skin)
        self.top_layer.add(self.score_board.value)

        self.deck = []
        image_back = assets.load_image(self.data.board.card_back)
        for k in range(0, len(self.data.board.cards)):
            image = assets.load_image(self.data.board.cards[k])
            self.deck.append([
                Card(self, k, image, image_back),
                Card(self, k, image, image_back)
            ])

        self.range = self.data.start
        self.cards = []
        self.deal()

        # Load the sound
        self.card_flip_sound = assets.load_sound('DGI_card_flip.ogg')
        self.item_found_sound = assets.load_sound('DGI_item_found.ogg')
        self.wrong_sound = assets.load_sound('DGI_wrong.ogg')
        self.lose_bell_sound = assets.load_sound('DGI_lose_bell.ogg')
        self.lose_music_sound = assets.load_sound('DGI_lose_music.ogg')

    def deal(self):
        self.first = None
        self.second = None

        for k in range(0, self.range):
            self.cards.append(self.deck[k][0])
            self.cards.append(self.deck[k][1])
        random.shuffle(self.cards)

        d = ceil(sqrt(2 * self.range))
        for i, card in zip(range(2 * self.range), self.cards):
            card.item.set_left(self.data.board.left + card.item.get_width() *
                               (i % d))
            card.item.set_top(self.data.board.top +
                              card.item.get_height() * int(i / d))
            self.main_layer.add(card.item)

    def select(self, card):
        self.card_flip_sound.play()
        if not self.second:
            if self.first:
                if self.first != card:
                    self.second = card
                    card.select()
                    self.start_timer(1, 500, self.check_match)
            else:
                self.first = card
                card.select()

    def check_match(self, key, data):
        self.stop_timer(1)
        if self.first.key == self.second.key:
            self.item_found_sound.play()
            self.cards.remove(self.first)
            self.cards.remove(self.second)
            self.main_layer.remove(self.first.item)
            self.main_layer.remove(self.second.item)
            self.score += self.data.score.points
            self.score_board.value.set_text(str(self.score))
        else:
            self.wrong_sound.play()
        self.first.unselect()
        self.second.unselect()
        self.first = self.second = None
        if len(self.cards) == 2:
            self.first = self.cards[0]
            self.second = self.cards[1]
            self.first.select()
            self.second.select()
            self.start_timer(1, 500, self.check_match)
        elif not self.cards:
            if self.range + self.data.step <= len(self.deck):
                self.range += self.data.step
            self.deal()

    def prepare(self):
        self.show_board()
        dialog = Intro(self, self.data.intro, self.start_game)
        dialog.start()

    def start_game(self):
        self.start_timer(0, self.ONE_SECOND_INTERVAL, self.update_time)

    def update_time(self, key, data):
        self.time -= 1
        self.timer.value.set_text(format_time(self.time))
        if not self.time:
            self.game_over()

    def show_board(self):
        self.add_layer(self.main_layer)
        self.add_layer(self.top_layer)

    def game_over(self):
        self.lose_bell_sound.play()
        self.lose_music_sound.play()
        self.stop_timer(0)
        for card in self.cards:
            card.item.remove_event_handler(ItemEvent.CLICK, card.handle_click)
        self.add_layer(self.game_over_layer)
        self.start_timer("go_back_timer", self.GO_BACK_TIME, self.go_back)

    def exit(self, other_item):
        GameStage.exit(self, other_item)
        for card1, card2 in self.deck:
            card1.exit()
            card2.exit()
        self.deck = None
        self.cards = None

    def go_back(self, *args, **kwargs):
        from game.stages.map import Map
        self.game.set_stage(Map(self.game))
コード例 #22
0
    def load_items(self, data, items):
        layer = Layer()

        left = self.data.post_box.left
        top = self.data.post_box.top
        cant_items = 0
        i = 0
        for item in data:
            if cant_items >= self.data.post_box.items_per_page:
                items.append(layer)
                layer = Layer()
                top = self.data.post_box.top
                cant_items = 0
            self.stage._items_manager = self
            text_item = self.stage.create_item(self.data.post_item)[0]
            text_item.data_item = item
            text_item.set_top(top)
            text_item.set_left(left)

            def set_post_text(text_item, text):
                next = Next()
                set_text(next, text, text_item)
                if next.text:
                    new_dict = dict(self.data.post_item)
                    new_dict["width"] = -1
                    ellipsis = self.stage.create_item(new_dict)[0]
                    ellipsis.set_text("...")
                    ellipsis.set_top(text_item.get_top())
                    ellipsis.set_left(text_item.get_left() +
                                      text_item.lines[0])
                    return ellipsis
                return None

            def on_enter(text_item, *args, **kwargs):
                item = text_item.data_item
                text_item.set_text("&#c200,0,0!%s&#c!: %s" %
                                   (item.author_name, item.text))

            def on_leave(text_item, *args, **kwargs):
                item = text_item.data_item
                text_item.set_text("&#c58,129,188!%s&#c!: %s" %
                                   (item.author_name, item.text))

            text_item.add_event_handler(ItemEvent.MOUSE_ENTER, on_enter)
            text_item.add_event_handler(ItemEvent.MOUSE_LEAVE, on_leave)
            text_item.add_event_handler(ItemEvent.CLICK,
                                        self.handle_post_click)
            text_item.post_id = item.id
            text_item.post_index = i
            self.stage._items_manager = None
            other_item = set_post_text(
                text_item,
                "&#c58,129,188!%s&#c!: %s" % (item.author_name, item.text))
            if other_item:
                layer.add(other_item)
            layer.add(text_item)
            top += self.data.post_box.inter_line
            cant_items += 1
            i += 1

        if len(layer.items) > 0:
            items.append(layer)
コード例 #23
0
class Activity():
    def __init__(self, stage):
        global DEFAULT_NAME, DEFAULT_ROOM

        self.go_to_last = False
        self.dialog = None
        self.paginator = None
        self.background = Layer()
        self.foreground = Layer()
        self.focus_group = FocusGroup()
        self.stage = stage
        self.current_callback = None
        self.current_id = None
        data = self.data = DictClass(load(file('data/common/activity.yaml')))
        self.clock_image = ItemImage(0, 0, assets.load_image(data.clock.src))
        layers = self.layers = DictClass()
        for k, i in data.layers.items():
            layers[k] = self.create_items(i)
        self.layers.main.name_input.set_focus_group(self.focus_group)
        self.layers.main.name_input.set_on_enter(self.handle_next)
        self.layers.main.name_input.set_text(DEFAULT_NAME)
        self.layers.main.room_input.set_focus_group(self.focus_group)
        self.layers.main.room_input.set_on_enter(self.handle_next)
        self.layers.main.room_input.set_text(DEFAULT_ROOM)
        self.current_layers = [layers.main.layer]
        text_box = self.layers.post.text_box = self.create_text_box(
            data.text_box)
        self.layers.post.layer.add(text_box)

        for item in self.stage.create_items_from_yaml(data["background"],
                                                      self):
            self.background.add(item)
        for item in self.stage.create_items_from_yaml(data["foreground"],
                                                      self):
            self.foreground.add(item)

        self.stage.start_timer('msgclock', 15000, self.update_messages_tick)

    def create_items(self, data):
        items = DictClass()
        layer = Layer()
        self.stage._items_manager = self
        for i in data:
            item = items[i.name] = self.stage.create_item(i)[0]
            item.data = i
            layer.add(item)
        self.stage._items_manager = None
        items["layer"] = layer
        return items

    def change_layer(self, new_layers):
        for layer in self.current_layers:
            self.stage.remove_layer(layer)
        self.stage.remove_layer(self.foreground)
        self.current_layers = new_layers
        for layer in self.current_layers:
            self.stage.add_layer(layer)
        self.stage.add_layer(self.foreground)

    def handle_back(self, *args, **kwargs):
        if self.current_callback:
            return
        if self.layers.room.layer in self.current_layers:
            self.change_layer([self.layers.main.layer])
        if self.layers.post.layer in self.current_layers \
            or self.layers.view_post.layer in self.current_layers:
            self.change_layer([self.layers.room.layer] +
                              self.paginator.get_layers() +
                              [self.layers.logged.layer])

    def handle_refresh(self, item, args):
        self.refresh_messages()

    def update_messages_tick(self, key, data):
        if self.paginator != None:
            self.refresh_messages(False)

    def refresh_messages(self, show_clock=True):
        callback = get_web_cb(self, self.refresh_cb, show_clock)
        web.query(WEB_DIR_ACT % self.layers.main.room_input.get_text(),
                  callback=callback)

    @web_callback
    def refresh_cb(self, result):
        if result.error:
            return

        data = [DictClass(item) for item in result.data["posts"]]

        # Check if the data change, only update the screen if changed
        if data != self.posts:
            self.posts = data

            items = []
            self.load_items(self.posts, items)

            current = self.paginator.get_current()
            self.paginator = Paginator(self.stage, items, self.data.pager)
            self.paginator.go_to(current)
            self.change_layer([self.layers.room.layer] +
                              self.paginator.get_layers() +
                              [self.layers.logged.layer])

    def handle_post(self, *args, **kwargs):
        if self.current_callback:
            return
        web.send_data(WEB_DIR_NEW_POST %
                      self.layers.main.room_input.get_text(), {
                          "post[author_name]":
                          unicode(self.layers.main.name_input.get_text(),
                                  "latin-1").encode("utf-8"),
                          "post[machine_id]":
                          "id",
                          "post[text]":
                          unicode(self.layers.post.text_box.get_text(),
                                  "latin-1").encode("utf-8")
                      },
                      callback=get_web_cb(self, self.post_web_cb))

    @web_callback
    def post_web_cb(self, result):
        if result.error:
            self.error_try_again_later()
            return
        self.layers.post.text_box.text("")
        self.go_to_last = True
        self.go_to_room()

    def go_to_room(self):
        if self.current_callback:
            return

        global DEFAULT_NAME, DEFAULT_ROOM
        DEFAULT_NAME = self.layers.main.name_input.get_text()
        DEFAULT_ROOM = self.layers.main.room_input.get_text()

        web.query(WEB_DIR_ACT % self.layers.main.room_input.get_text(),
                  callback=get_web_cb(self, self.go_to_room_web_cb))

    @web_callback
    def go_to_room_web_cb(self, result):
        if result.error:
            if result.error == web.Error.SERVER and result.code == 404:
                self.the_room_doesnt_exist()
            else:
                self.error_try_again_later()
            return

        data = DictClass(result.data)
        self.title = data.title
        self.layers.room.title.set_text(self.title)
        self.layers.room.description.set_text(data.description)
        self.layers.room.code.set_text(self.layers.room.code.data.text %
                                       self.layers.main.room_input.get_text())
        self.layers.logged.login_name.set_text(
            self.layers.main.name_input.get_text())
        data = [DictClass(item) for item in data.posts]
        self.posts = data

        items = []
        self.load_items(data, items)

        self.paginator = Paginator(self.stage, items, self.data.pager)
        if self.go_to_last:
            self.go_to_last = False
            self.paginator.go_to_last()
        self.change_layer([self.layers.room.layer] +
                          self.paginator.get_layers() +
                          [self.layers.logged.layer])

    def load_items(self, data, items):
        layer = Layer()

        left = self.data.post_box.left
        top = self.data.post_box.top
        cant_items = 0
        i = 0
        for item in data:
            if cant_items >= self.data.post_box.items_per_page:
                items.append(layer)
                layer = Layer()
                top = self.data.post_box.top
                cant_items = 0
            self.stage._items_manager = self
            text_item = self.stage.create_item(self.data.post_item)[0]
            text_item.data_item = item
            text_item.set_top(top)
            text_item.set_left(left)

            def set_post_text(text_item, text):
                next = Next()
                set_text(next, text, text_item)
                if next.text:
                    new_dict = dict(self.data.post_item)
                    new_dict["width"] = -1
                    ellipsis = self.stage.create_item(new_dict)[0]
                    ellipsis.set_text("...")
                    ellipsis.set_top(text_item.get_top())
                    ellipsis.set_left(text_item.get_left() +
                                      text_item.lines[0])
                    return ellipsis
                return None

            def on_enter(text_item, *args, **kwargs):
                item = text_item.data_item
                text_item.set_text("&#c200,0,0!%s&#c!: %s" %
                                   (item.author_name, item.text))

            def on_leave(text_item, *args, **kwargs):
                item = text_item.data_item
                text_item.set_text("&#c58,129,188!%s&#c!: %s" %
                                   (item.author_name, item.text))

            text_item.add_event_handler(ItemEvent.MOUSE_ENTER, on_enter)
            text_item.add_event_handler(ItemEvent.MOUSE_LEAVE, on_leave)
            text_item.add_event_handler(ItemEvent.CLICK,
                                        self.handle_post_click)
            text_item.post_id = item.id
            text_item.post_index = i
            self.stage._items_manager = None
            other_item = set_post_text(
                text_item,
                "&#c58,129,188!%s&#c!: %s" % (item.author_name, item.text))
            if other_item:
                layer.add(other_item)
            layer.add(text_item)
            top += self.data.post_box.inter_line
            cant_items += 1
            i += 1

        if len(layer.items) > 0:
            items.append(layer)

    def handle_next(self, *args, **kwargs):
        if self.dialog:
            return
        self.paginator = None
        self.layers.main.name_input.set_text(
            self.layers.main.name_input.get_text().strip())
        self.layers.main.room_input.set_text(
            self.layers.main.room_input.get_text().strip())
        if not self.layers.main.name_input.get_text(
        ) or not self.layers.main.room_input.get_text():
            self.fill_inputs()
            return
        self.go_to_room()

    def handle_next_post(self, *args, **kwargs):
        self.current_post += 1
        self.update_post_buttons()
        web.query(WEB_DIR_POST % (self.layers.main.room_input.get_text(),
                                  self.posts[self.current_post].id),
                  callback=get_web_cb(self, self.view_post_web_cb))

    def handle_previous_post(self, *args, **kwargs):
        self.current_post -= 1
        self.update_post_buttons()
        web.query(WEB_DIR_POST % (self.layers.main.room_input.get_text(),
                                  self.posts[self.current_post].id),
                  callback=get_web_cb(self, self.view_post_web_cb))

    def update_post_buttons(self):
        view_post = self.layers.view_post
        if self.current_post > 0:
            view_post.previous_post.set_visible(True)
        else:
            view_post.previous_post.set_visible(False)
        if self.current_post < len(self.posts) - 1:
            view_post.next_post.set_visible(True)
        else:
            view_post.next_post.set_visible(False)
        view_post.post_count.set_text(self.data.pager.page_count.text % {
            "page": self.current_post + 1,
            "total": len(self.posts)
        })

    def handle_post_click(self, item, *args, **kwargs):
        if self.current_callback:
            return
        self.current_post = item.post_index
        self.update_post_buttons()
        web.query(WEB_DIR_POST %
                  (self.layers.main.room_input.get_text(), item.post_id),
                  callback=get_web_cb(self, self.view_post_web_cb))

    @web_callback
    def post_message_cb(self, result):
        if result.error:
            self.error_try_again_later()
            self.change_layer([self.layers.room.layer] +
                              self.paginator.get_layers() +
                              [self.layers.logged.layer])
            return
        self.go_to_room()

    @web_callback
    def view_post_web_cb(self, result):
        if result.error:
            self.error_try_again_later()
            return
        data = DictClass(result.data)
        self.layers.view_post.title.set_text(self.title)
        self.layers.view_post.author.set_text(data.author_name + ":")
        # Usamos una clase que tiene el metodo set_text para saber si hay que dividir el texto
        items = []
        next = Next()
        layer = Layer()

        def create_text(stage, next, text, data):
            text_item = stage.create_text(data)[0]
            set_text(next, text, text_item)
            return text_item

        layer.add(
            create_text(self.stage, next, data.text,
                        self.layers.view_post.post.data))
        items.append(layer)
        while next.text:
            layer = Layer()
            layer.add(
                create_text(self.stage, next, next.text,
                            self.layers.view_post.post.data))
            items.append(layer)
        paginator = Paginator(self.stage, items, self.data.pager_post)
        self.change_layer([self.layers.view_post.layer] +
                          paginator.get_layers() + [self.layers.logged.layer])

    def handle_new_post(self, *args, **kwargs):
        self.layers.post.title.set_text(self.title)
        self.change_layer([self.layers.post.layer] +
                          [self.layers.logged.layer])
        self.layers.post.text_box.begin()
        pass

    def handle_close(self, item, args):
        self.current_id = None
        self.stage.reset_mouse_cursor()
        self.stop()

    def create_text_box(self, data):
        return TextBox(data.left, data.top, data.width, data.height,
                       getattr(self.stage, data.font), eval(data.color))

    def stop(self):
        for layer in self.current_layers:
            self.stage.remove_layer(layer)
        self.stage.remove_layer(self.foreground)
        self.stage.close_dialog(self.background)
        self.stage.stop_timer('msgclock')

    def start(self):
        self.stage.show_dialog(self.background, None)
        for layer in self.current_layers:
            self.stage.add_layer(layer)
        self.stage.add_layer(self.foreground)
        self.layers.main.room_input.set_editable(True)
        self.layers.main.room_input.set_edit_on_click(
            self.layers.main.room_input)
        self.layers.main.name_input.set_editable(True)
        self.layers.main.name_input.set_edit_on_click(
            self.layers.main.name_input)
        self.layers.main.name_input.begin_edit()

    def on_exit_dialog(self):
        self.dialog = None

    def error_try_again_later(self):
        self.dialog = dialog = ErrorDialog(self.stage, self.on_exit_dialog)
        dialog.set_message(self.data.messages.unknown)
        dialog.start()

    def the_room_doesnt_exist(self):
        self.dialog = dialog = ErrorDialog(self.stage, self.on_exit_dialog)
        dialog.set_message(self.data.messages.no_activity)
        dialog.start()

    def fill_inputs(self):
        self.dialog = dialog = ErrorDialog(self.stage, self.on_exit_dialog)
        dialog.set_message(self.data.messages.fill_inputs)
        dialog.start()
コード例 #24
0
    def initialize(self):
        GameStage.initialize(self)
        stream = file('data/fonts.yaml', 'r')
        fonts = load(stream)
        for font in fonts:
            setattr(
                self, font,
                assets.load_font(fonts[font]['file_name'],
                                 fonts[font]['size']))

        self.data = DictClass(load(file('data/asteroids.yaml')))

        self.game_over_layer = Layer()
        image = assets.load_image(
            self.data.game_over[self.game.datastore.datamodel.character].src)
        item = ItemImage(self.data.game_over.left, self.data.game_over.top,
                         image)
        self.game_over_layer.add(item)

        self.main_layer = Layer()
        self.top_layer = Layer()

        self.time = self.data.time.max
        self.timer = DictClass({})
        image = assets.load_image(self.data.time.src)
        self.timer['skin'] = ItemImage(self.data.time.left, self.data.time.top,
                                       image)
        self.timer['value'] = ItemText(self.data.time.left,
                                       self.data.time.top,
                                       self.font,
                                       0,
                                       format_time(self.time),
                                       width=image.get_width(),
                                       height=image.get_height(),
                                       h_align=2,
                                       v_align=2)
        self.top_layer.add(self.timer.skin)
        self.top_layer.add(self.timer.value)

        self.score = 0
        self.score_board = DictClass({})
        image = assets.load_image(self.data.score.src)
        self.score_board['skin'] = ItemImage(self.data.score.left,
                                             self.data.score.top, image)
        self.score_board['value'] = ItemText(self.data.score.left,
                                             self.data.score.top,
                                             self.font,
                                             0,
                                             str(self.score),
                                             width=image.get_width(),
                                             height=image.get_height(),
                                             h_align=2,
                                             v_align=2)
        self.top_layer.add(self.score_board.skin)
        self.top_layer.add(self.score_board.value)

        self.level = self.data.start
        self.asteroids = []

        self.max_width = 0
        self.max_height = 0
        for a in self.data.asteroids:
            item = assets.load_image(a)
            if self.max_width < item.get_width():
                self.max_width = item.get_width()
            if self.max_height < item.get_height():
                self.max_height = item.get_height()
        self.max_col = int(SCREEN_WIDTH / self.max_width)
        self.max_row = int(SCREEN_HEIGHT / self.max_height)
        self.margin_left = (SCREEN_WIDTH % self.max_width) / 2
        self.margin_top = (SCREEN_HEIGHT % self.max_height) / 2

        # Load the sound
        self.click_sound = assets.load_sound('DGI_Click.ogg')
        self.item_found_sound = assets.load_sound('DGI_item_found.ogg')
        self.wrong_sound = assets.load_sound('DGI_wrong.ogg')
        self.lose_bell_sound = assets.load_sound('DGI_lose_bell.ogg')
        self.lose_music_sound = assets.load_sound('DGI_lose_music.ogg')
コード例 #25
0
    def initialize(self):
        GameStage.initialize(self)
        stream = file('data/fonts.yaml', 'r')
        fonts = load(stream)
        for font in fonts:
            setattr(
                self, font,
                assets.load_font(fonts[font]['file_name'],
                                 fonts[font]['size']))

        self.data = DictClass(load(file('data/memory.yaml')))

        self.game_over_layer = Layer()
        image = assets.load_image(
            self.data.game_over[self.game.datastore.datamodel.character].src)
        item = ItemImage(self.data.game_over.left, self.data.game_over.top,
                         image)
        self.game_over_layer.add(item)

        self.main_layer = Layer()
        self.top_layer = Layer()

        self.time = self.data.time.max
        self.timer = DictClass({})
        image = assets.load_image(self.data.time.src)
        self.timer['skin'] = ItemImage(self.data.time.left, self.data.time.top,
                                       image)
        self.timer['value'] = ItemText(self.data.time.left,
                                       self.data.time.top,
                                       self.font,
                                       0,
                                       format_time(self.time),
                                       width=image.get_width(),
                                       height=image.get_height(),
                                       h_align=2,
                                       v_align=2)
        self.top_layer.add(self.timer.skin)
        self.top_layer.add(self.timer.value)

        self.score = 0
        self.score_board = DictClass({})
        image = assets.load_image(self.data.score.src)
        self.score_board['skin'] = ItemImage(self.data.score.left,
                                             self.data.score.top, image)
        self.score_board['value'] = ItemText(self.data.score.left,
                                             self.data.score.top,
                                             self.font,
                                             0,
                                             str(self.score),
                                             width=image.get_width(),
                                             height=image.get_height(),
                                             h_align=2,
                                             v_align=2)
        self.top_layer.add(self.score_board.skin)
        self.top_layer.add(self.score_board.value)

        self.deck = []
        image_back = assets.load_image(self.data.board.card_back)
        for k in range(0, len(self.data.board.cards)):
            image = assets.load_image(self.data.board.cards[k])
            self.deck.append([
                Card(self, k, image, image_back),
                Card(self, k, image, image_back)
            ])

        self.range = self.data.start
        self.cards = []
        self.deal()

        # Load the sound
        self.card_flip_sound = assets.load_sound('DGI_card_flip.ogg')
        self.item_found_sound = assets.load_sound('DGI_item_found.ogg')
        self.wrong_sound = assets.load_sound('DGI_wrong.ogg')
        self.lose_bell_sound = assets.load_sound('DGI_lose_bell.ogg')
        self.lose_music_sound = assets.load_sound('DGI_lose_music.ogg')
コード例 #26
0
class AsteroidsMinigame(GameStage):
    GO_BACK_TIME = 3000
    ONE_SECOND_INTERVAL = 1000
    MARGIN = 70

    def __init__(self, game):
        GameStage.__init__(self, game)

    def initialize(self):
        GameStage.initialize(self)
        stream = file('data/fonts.yaml', 'r')
        fonts = load(stream)
        for font in fonts:
            setattr(
                self, font,
                assets.load_font(fonts[font]['file_name'],
                                 fonts[font]['size']))

        self.data = DictClass(load(file('data/asteroids.yaml')))

        self.game_over_layer = Layer()
        image = assets.load_image(
            self.data.game_over[self.game.datastore.datamodel.character].src)
        item = ItemImage(self.data.game_over.left, self.data.game_over.top,
                         image)
        self.game_over_layer.add(item)

        self.main_layer = Layer()
        self.top_layer = Layer()

        self.time = self.data.time.max
        self.timer = DictClass({})
        image = assets.load_image(self.data.time.src)
        self.timer['skin'] = ItemImage(self.data.time.left, self.data.time.top,
                                       image)
        self.timer['value'] = ItemText(self.data.time.left,
                                       self.data.time.top,
                                       self.font,
                                       0,
                                       format_time(self.time),
                                       width=image.get_width(),
                                       height=image.get_height(),
                                       h_align=2,
                                       v_align=2)
        self.top_layer.add(self.timer.skin)
        self.top_layer.add(self.timer.value)

        self.score = 0
        self.score_board = DictClass({})
        image = assets.load_image(self.data.score.src)
        self.score_board['skin'] = ItemImage(self.data.score.left,
                                             self.data.score.top, image)
        self.score_board['value'] = ItemText(self.data.score.left,
                                             self.data.score.top,
                                             self.font,
                                             0,
                                             str(self.score),
                                             width=image.get_width(),
                                             height=image.get_height(),
                                             h_align=2,
                                             v_align=2)
        self.top_layer.add(self.score_board.skin)
        self.top_layer.add(self.score_board.value)

        self.level = self.data.start
        self.asteroids = []

        self.max_width = 0
        self.max_height = 0
        for a in self.data.asteroids:
            item = assets.load_image(a)
            if self.max_width < item.get_width():
                self.max_width = item.get_width()
            if self.max_height < item.get_height():
                self.max_height = item.get_height()
        self.max_col = int(SCREEN_WIDTH / self.max_width)
        self.max_row = int(SCREEN_HEIGHT / self.max_height)
        self.margin_left = (SCREEN_WIDTH % self.max_width) / 2
        self.margin_top = (SCREEN_HEIGHT % self.max_height) / 2

        # Load the sound
        self.click_sound = assets.load_sound('DGI_Click.ogg')
        self.item_found_sound = assets.load_sound('DGI_item_found.ogg')
        self.wrong_sound = assets.load_sound('DGI_wrong.ogg')
        self.lose_bell_sound = assets.load_sound('DGI_lose_bell.ogg')
        self.lose_music_sound = assets.load_sound('DGI_lose_music.ogg')

    def prepare(self):
        self.show()
        self.add_layer(self.main_layer)
        self.add_layer(self.top_layer)
        dialog = Intro(self, self.data.intro, self.start_game)
        dialog.start()

    def start_game(self):
        self.start_timer(0, self.ONE_SECOND_INTERVAL, self.update_time)

    def show(self):
        if 'selector' in self.data.levels[self.level]:
            selector = eval(self.data.levels[self.level].selector)
            aux_seq = eval(self.data.levels[self.level][selector])
        else:
            aux_seq = eval(self.data.levels[self.level].range)

        self.sequence = []
        for value in range(0, self.data.levels[self.level].quantity):
            value = random.choice(aux_seq)
            aux_seq.remove(value)
            self.sequence.append(value)

        self.sequence = sorted(self.sequence)
        self.sequence.reverse()

        positions = range(0, self.max_col * self.max_row)

        for value in self.sequence:
            src = random.choice(self.data.asteroids)
            asteroid = Asteroid(self, 0, 0, src, value)

            position = random.choice(positions)
            positions.remove(position)
            i = int(position / self.max_col)
            j = int(position % self.max_col)
            left = self.margin_left + j * self.max_width + random.uniform(
                0, self.max_width % asteroid.item.get_width())
            top = self.margin_top + i * self.max_height + random.uniform(
                0, self.max_height % asteroid.item.get_height())

            asteroid.set_left(left)
            asteroid.set_top(top)
            self.asteroids.append(asteroid)
            self.main_layer.add(asteroid.item)
            self.main_layer.add(asteroid.text)

        if self.level + self.data.step <= self.data.max:
            self.level += self.data.step

    def select(self, asteroid):
        self.click_sound.play()
        expected = self.sequence.pop()
        if asteroid.value == expected:
            self.item_found_sound.play()
            self.score += self.data.score.points
            self.score_board.value.set_text(str(self.score))

            self.asteroids.remove(asteroid)
            self.main_layer.remove(asteroid.item)
            self.main_layer.remove(asteroid.text)
            asteroid.exit()
        else:
            self.wrong_sound.play()
            self.sequence.append(expected)
        if not self.asteroids:
            self.show()

    def update_time(self, key, data):
        self.time -= 1
        self.timer.value.set_text(format_time(self.time))
        if not self.time:
            self.game_over()

    def game_over(self):
        self.lose_bell_sound.play()
        self.lose_music_sound.play()
        self.stop_timer(0)
        for asteroid in self.asteroids:
            asteroid.item.remove_event_handler(ItemEvent.CLICK,
                                               asteroid.handle_click)
        self.add_layer(self.game_over_layer)
        self.start_timer("go_back_timer", self.GO_BACK_TIME, self.go_back)

    def go_back(self, *args, **kwargs):
        from game.stages.map import Map
        self.game.set_stage(Map(self.game))
コード例 #27
0
class BackPack:
    ITEMS_PER_PAGE = 5

    def __init__(self, stage, elements):
        self.stage = stage
        self.layer = Layer()
        self.elements_layer = Layer()
        from yaml import load
        data = load(file('data/common/backpack.yaml'))
        self.elements = elements
        self.close_button = stage.create_button(data["close"], self)[0]
        self.next_button = stage.create_button(data["next"], self)[0]
        self.previous_button = stage.create_button(data["previous"], self)[0]
        self.description_text = stage.create_text(data["description"])[0]
        self.element_count_text = stage.create_text_count(
            data["element_count"], len(elements))[0]
        self.previous_button.set_visible(False)
        self.current_page = 0
        self.create_elements(data, elements)
        if len(elements) <= self.ITEMS_PER_PAGE:
            self.next_button.set_visible(False)
        self.set_elements()

        self.other = stage.create_items_from_yaml(data["other"])
        for other in self.other:
            self.layer.add(other)
        self.layer.add(self.close_button)
        self.layer.add(self.next_button)
        self.layer.add(self.previous_button)
        self.layer.add(self.description_text)
        self.layer.add(self.element_count_text)
        self.current_items = []

    def create_elements(self, data, elements):
        self.elements = []
        start_top = data["elements_pos"]["top"]
        inter = data["elements_pos"]["interspace"]
        element_data = DictClass(load(file('data/common/books.yaml')))
        current = 0
        for page in xrange(0, len(elements) / self.ITEMS_PER_PAGE + 1):
            start_left = 0
            for element in elements[page * self.ITEMS_PER_PAGE:(page + 1) *
                                    self.ITEMS_PER_PAGE]:
                element_data[element.type]['action'] = 'click'
                new = self.stage.create_button(element_data[element.type],
                                               manager=self)[0]
                new.set_top(start_top)
                new.set_left(start_left)
                new.add_event_handler(ItemEvent.MOUSE_ENTER,
                                      self.handle_element_enter)
                new.add_event_handler(ItemEvent.MOUSE_LEAVE,
                                      self.handle_element_leave)
                new.info = element
                start_left += new.get_width() + inter
                self.elements.append(new)
                current += 1
            start_left -= inter
            new_left = (data["elements_pos"]["width"] -
                        start_left) / 2 + data["elements_pos"]["left"]
            for element in self.elements[page *
                                         self.ITEMS_PER_PAGE:(page + 1) *
                                         self.ITEMS_PER_PAGE]:
                element.set_left(element.get_left() + new_left)

    def set_elements(self):
        self.elements_layer.empty()
        fromm = self.current_page * self.ITEMS_PER_PAGE
        for element in self.elements[fromm:fromm + self.ITEMS_PER_PAGE]:
            self.elements_layer.add(element)

    def start(self):
        self.stage.show_dialog(self.layer, None)
        self.stage.add_layer(self.elements_layer)

    def handle_close(self, item, args):
        self.stage.remove_layer(self.elements_layer)
        self.stage.close_dialog(self.layer)
        self.layer.exit()
        self.layer = None
        self.close_button.exit()
        self.next_button.exit()
        self.previous_button.exit()
        self.description_text.exit()
        self.element_count_text.exit()
        self.previous_button.exit()
        for element in self.elements:
            element.exit()
        self.elements = None
        self.elements_layer.exit()
        self.elements_layer = None

    def handle_next(self, item, args):
        self.current_page += 1
        if len(
                self.elements
        ) - self.current_page * self.ITEMS_PER_PAGE <= self.ITEMS_PER_PAGE:
            self.next_button.set_visible(False)
        self.previous_button.set_visible(True)
        self.set_elements()

    def handle_previous(self, item, args):
        self.current_page -= 1
        if not self.current_page:
            self.previous_button.set_visible(False)
        if len(self.elements) > self.ITEMS_PER_PAGE:
            self.next_button.set_visible(True)
        self.set_elements()

    def handle_element_enter(self, item, args):
        self.description_text.set_text(item.info.title)

    def handle_element_leave(self, item, args):
        self.description_text.set_text("")

    def handle_click(self, item, args):
        paginate = Content(self.stage, item.info.title, item.info.text)
        paginate.start()
コード例 #28
0
    def initialize(self):
        GameStage.initialize(self)
        stream = file('data/fonts.yaml', 'r')

        fonts = load(stream)
        for font in fonts:
            setattr(
                self, font,
                assets.load_font(fonts[font]['file_name'],
                                 fonts[font]['size']))

        self.data = DictClass(load(file('data/invaders.yaml')))

        self.good = self.data.start.good
        self.velocity = self.data.start.velocity
        self.interval = self.data.start.interval

        self.game_over_layer = Layer()
        image = assets.load_image(
            self.data.bad[self.game.datastore.datamodel.character].src)
        item = ItemImage(self.data.bad.left, self.data.bad.top, image)
        self.game_over_layer.add(item)
        image = assets.load_image(
            self.data.game_over[self.game.datastore.datamodel.character].src)
        item = ItemImage(self.data.game_over.left, self.data.game_over.top,
                         image)
        self.game_over_layer.add(item)

        image = assets.load_image(
            self.data.good[self.game.datastore.datamodel.character].src)
        self.good_indicator = ItemImage(self.data.good.left,
                                        self.data.good.top, image)

        self.text_indicators = []

        self.main_layer = Layer()
        self.top_layer = Layer()

        self.score = 0
        self.score_board = DictClass({})
        image = assets.load_image(self.data.score.src)
        self.score_board['skin'] = ItemImage(self.data.score.left,
                                             self.data.score.top, image)
        self.score_board['value'] = ItemText(self.data.score.left,
                                             self.data.score.top,
                                             self.font,
                                             0,
                                             str(self.score),
                                             width=image.get_width(),
                                             height=image.get_height(),
                                             h_align=2,
                                             v_align=2)
        self.top_layer.add(self.score_board.skin)
        self.top_layer.add(self.score_board.value)

        data = DictClass(load(file('data/map/common.yaml')))
        params = data.character[self.game.datastore.datamodel.character]
        params['base'] = data.character.base[
            self.game.datastore.datamodel.character].big
        self.character_animation = Character(**params)
        self.character = self.character_animation.item
        self.character.set_left(
            (SCREEN_WIDTH - self.character.get_width()) / 2)
        self.character.set_top(SCREEN_HEIGHT - self.character.get_height())
        left = self.character.get_left() + self.data.collision.left
        top = self.character.get_top() + self.data.collision.top
        width = self.character.get_width(
        ) - self.data.collision.left - self.data.collision.right
        height = self.character.get_height(
        ) - self.data.collision.top - self.data.collision.bottom
        if DEBUG:
            self.debug_character = ItemRect(left,
                                            top,
                                            width,
                                            height,
                                            border=(255, 255, 255))
        self.invaders = []

        # Load the sound
        self.item_found_sound = assets.load_sound('DGI_item_found.ogg')
        self.lose_hit_sound = assets.load_sound('DGI_lose_hit.ogg')
        self.lose_music_sound = assets.load_sound('DGI_lose_music.ogg')
コード例 #29
0
 def __init__(self, stage, data, next_cb):
     self.next_cb = next_cb
     self.layer = Layer()
     self.stage = stage
     self.layer.add(stage.create_image(data.intro)[0])
     self.layer.add(stage.create_button(data.next, self)[0])
コード例 #30
0
class Paginator():
    def __init__(self, stage, items, optional_data=None):
        self.layer = Layer()
        self.items_layer = Layer()
        self.items = items
        self.stage = stage
        from yaml import load
        data = load(file('data/common/pagination.yaml'))
        if optional_data is not None:
            data.update(optional_data)
        self.current = 1
        if len(self.items):
            self.current_layer = self.items[0]
        else:
            self.current_layer = Layer()
        self.min = 1
        self.max = len(self.items)
        self.count = len(self.items)
        for item in items:
            item.set_visible(False)
        self.previous = stage.create_button(data["previous"], self)[0]
        self.next = stage.create_button(data["next"], self)[0]
        self.last = None
        if "last" in data:
            self.last = stage.create_button(data["last"], self)[0]
        if "page_count" in data and data["page_count"]:
            self.page_count_text = stage.create_text(data["page_count"])[0]
            self.page_count_base_text = data["page_count"]["text"]
        else:
            self.page_count_text = None
        self.update_page_count()
        self.update_items()
        self.update_buttons()

        self.layer.add(self.previous)
        self.layer.add(self.next)
        if self.page_count_text:
            self.layer.add(self.page_count_text)
        if self.last:
            self.layer.add(self.last)

    def exit(self):
        self.layer.exit()
        self.items_layer.exit()
        for item in self.items:
            item.exit()
        self.items = None
        self.stage = None
        self.previous.exit()
        self.previous = None
        self.next.exit()
        self.next = None
        if self.last:
            self.last.exit()
            self.last = None
        if self.page_count_text:
            self.page_count_text.exit()
            self.page_count_text = None

    def update_page_count(self):
        if self.page_count_text:
            self.page_count_text.set_text(self.page_count_base_text % {
                "page": self.current,
                "total": self.max
            })

    def update_items(self):
        self.current_layer.set_visible(False)
        if len(self.items) > 0:
            self.current_layer = self.items[self.current - 1]
        self.current_layer.set_visible(True)

    def update_buttons(self):
        if self.current > self.min:
            self.previous.set_visible(True)
        else:
            self.previous.set_visible(False)
        if self.current < self.max:
            self.next.set_visible(True)
        else:
            self.next.set_visible(False)
        if self.last:
            if self.current == self.max:
                self.last.set_visible(False)
            else:
                self.last.set_visible(True)

    def handle_previous(self, item, args):
        if self.current > self.min:
            self.current -= 1
        self.update_buttons()
        self.update_page_count()
        self.update_items()

    def handle_next(self, item, args):
        if self.current < self.max:
            self.current += 1
        self.update_buttons()
        self.update_page_count()
        self.update_items()

    def get_current(self):
        return self.current

    def go_to(self, current):
        if current < self.max:
            self.current = current
        else:
            self.current = current
        self.update_buttons()
        self.update_page_count()
        self.update_items()

    def go_to_last(self):
        self.current = self.max
        self.update_buttons()
        self.update_page_count()
        self.update_items()

    def handle_go_to_last(self, item, args):
        self.go_to_last()

    def get_layers(self):
        return [self.layer] + self.items