Esempio n. 1
0
    def __init__(self, surface):
        self.screen = surface
        self.game = None
        self.screens = {}
        self.screen_history = []

        self.screens['main_screen'] = MainScreen('main_screen', self.screen)
        self.screens['configure'] = Configure('configure', self.screen)
        self.screens['about'] = About('about', self.screen)
        self.screens['resume'] = Resume('resume', self.screen)
        self.screens['sound'] = Audio('sound', self.screen)
        self.screens['display'] = Display('display', self.screen)
        self.screens['keyboard'] = Keyboard('keyboard', self.screen)
        self.screens['level'] = Level('level', self.screen)
        self.screens['characters'] = Characters('characters', self.screen)
        self.screens['network'] = NetworkScreen('network', self.screen)
        self.screens['network_join'] = NetworkJoinScreen(
            'network_join', self.screen)
        self.screens['network_game_conf_screen'] = NetworkGameConfScreen(
            'network_game_conf_screen', self.screen)

        self.current_screen = 'main_screen'
        self.skin = Skin()
        self.last_event = time.time()
        self.image = 0
        self.focus = None
        self.state = "menu"
        self.cursor = loaders.image(CONFIG.system_path + os.sep +
                                    'cursor.png')[0]
        self.update_youhere()
Esempio n. 2
0
    def __init__(self, surface):
        self.screen = surface
        self.game = None
        self.screens = {}
        self.screen_history = []

        self.screens['main_screen'] = MainScreen('main_screen', self.screen)
        self.screens['configure'] = Configure('configure', self.screen)
        self.screens['about'] = About('about', self.screen)
        self.screens['resume'] = Resume('resume', self.screen)
        self.screens['sound'] = Audio('sound', self.screen)
        self.screens['display'] = Display('display', self.screen)
        self.screens['keyboard'] = Keyboard('keyboard', self.screen)
        self.screens['level'] = Level('level', self.screen)
        self.screens['characters'] = Characters('characters', self.screen)
        self.screens['network'] = NetworkScreen('network', self.screen)
        self.screens['network_join'] = NetworkJoinScreen(
                'network_join', self.screen)
        self.screens['network_game_conf_screen'] = NetworkGameConfScreen(
                'network_game_conf_screen', self.screen)

        self.current_screen = 'main_screen'
        self.skin = Skin()
        self.last_event = time.time()
        self.image = 0
        self.focus = None
        self.state = "menu"
        self.cursor = loaders.image(
                CONFIG.system_path + os.sep + 'cursor.png')[0]
        self.update_youhere()
Esempio n. 3
0
class Gui(object):
    """
    Main class of the GUI. Init and maintain all menus and widgets.

    """

    def __init__(self, surface):
        self.screen = surface
        self.game = None
        self.screens = {}
        self.screen_history = []

        self.screens['main_screen'] = MainScreen('main_screen', self.screen)
        self.screens['configure'] = Configure('configure', self.screen)
        self.screens['about'] = About('about', self.screen)
        self.screens['resume'] = Resume('resume', self.screen)
        self.screens['sound'] = Audio('sound', self.screen)
        self.screens['display'] = Display('display', self.screen)
        self.screens['keyboard'] = Keyboard('keyboard', self.screen)
        self.screens['level'] = Level('level', self.screen)
        self.screens['characters'] = Characters('characters', self.screen)
        self.screens['network'] = NetworkScreen('network', self.screen)
        self.screens['network_join'] = NetworkJoinScreen(
                'network_join', self.screen)
        self.screens['network_game_conf_screen'] = NetworkGameConfScreen(
                'network_game_conf_screen', self.screen)

        self.current_screen = 'main_screen'
        self.skin = Skin()
        self.last_event = time.time()
        self.image = 0
        self.focus = None
        self.state = "menu"
        self.cursor = loaders.image(
                CONFIG.system_path + os.sep + 'cursor.png')[0]
        self.update_youhere()

    def update(self):
        """
        Update the GUI, it draws the mouse, and the menu.
        """

        #draw the background
        self.skin.get_background()

        self.screens[self.current_screen].update()

        while(True):
            event = pygame.event.poll()
            if event.type == pygame.QUIT:
                pygame.event.post(pygame.event.Event(QUIT))
                break

            elif event.type != pygame.NOEVENT:
                if event.type == pygame.KEYDOWN:
                    self.handle_keys(event)
                elif (event.type == pygame.MOUSEBUTTONUP or
                    event.type == pygame.MOUSEBUTTONDOWN or
                    event.type == pygame.MOUSEMOTION):
                    self.handle_mouse(event)

            else:
                break
        #draw the '> you are here :' dialog
        #update the mouse position
        x, y = pygame.mouse.get_pos()
        #x += self.cursor.get_height()
        #y += self.cursor.get_width()
        self.screen.blit(self.cursor, (x, y))

        #if we have a game instance and the state is menu...
        if self.game and self.state != "ingame":
            self.state = "ingame"
            return True, self.game

        return False, None

    def handle_mouse(self, event):
        """
        This function handles mouse event which are send from the update
        function.
        """
        if not self.focus:
            event.dict['pos'] = (
              event.dict['pos'][0] - self.screens[self.current_screen].widget.x,
              event.dict['pos'][1] - self.screens[self.current_screen].widget.y)

            (query, self.focus) = (
                self.screens[self.current_screen].widget.handle_mouse(event))

        else:
            (query, focus) = self.focus.handle_mouse(event)
            if not focus:
                self.focus = None

        if  query:
            reply = self.screens[self.current_screen].callback(query)
            self.handle_reply(reply)
        #remove the event for performance, maybe it is useless
        del(event)

    def handle_keys(self, event):
        """
        This function handles keyboard event which are send from the update
        function.
        """
        #TODO : a complete navigation system with the keyboard.
        reply = False
        query = False

        if self.focus:
            (query, focus) = self.focus.handle_keys(event)
            if not focus:
                self.focus = None
            if query:
                reply = self.screens[self.current_screen].callback(query)
                self.handle_reply(reply)

        if not self.focus and (not reply and not query):
            if event.dict['key'] == pygame.K_ESCAPE:
                self.handle_reply({'goto': 'back'})
            else:
                (query, focus) = (
                        self.screens[self.current_screen].handle_keys(event))

                if not focus:
                    self.focus = None

                else:
                    self.focus = focus

                if  query:
                    reply = self.screens[self.current_screen].callback(query)
                    self.handle_reply(reply)

        #remove the event for performance, maybe it is useless
        del(event)

    def handle_reply(self, reply):
        """
        This function handles the callback return by the screens with the
        function event_callback().
        This callback needs to be a dictionary, otherwise, it will be ignored.

        The reply can be:
            {'goto': 'myscreen'}
                where my screen is the name of the screen loaded in __init__()
            {'goto': 'back'}
                go to the last menu, it is usually used for a back button
            {'game': 'new'}
                to start a new game
            {'game': 'new_server'}
                to start a new game in server mode
            {'game': 'join_server'}
                to join a network game
            {'game': 'continue'}
                to resume the game, it is used in the in-game menu
            {'game': 'stop' }
                to stop the game, it is used to qui the game in the
                in-game menu
        """
        if hasattr(reply, 'get'):
            sound = loaders.track(os.path.join(CONFIG.system_path,
                                  "sounds", "mouseClick2.wav"))
            sound.set_volume(CONFIG.audio.SOUND_VOLUME / 100.0)
            sound.play()

            # not using elifs so that replies may be complex
            if reply.get('goto'):

                if reply['goto'] == 'back':
                    self.screen_back()
                else:
                    self.screen_history.append(self.current_screen)
                    self.current_screen = reply['goto']

            if reply.get('game'):
                if reply['game'] == 'new':
                    self.game = self.launch_game()
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'new_server':
                    self.game = self.launch_game(server=True)
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'join_server':
                    self.game = self.launch_game(
                            server=self.screens['network_join'].ip)
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'continue':
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'stop':
                    self.state = "menu"
                    self.game = None
                    self.current_screen = 'main_screen'
                    self.screen_history = []

    def screen_back(self):
        """
        Go to the last screen.
        """
        if len(self.screen_history) > 0:
            self.current_screen = self.screen_history[-1]
            self.screen_history.pop()
            return True

        return False

    def update_youhere(self):
        screen_list = ""
        for scr in self.screen_history:
            screen_list += scr + "/"

        screen_list += self.current_screen + "/"
        self.here = loaders.text("> " + _("you are here:") + screen_list,
            fonts['mono']['30'])

    def transition_slide(self, old_screen, old_surface, new_screen,
            new_surface):
        text = get_text_transparent(old_screen.name)

        for i in range(0, 10):
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.skin.get_background()
            text.set_alpha((i * -1 + 10) * 250 / 10)
            self.screen.blit(text,
                (old_screen.indent_title, 10))
            self.screen.blit(old_surface,
                (optimize_size((i * 8 * 10, 0))[0], old_screen.widget.y))

            pygame.display.update()

        text = get_text_transparent(new_screen.name)

        for i in range(0, 10):
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.skin.get_background()
            text.set_alpha(i * 250 / 10)
            self.screen.blit(text,
                    (self.screens[self.current_screen].indent_title, 10))
            self.screen.blit(new_surface,
                (optimize_size((i * 8 * 10 - 800, 0))[0],
                self.screens[self.current_screen].widget.y))

            pygame.display.update()

    def transition_fading(self, old_screen, old_surface, new_screen,
            new_surface):
        text = get_text_transparent(old_screen.name)

        for i in range(0, 5):
            back = self.skin.get_background().convert()
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.screen.blit(self.skin.get_background(), (0, 0))
            text.set_alpha((i * -1 + 5) * 250 / 5)
            self.screen.blit(text, (old_screen.indent_title, 10))

            #back.set_alpha( (i * (- 1) + 5) *250 / 5)
            back.set_alpha(i * 250 / 5)
            self.screen.blit(old_surface,
                    (old_screen.widget.x, old_screen.widget.y))
            self.screen.blit(back, (0, 0))

            pygame.display.update()

        text = get_text_transparent(new_screen.name)

        for i in range(0, 5):
            back = self.skin.get_background().convert()
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.screen.blit(self.skin.get_background(), (0, 0))
            text.set_alpha(i * 250 / 5)
            self.screen.blit(text,
                    (self.screens[self.current_screen].indent_title, 10))

            #new_surface.set_alpha(i  * 250 / 5)
            back.set_alpha((i * -1 + 5) * 250 / 5)
            self.screen.blit(new_surface,
                    (new_screen.widget.x, new_screen.widget.y))
            self.screen.blit(back, (0, 0))

            pygame.display.update()

    def launch_game(self, server=False):
        """
        Function to launch the game, use precedant user choices to initiate the
        game with level and characters selected.

        """
        players = []
        for i in range(0, len(self.screens["characters"].players)):
            if self.screens["characters"].players[i] != 0:
                file_name = (
                        self.screens["characters"].game_data['character_file']
                                [self.screens["characters"].players[i]])
                if self.screens["characters"].checkboxes_ai[i].get_value():
                    file_name = file_name.replace(
                            "characters/", "characters/AI")
                players.append(file_name)

        if len(players) > 1:
            game = Game(
                self.screen,
                self.screens["level"].get_level(),
                players)

            #thread.start_new_thread(self.loading, ())
            #self.goto_screen("ingame.usfgui", False)
            #self.state="game"
            return game
Esempio n. 4
0
class Gui(object):
    """
    Main class of the GUI. Init and maintain all menus and widgets.

    """
    def __init__(self, surface):
        self.screen = surface
        self.game = None
        self.screens = {}
        self.screen_history = []

        self.screens['main_screen'] = MainScreen('main_screen', self.screen)
        self.screens['configure'] = Configure('configure', self.screen)
        self.screens['about'] = About('about', self.screen)
        self.screens['resume'] = Resume('resume', self.screen)
        self.screens['sound'] = Audio('sound', self.screen)
        self.screens['display'] = Display('display', self.screen)
        self.screens['keyboard'] = Keyboard('keyboard', self.screen)
        self.screens['level'] = Level('level', self.screen)
        self.screens['characters'] = Characters('characters', self.screen)
        self.screens['network'] = NetworkScreen('network', self.screen)
        self.screens['network_join'] = NetworkJoinScreen(
            'network_join', self.screen)
        self.screens['network_game_conf_screen'] = NetworkGameConfScreen(
            'network_game_conf_screen', self.screen)

        self.current_screen = 'main_screen'
        self.skin = Skin()
        self.last_event = time.time()
        self.image = 0
        self.focus = None
        self.state = "menu"
        self.cursor = loaders.image(CONFIG.system_path + os.sep +
                                    'cursor.png')[0]
        self.update_youhere()

    def update(self):
        """
        Update the GUI, it draws the mouse, and the menu.
        """

        #draw the background
        self.skin.get_background()

        self.screens[self.current_screen].update()

        while (True):
            event = pygame.event.poll()
            if event.type == pygame.QUIT:
                pygame.event.post(pygame.event.Event(QUIT))
                break

            elif event.type != pygame.NOEVENT:
                if event.type == pygame.KEYDOWN:
                    self.handle_keys(event)
                elif (event.type == pygame.MOUSEBUTTONUP
                      or event.type == pygame.MOUSEBUTTONDOWN
                      or event.type == pygame.MOUSEMOTION):
                    self.handle_mouse(event)

            else:
                break
        #draw the '> you are here :' dialog
        #update the mouse position
        x, y = pygame.mouse.get_pos()
        #x += self.cursor.get_height()
        #y += self.cursor.get_width()
        self.screen.blit(self.cursor, (x, y))

        #if we have a game instance and the state is menu...
        if self.game and self.state != "ingame":
            self.state = "ingame"
            return True, self.game

        return False, None

    def handle_mouse(self, event):
        """
        This function handles mouse event which are send from the update
        function.
        """
        if not self.focus:
            event.dict['pos'] = (event.dict['pos'][0] -
                                 self.screens[self.current_screen].widget.x,
                                 event.dict['pos'][1] -
                                 self.screens[self.current_screen].widget.y)

            (query, self.focus) = (
                self.screens[self.current_screen].widget.handle_mouse(event))

        else:
            (query, focus) = self.focus.handle_mouse(event)
            if not focus:
                self.focus = None

        if query:
            reply = self.screens[self.current_screen].callback(query)
            self.handle_reply(reply)
        #remove the event for performance, maybe it is useless
        del (event)

    def handle_keys(self, event):
        """
        This function handles keyboard event which are send from the update
        function.
        """
        #TODO : a complete navigation system with the keyboard.
        reply = False
        query = False

        if self.focus:
            (query, focus) = self.focus.handle_keys(event)
            if not focus:
                self.focus = None
            if query:
                reply = self.screens[self.current_screen].callback(query)
                self.handle_reply(reply)

        if not self.focus and (not reply and not query):
            if event.dict['key'] == pygame.K_ESCAPE:
                self.handle_reply({'goto': 'back'})
            else:
                (query, focus) = (
                    self.screens[self.current_screen].handle_keys(event))

                if not focus:
                    self.focus = None

                else:
                    self.focus = focus

                if query:
                    reply = self.screens[self.current_screen].callback(query)
                    self.handle_reply(reply)

        #remove the event for performance, maybe it is useless
        del (event)

    def handle_reply(self, reply):
        """
        This function handles the callback return by the screens with the
        function event_callback().
        This callback needs to be a dictionary, otherwise, it will be ignored.

        The reply can be:
            {'goto': 'myscreen'}
                where my screen is the name of the screen loaded in __init__()
            {'goto': 'back'}
                go to the last menu, it is usually used for a back button
            {'game': 'new'}
                to start a new game
            {'game': 'new_server'}
                to start a new game in server mode
            {'game': 'join_server'}
                to join a network game
            {'game': 'continue'}
                to resume the game, it is used in the in-game menu
            {'game': 'stop' }
                to stop the game, it is used to qui the game in the
                in-game menu
        """
        if hasattr(reply, 'get'):
            sound = loaders.track(
                os.path.join(CONFIG.system_path, "sounds", "mouseClick2.wav"))
            sound.set_volume(CONFIG.audio.SOUND_VOLUME / 100.0)
            sound.play()

            # not using elifs so that replies may be complex
            if reply.get('goto'):

                if reply['goto'] == 'back':
                    self.screen_back()
                else:
                    self.screen_history.append(self.current_screen)
                    self.current_screen = reply['goto']

            if reply.get('game'):
                if reply['game'] == 'new':
                    self.game = self.launch_game()
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'new_server':
                    self.game = self.launch_game(server=True)
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'join_server':
                    self.game = self.launch_game(
                        server=self.screens['network_join'].ip)
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'continue':
                    self.current_screen = 'resume'
                    self.screen_history = []
                    self.state = "menu"
                elif reply['game'] == 'stop':
                    self.state = "menu"
                    self.game = None
                    self.current_screen = 'main_screen'
                    self.screen_history = []

    def screen_back(self):
        """
        Go to the last screen.
        """
        if len(self.screen_history) > 0:
            self.current_screen = self.screen_history[-1]
            self.screen_history.pop()
            return True

        return False

    def update_youhere(self):
        screen_list = ""
        for scr in self.screen_history:
            screen_list += scr + "/"

        screen_list += self.current_screen + "/"
        self.here = loaders.text("> " + _("you are here:") + screen_list,
                                 fonts['mono']['30'])

    def transition_slide(self, old_screen, old_surface, new_screen,
                         new_surface):
        text = get_text_transparent(old_screen.name)

        for i in range(0, 10):
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.skin.get_background()
            text.set_alpha((i * -1 + 10) * 250 / 10)
            self.screen.blit(text, (old_screen.indent_title, 10))
            self.screen.blit(old_surface, (optimize_size(
                (i * 8 * 10, 0))[0], old_screen.widget.y))

            pygame.display.update()

        text = get_text_transparent(new_screen.name)

        for i in range(0, 10):
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.skin.get_background()
            text.set_alpha(i * 250 / 10)
            self.screen.blit(
                text, (self.screens[self.current_screen].indent_title, 10))
            self.screen.blit(new_surface,
                             (optimize_size((i * 8 * 10 - 800, 0))[0],
                              self.screens[self.current_screen].widget.y))

            pygame.display.update()

    def transition_fading(self, old_screen, old_surface, new_screen,
                          new_surface):
        text = get_text_transparent(old_screen.name)

        for i in range(0, 5):
            back = self.skin.get_background().convert()
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.screen.blit(self.skin.get_background(), (0, 0))
            text.set_alpha((i * -1 + 5) * 250 / 5)
            self.screen.blit(text, (old_screen.indent_title, 10))

            #back.set_alpha( (i * (- 1) + 5) *250 / 5)
            back.set_alpha(i * 250 / 5)
            self.screen.blit(old_surface,
                             (old_screen.widget.x, old_screen.widget.y))
            self.screen.blit(back, (0, 0))

            pygame.display.update()

        text = get_text_transparent(new_screen.name)

        for i in range(0, 5):
            back = self.skin.get_background().convert()
            time.sleep(1.00 / float(CONFIG.general.MAX_FPS))
            self.screen.blit(self.skin.get_background(), (0, 0))
            text.set_alpha(i * 250 / 5)
            self.screen.blit(
                text, (self.screens[self.current_screen].indent_title, 10))

            #new_surface.set_alpha(i  * 250 / 5)
            back.set_alpha((i * -1 + 5) * 250 / 5)
            self.screen.blit(new_surface,
                             (new_screen.widget.x, new_screen.widget.y))
            self.screen.blit(back, (0, 0))

            pygame.display.update()

    def launch_game(self, server=False):
        """
        Function to launch the game, use precedant user choices to initiate the
        game with level and characters selected.

        """
        players = []
        for i in range(0, len(self.screens["characters"].players)):
            if self.screens["characters"].players[i] != 0:
                file_name = (
                    self.screens["characters"].game_data['character_file'][
                        self.screens["characters"].players[i]])
                if self.screens["characters"].checkboxes_ai[i].get_value():
                    file_name = file_name.replace("characters/",
                                                  "characters/AI")
                players.append(file_name)

        if len(players) > 1:
            game = Game(self.screen, self.screens["level"].get_level(),
                        players)

            #thread.start_new_thread(self.loading, ())
            #self.goto_screen("ingame.usfgui", False)
            #self.state="game"
            return game