Exemplo n.º 1
0
class Syringe (pygame.sprite.Sprite):
    NEGATIVE_MARGIN = 10
    VELOCITY = 200
    BURST_VELOCITY = 300
    BURST_PROB = .2

    def __init__(self, x, y, left, left_img_path, right_img_path):
        super(Syringe, self).__init__()
        self.health_effect = 0
        self.left = left
        self.velocity = Syringe.VELOCITY
        # if random.random() <= Syringe.BURST_PROB:
            # self.velocity = Syringe.BURST_VELOCITY
        if self.left:
            self.velocity *= -1
        self.loader = AssetLoader("images")
        self.is_dead = False
        if left:
            self.image = self.loader.load_image_alpha(left_img_path)
        else:
            self.image = self.loader.load_image_alpha(right_img_path)
        self.init_rect(self.image.get_rect(), x, y)

    def init_rect(self, rect, x, y):
        self.rect = rect
        if self.left:
            self.rect.right = x + Syringe.NEGATIVE_MARGIN
        else:
            self.rect.left = x - Syringe.NEGATIVE_MARGIN
        self.rect.centery = y

    def move(self, x_delta, y_delta):
        self.rect.x += x_delta
        self.rect.y += y_delta

    def kill(self):
        self.is_dead = True

    def update(self, time, camera):
        self.rect.x += time * self.velocity
        radius = max(self.rect.size) * 1.5
        solid_tiles = camera.get_solid_tiles(self.rect.center, radius)
        solid_rects = [pair.rect for pair in solid_tiles]
        collide_rects = self.rect.collidelistall(solid_rects)
        if len(collide_rects) > 0:
            self.kill()
Exemplo n.º 2
0
class Syringe(pygame.sprite.Sprite):
    NEGATIVE_MARGIN = 10
    VELOCITY = 200
    BURST_VELOCITY = 300
    BURST_PROB = .2

    def __init__(self, x, y, left, left_img_path, right_img_path):
        super(Syringe, self).__init__()
        self.health_effect = 0
        self.left = left
        self.velocity = Syringe.VELOCITY
        # if random.random() <= Syringe.BURST_PROB:
        # self.velocity = Syringe.BURST_VELOCITY
        if self.left:
            self.velocity *= -1
        self.loader = AssetLoader("images")
        self.is_dead = False
        if left:
            self.image = self.loader.load_image_alpha(left_img_path)
        else:
            self.image = self.loader.load_image_alpha(right_img_path)
        self.init_rect(self.image.get_rect(), x, y)

    def init_rect(self, rect, x, y):
        self.rect = rect
        if self.left:
            self.rect.right = x + Syringe.NEGATIVE_MARGIN
        else:
            self.rect.left = x - Syringe.NEGATIVE_MARGIN
        self.rect.centery = y

    def move(self, x_delta, y_delta):
        self.rect.x += x_delta
        self.rect.y += y_delta

    def kill(self):
        self.is_dead = True

    def update(self, time, camera):
        self.rect.x += time * self.velocity
        radius = max(self.rect.size) * 1.5
        solid_tiles = camera.get_solid_tiles(self.rect.center, radius)
        solid_rects = [pair.rect for pair in solid_tiles]
        collide_rects = self.rect.collidelistall(solid_rects)
        if len(collide_rects) > 0:
            self.kill()
Exemplo n.º 3
0
class HUDManager(object):
    KEY_IMAGE_PATH = 'key.png'
    SPECIAL_KEY_IMAGE_PATH = 'special_key.png'
    MARGIN_BOTTOM = 10
    MARGIN_RIGHT = 10
    PADDING_NEXT = 5

    def __init__(self):
        self.num_keys = 0
        self.num_special_keys = 0
        self.loader = AssetLoader('images')
        self.init_images()
        self.update_surface()

    def init_images(self):
        self.key_surf = self.loader.load_image_alpha(HUDManager.KEY_IMAGE_PATH)
        self.key_rect = self.key_surf.get_rect()
        self.special_key_surf = self.loader.load_image_alpha(
            HUDManager.SPECIAL_KEY_IMAGE_PATH)
        self.special_key_rect = self.special_key_surf.get_rect()
        # assuming images are the same size
        self.image_width = self.key_rect.width
        self.image_height = self.key_rect.height

    def update_surface(self):
        num_obj = self.num_keys + self.num_special_keys
        surf_width = num_obj * (self.image_width + HUDManager.PADDING_NEXT)
        surf_height = self.image_height
        self.surface = pygame.Surface((surf_width, surf_height),
                                      pygame.SRCALPHA, 32).convert_alpha()
        self.rect = self.surface.get_rect()
        self.rect.bottom = Globals.HEIGHT - HUDManager.MARGIN_BOTTOM
        self.rect.right = Globals.WIDTH - HUDManager.MARGIN_RIGHT
        self.blit_images()

    def blit_images(self):
        curr_x = self.rect.width - self.image_width
        for i in range(0, self.num_keys):
            self.surface.blit(self.key_surf, (curr_x, 0))
            curr_x -= self.image_width + HUDManager.PADDING_NEXT

        for i in range(0, self.num_special_keys):
            self.surface.blit(self.special_key_surf, (curr_x, 0))
            curr_x -= self.image_width + HUDManager.PADDING_NEXT

    def render(self, screen):
        self.blit_images()
        screen.blit(self.surface, self.rect)

    def add_key(self):
        self.num_keys += 1
        self.update_surface()

    def add_special_key(self):
        self.num_special_keys += 1
        self.update_surface()

    def has_key(self):
        return self.num_keys > 0

    def has_special_key(self):
        return self.num_special_keys > 0

    def use_key(self):
        if self.has_key():
            self.num_keys -= 1
            self.update_surface()
            return True
        return False

    def use_special_key(self):
        if self.has_special_key():
            self.num_special_keys -= 1
            self.update_surface()
            return True
        return False
Exemplo n.º 4
0
class SetJoystickKeyState(GameState):
    ALLOWED_TYPES = set(
        [pygame.JOYBUTTONDOWN, pygame.JOYAXISMOTION, pygame.JOYHATMOTION])
    TITLE_IMAGE_PATH = 'set_key.png'
    TITLE_MARGIN_TOP = 60

    def __init__(self, image_surf, list_index, return_state):
        self.list_index = list_index
        self.return_state = return_state
        self.image_surf = image_surf
        self.loader = AssetLoader('images')
        self.image_rect = self.image_surf.get_rect()
        self.image_rect.center = Globals.SCREEN.get_rect().center
        self.init_images()

    def init_images(self):
        self.background_img = self.loader.load_image('background.png')
        self.title_surf = self.loader.load_image_alpha(
            SetJoystickKeyState.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.centerx = Globals.WIDTH / 2
        self.title_rect.top = SetJoystickKeyState.TITLE_MARGIN_TOP

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        Globals.SCREEN.blit(self.image_surf, self.image_rect)

    def handle_escape(self):
        Globals.STATE = self.return_state

    def set_event(self, event):
        pair = self.convert_event(event)
        SettingsManager.EVENTS_UP = [
            a for a in SettingsManager.EVENTS_UP if a != event]
        SettingsManager.EVENTS_DOWN = [
            a for a in SettingsManager.EVENTS_DOWN if a != event]
        SettingsManager.EVENTS_LEFT = [
            a for a in SettingsManager.EVENTS_LEFT if a != event]
        SettingsManager.EVENTS_RIGHT = [
            a for a in SettingsManager.EVENTS_RIGHT if a != event]
        SettingsManager.EVENTS_ATTACK = [
            a for a in SettingsManager.EVENTS_ATTACK if a != event]
        SettingsManager.EVENTS_ACTION = [
            a for a in SettingsManager.EVENTS_ACTION if a != event]
        SettingsManager.EVENTS_ESCAPE = [
            a for a in SettingsManager.EVENTS_ESCAPE if a != event]
        SettingsManager.EVENTS_RETURN = [
            a for a in SettingsManager.EVENTS_RETURN if a != event]
        SettingsManager.EVENTS_BACKSPACE = [
            a for a in SettingsManager.EVENTS_BACKSPACE if a != event]
        self.get_event_list().append(pair)
        SettingsManager.save()
        self.handle_escape()

    def get_event_list(self):
        from ControlSettings import ControlSettings
        if self.list_index == ControlSettings.INDEX_ESCAPE:
            return SettingsManager.EVENTS_ESCAPE
        elif self.list_index == ControlSettings.INDEX_ATTACK:
            return SettingsManager.EVENTS_ATTACK
        elif self.list_index == ControlSettings.INDEX_ACTION:
            return SettingsManager.EVENTS_ACTION
        elif self.list_index == ControlSettings.INDEX_RETURN:
            return SettingsManager.EVENTS_RETURN
        elif self.list_index == ControlSettings.INDEX_UP:
            return SettingsManager.EVENTS_UP
        elif self.list_index == ControlSettings.INDEX_DOWN:
            return SettingsManager.EVENTS_DOWN
        elif self.list_index == ControlSettings.INDEX_LEFT:
            return SettingsManager.EVENTS_LEFT
        elif self.list_index == ControlSettings.INDEX_RIGHT:
            return SettingsManager.EVENTS_RIGHT
        else:
            return list()

    def convert_event(self, event):
        pair = EventPair(type=event.type)
        if event.type == pygame.JOYBUTTONDOWN:
            pair.value = event.button
        elif event.type == pygame.JOYAXISMOTION:
            if event.value < 0:
                pair.value = -1
            elif event.value > 0:
                pair.value = 1
            else:
                pair.value = 0
            pair.axis = event.axis
        elif event.type == pygame.JOYHATMOTION:
            pair.hat = event.hat
            pair.value = event.value
        return pair

    def handle_raw_event(self, event):
        if event.type in SetJoystickKeyState.ALLOWED_TYPES and \
                EventManager.is_keydown(event):
            self.set_event(event)
Exemplo n.º 5
0
class SettingsSlider(object):
    BASE_HEIGHT_PERCENT = .5
    BASE_COLOR = (0, 229, 255)
    BASE_HIGHLIGHT_COLOR = pygame.color.Color('yellow')
    BASE_BORDER_COLOR = pygame.color.Color('black')
    BASE_BORDER_WIDTH = 4
    INDICATOR_WIDTH_PERCENT = .4
    INDICATOR_BORDER_PERCENT = .6
    INDICATOR_BORDER_COLOR = pygame.color.Color('black')
    INDICATOR_INNER_COLOR = pygame.color.Color('gray')
    ARROW_MARGIN = 15
    VELOCITY = 300

    def __init__(self, container, max_value=100, value=None):
        self.container = container
        self.max_value = max_value
        self.value = value if value is not None else self.max_value
        self.loader = AssetLoader('images')
        self.init_slider()
        self.init_arrows()
        self.selected = False

    def init_slider(self):
        self.init_indicator()
        self.init_base()

    def init_indicator(self):
        indicator_height = self.container.height
        indicator_width = indicator_height * \
            SettingsSlider.INDICATOR_WIDTH_PERCENT
        self.indicator_surf = pygame.Surface(
            (indicator_width, indicator_height)).convert()
        self.indicator_surf.fill(SettingsSlider.INDICATOR_INNER_COLOR)
        self.indicator_rect = self.indicator_surf.get_rect()
        pygame.draw.rect(
            self.indicator_surf, SettingsSlider.INDICATOR_BORDER_COLOR,
            self.indicator_rect,
            int(indicator_width * SettingsSlider.INDICATOR_BORDER_PERCENT))
        self.indicator_rect.top = self.container.top
        self.target_x = self.container.left + \
            self.container.width * self.get_percentage()
        self.indicator_rect.centerx = self.target_x

    def init_arrows(self):
        self.arrow_left_surf = self.loader.load_image_alpha('arrow_left.png')
        self.arrow_right_surf = self.loader.load_image_alpha('arrow_right.png')
        self.arrow_left_rect = self.arrow_left_surf.get_rect()
        self.arrow_right_rect = self.arrow_right_surf.get_rect()
        self.arrow_left_rect.centery = self.container.centery
        self.arrow_right_rect.centery = self.container.centery
        self.arrow_left_rect.right = self.container.left - \
            SettingsSlider.ARROW_MARGIN
        self.arrow_right_rect.left = self.container.right + \
            SettingsSlider.ARROW_MARGIN

    def init_base(self):
        base_height = self.container.height * \
            SettingsSlider.BASE_HEIGHT_PERCENT
        self.base_surf = pygame.Surface(
            (self.container.width, base_height)).convert()
        self.base_rect = self.base_surf.get_rect()
        self.base_rect.topleft = self.container.topleft
        self.base_rect.top += (self.container.height - base_height) / 2
        self.fill_base()

    def fill_base(self, base_color=BASE_COLOR):
        self.base_surf.fill(base_color)
        area = self.base_surf.get_rect()
        pygame.draw.rect(self.base_surf, SettingsSlider.BASE_BORDER_COLOR,
                         area, SettingsSlider.BASE_BORDER_WIDTH)

    def select(self):
        self.fill_base(SettingsSlider.BASE_HIGHLIGHT_COLOR)
        self.selected = True

    def deselect(self):
        self.fill_base()
        self.selected = False

    def change_value(self, delta):
        self.set_value(self.value + delta)

    def set_value(self, value):
        self.value = value
        if self.value < 0:
            self.value = 0
        elif self.value > self.max_value:
            self.value = self.max_value
        self.target_x = self.container.left + \
            self.container.width * self.get_percentage()

    def get_percentage(self):
        return self.value / self.max_value

    def render(self, screen):
        screen.blit(self.base_surf, self.base_rect)
        screen.blit(self.indicator_surf, self.indicator_rect)
        if self.selected:
            if self.value > 0:
                screen.blit(self.arrow_left_surf, self.arrow_left_rect)
            if self.value < self.max_value:
                screen.blit(self.arrow_right_surf, self.arrow_right_rect)

    def update(self, time):
        if self.indicator_rect.centerx < self.target_x:
            self.indicator_rect.centerx = min(
                self.indicator_rect.centerx + SettingsSlider.VELOCITY * time,
                self.target_x)
        elif self.indicator_rect.centerx > self.target_x:
            self.indicator_rect.centerx = max(
                self.indicator_rect.centerx - SettingsSlider.VELOCITY * time,
                self.target_x)
Exemplo n.º 6
0
class CustomLevelPicker(GameState):
    MAP_FILE_EXT = 'txt'
    CUSTOM_MAP_PATH = join('maps', 'custom')
    PLAY_PATH = 'custom'
    SELECTION_FONT = pygame.font.Font(None, 70)
    SELECTION_COLOR = pygame.color.Color('white')
    CREATE_NEW_TEXT = 'Create New Level'
    SELECTION_TOP_MARGIN = 30
    SELECTION_PADDING = 20
    HIGHLIGHT_PADDING_HEIGHT = 30
    HIGHLIGHT_PADDING_WIDTH = 70
    HIGHLIGHT_COLOR = pygame.color.Color("black")
    HIGHLIGHT_ALPHA = 150
    ARROW_MARGIN = 20
    SUBTITLE_BACKGROUND = pygame.color.Color("black")
    SUBTITLE_PADDING = 10
    CENTER_SUBTITLE_TEXT = "Press enter to play"
    LEFT_SUBTITLE_TEXT = "Press 'd' to delete"
    RIGHT_SUBTITLE_TEXT = "Press 'e' to edit"
    SUBTITLE_OFFSET = 40
    NEW_SUBTITLE_TEXT = "Press enter"
    SUBTITLE_COLOR = pygame.color.Color("white")
    SUBTITLE_FONT = pygame.font.Font(None, 32)
    SUBTITLE_MARGIN_BOTTOM = 50
    TITLE_IMAGE_PATH = 'customlevel.png'
    TITLE_MARGIN_TOP = 70

    def __init__(self):
        self.init_images()
        self.file_manager = FileManager(
            path=CustomLevelPicker.CUSTOM_MAP_PATH,
            file_ext=CustomLevelPicker.MAP_FILE_EXT)
        self.file_names = self.file_manager.get_files(strip_ext=True)
        self.current_selection = 0
        self.text_surf = None
        self.text_rect = None
        self.highlight_surf = None
        self.highlight_rect = None
        self.build_text()
        self.build_subtitles()
        Globals.play_menu_sound()

    def init_images(self):
        self.loader = AssetLoader('images')
        self.background_img = self.loader.load_image('background.png')
        self.title_surf = self.loader.load_image_alpha(
            CustomLevelPicker.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.center = Globals.SCREEN.get_rect().center
        self.title_rect.top = CustomLevelPicker.TITLE_MARGIN_TOP
        self.arrow_down_surf = self.loader.load_image_alpha('arrow_down.png')
        self.arrow_down_rect = self.arrow_down_surf.get_rect()
        self.arrow_up_surf = self.loader.load_image_alpha('arrow_up.png')
        self.arrow_up_rect = self.arrow_up_surf.get_rect()
        self.arrow_up_rect.centerx = Globals.WIDTH / 2
        self.arrow_down_rect.centerx = Globals.WIDTH / 2

    def build_subtitles(self):
        self.left_subtitle_surf, self.left_subtitle_rect = self.init_subtitle(
            CustomLevelPicker.LEFT_SUBTITLE_TEXT,
            Globals.WIDTH / 4 - CustomLevelPicker.SUBTITLE_OFFSET)
        self.center_subtitle_surf, self.center_subtitle_rect = \
            self.init_subtitle(CustomLevelPicker.CENTER_SUBTITLE_TEXT,
                               Globals.WIDTH / 2)
        self.right_subtitle_surf, self.right_subtitle_rect = \
            self.init_subtitle(
                CustomLevelPicker.RIGHT_SUBTITLE_TEXT,
                (3 * Globals.WIDTH) / 4 + CustomLevelPicker.SUBTITLE_OFFSET)
        self.new_subtitle_surf, self.new_subtitle_rect = \
            self.init_subtitle(CustomLevelPicker.NEW_SUBTITLE_TEXT,
                               Globals.WIDTH / 2)

    def init_subtitle(self, text, centerx):
        text_surf = CustomLevelPicker.SUBTITLE_FONT.render(
            text, True, CustomLevelPicker.SUBTITLE_COLOR)
        subtitle_rect = text_surf.get_rect()
        subtitle_rect.bottom = \
            Globals.HEIGHT - CustomLevelPicker.SUBTITLE_MARGIN_BOTTOM
        subtitle_rect.centerx = centerx
        subtitle_rect.inflate_ip(CustomLevelPicker.SUBTITLE_PADDING * 2,
                                 CustomLevelPicker.SUBTITLE_PADDING * 2)
        subtitle_surf = pygame.Surface(subtitle_rect.size).convert()
        subtitle_surf.fill(CustomLevelPicker.SUBTITLE_BACKGROUND)
        subtitle_surf.blit(text_surf, (CustomLevelPicker.SUBTITLE_PADDING,
                                       CustomLevelPicker.SUBTITLE_PADDING))
        return subtitle_surf, subtitle_rect

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        Globals.SCREEN.blit(self.highlight_surf, self.highlight_rect)
        Globals.SCREEN.blit(self.text_surf, self.text_rect)
        if self.current_selection == 0:
            Globals.SCREEN.blit(self.new_subtitle_surf, self.new_subtitle_rect)
        else:
            Globals.SCREEN.blit(self.left_subtitle_surf,
                                self.left_subtitle_rect)
            Globals.SCREEN.blit(self.center_subtitle_surf,
                                self.center_subtitle_rect)
            Globals.SCREEN.blit(self.right_subtitle_surf,
                                self.right_subtitle_rect)
        if len(self.file_names) > 0:
            Globals.SCREEN.blit(self.arrow_down_surf, self.arrow_down_rect)
            Globals.SCREEN.blit(self.arrow_up_surf, self.arrow_up_rect)

    def build_text(self):
        self.text_surf = CustomLevelPicker.SELECTION_FONT.render(
            self.get_selection_name(), True, CustomLevelPicker.SELECTION_COLOR)
        self.text_rect = self.text_surf.get_rect()
        self.text_rect.center = Globals.SCREEN.get_rect().center
        self.text_rect.top += CustomLevelPicker.SELECTION_TOP_MARGIN
        self.highlight_rect = self.text_rect.inflate(
            CustomLevelPicker.HIGHLIGHT_PADDING_WIDTH,
            CustomLevelPicker.HIGHLIGHT_PADDING_HEIGHT)
        self.highlight_surf = pygame.Surface(self.highlight_rect.size)
        self.highlight_surf.fill(CustomLevelPicker.HIGHLIGHT_COLOR)
        self.highlight_surf.set_alpha(CustomLevelPicker.HIGHLIGHT_ALPHA)
        self.arrow_up_rect.bottom = self.highlight_rect.top - \
            CustomLevelPicker.ARROW_MARGIN
        self.arrow_down_rect.top = self.highlight_rect.bottom + \
            CustomLevelPicker.ARROW_MARGIN

    def get_selection_name(self):
        if self.current_selection == 0:
            return CustomLevelPicker.CREATE_NEW_TEXT
        else:
            return self.file_names[self.current_selection - 1]

    def handle_change(self, delta):
        self.current_selection = (self.current_selection + delta) % \
            (len(self.file_names) + 1)
        self.build_text()

    def handle_selection(self):
        if self.current_selection != 0:
            file_path = self.file_manager.fix_ext(
                self.file_names[self.current_selection - 1])
            level = CustomLevel(join(CustomLevelPicker.PLAY_PATH, file_path))
            level.got_current_state()
            Globals.STATE = level
        else:
            Globals.STATE = CustomLevelNameInput()

    def handle_edit_selection(self):
        if self.current_selection != 0:
            file_path = self.file_manager.fix_ext(
                self.file_names[self.current_selection - 1])
            Globals.STATE = LevelEditor(join('maps', 'map_def.txt'),
                                        join(CustomLevelPicker.CUSTOM_MAP_PATH,
                                             file_path),
                                        globals=Globals,
                                        in_game=True)
        else:
            Globals.STATE = CustomLevelNameInput()

    def handle_delete(self):
        if self.current_selection != 0:
            full_name = self.file_manager.fix_ext(
                self.file_names[self.current_selection - 1])
            full_path = join(CustomLevelPicker.CUSTOM_MAP_PATH, full_name)
            try:
                os.remove(full_path)
                self.file_names = self.file_manager.get_files(strip_ext=True)
                self.handle_change(-1)
            except Exception as e:
                print 'An error occured while deleting "' + full_path + '"'
                print e

    def handle_escape(self):
        Globals.STATE = Menu.Menu()

    def handle_return(self):
        self.handle_selection()

    def handle_raw_event(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_e:
                self.handle_edit_selection()
            elif event.key == pygame.K_d:
                self.handle_delete()

    def handle_key_up(self, keydown):
        if keydown:
            self.handle_change(-1)

    def handle_key_down(self, keydown):
        if keydown:
            self.handle_change(1)
Exemplo n.º 7
0
class ControlSettings(GameState):
    TITLE_IMAGE_PATH = 'control_settings.png'
    TITLE_MARGIN_TOP = 60
    TITLE_TEXT_MARGIN = 40
    TITLE_ARROW_MARGIN = 100
    SURF_INDEX_NORMAL = 0
    SURF_INDEX_HIT = 1
    SURF_INDEX_SELECTED = 2
    ARROW_PADDING = 10
    KEY_PADDING = 30
    RESET_MARGIN_BOTTOM = 20
    INDEX_UP = 0
    INDEX_DOWN = 2
    INDEX_LEFT = 1
    INDEX_RIGHT = 3
    INDEX_ATTACK = 4
    INDEX_ACTION = 5
    INDEX_ESCAPE = 6
    INDEX_RETURN = 7
    INDEX_RESET = 8
    NUM_OPTIONS = 9

    def __init__(self):
        self.loader = AssetLoader('images')
        self.control_loader = AssetLoader(join('images', 'controls'))
        self.background_img = self.loader.load_image('background.png')
        self.title_surf = self.loader.load_image_alpha(
            ControlSettings.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.centerx = Globals.WIDTH / 2
        self.title_rect.top = ControlSettings.TITLE_MARGIN_TOP
        self.arrows_top = self.title_rect.bottom + \
            ControlSettings.TITLE_ARROW_MARGIN
        self.arrows_x_center = int(Globals.WIDTH / 4)
        self.text_top = self.title_rect.bottom + \
            ControlSettings.TITLE_TEXT_MARGIN
        self.surf_rect_pairs = [
            SurfRectPair() for i in range(0, ControlSettings.NUM_OPTIONS)
        ]
        self.surf_index = [
            ControlSettings.SURF_INDEX_NORMAL
            for i in range(0, ControlSettings.NUM_OPTIONS)
        ]
        self.last_surf_index = [
            ControlSettings.SURF_INDEX_NORMAL
            for i in range(0, ControlSettings.NUM_OPTIONS)
        ]
        self.ignore_index = [0 for i in range(0, ControlSettings.NUM_OPTIONS)]
        self.load_control_images()
        self.selection = 0
        self.set_selection(0)

    def set_selection(self, index):
        if self.selection != -1:
            if self.surf_index[self.selection] == \
                    ControlSettings.SURF_INDEX_HIT:
                self.last_surf_index[
                    self.selection] = ControlSettings.SURF_INDEX_NORMAL
            else:
                self.last_surf_index[
                    self.selection] = ControlSettings.SURF_INDEX_NORMAL
                self.surf_index[
                    self.selection] = ControlSettings.SURF_INDEX_NORMAL
        self.selection = index
        if self.surf_index[index] == ControlSettings.SURF_INDEX_HIT:
            self.last_surf_index[index] = ControlSettings.SURF_INDEX_SELECTED
        else:
            self.last_surf_index[index] = self.surf_index[index]
            self.surf_index[index] = ControlSettings.SURF_INDEX_SELECTED

    def change_selection(self, delta):
        index = self.selection + delta
        if index < 0 or index >= ControlSettings.NUM_OPTIONS:
            return
        self.set_selection(index)

    def select(self):
        if self.selection == -1:
            return
        if self.selection == ControlSettings.INDEX_RESET:
            SettingsManager.reset_controls()
            self.set_selection(0)
            return
        Globals.STATE = SetJoystickKeyState(
            self.surf_rect_pairs[self.selection].surf_arr[0],
            list_index=self.selection,
            return_state=self)

    def load_image_group(self, file_path):
        return self.control_loader.load_spritesheet_alpha(file_path,
                                                          num_rows=3,
                                                          num_cols=1)

    def set_surf_arr(self, index, file_path):
        self.surf_rect_pairs[index].surf_arr = self.load_image_group(file_path)
        self.surf_rect_pairs[index].rect = self.surf_rect_pairs[
            index].surf_arr[0].get_rect()

    def get_surf(self, index):
        return self.surf_rect_pairs[index].surf_arr[self.surf_index[index]]

    def get_rect(self, index):
        return self.surf_rect_pairs[index].rect

    def load_control_images(self):
        self.load_arrows()
        self.set_surf_arr(ControlSettings.INDEX_ATTACK, 'attack_key.png')
        self.set_surf_arr(ControlSettings.INDEX_ACTION, 'action_key.png')
        self.set_surf_arr(ControlSettings.INDEX_ESCAPE, 'escape_key.png')
        self.set_surf_arr(ControlSettings.INDEX_RETURN, 'return_key.png')
        self.set_surf_arr(ControlSettings.INDEX_RESET, 'reset_controls.png')

        centerx = int((3 * Globals.WIDTH) / 4)
        attack_key_rect = self.get_rect(ControlSettings.INDEX_ATTACK)
        attack_key_rect.centerx = centerx
        attack_key_rect.top = self.text_top

        action_key_rect = self.get_rect(ControlSettings.INDEX_ACTION)
        action_key_rect.centerx = centerx
        action_key_rect.top = attack_key_rect.bottom + \
            ControlSettings.KEY_PADDING

        escape_key_rect = self.get_rect(ControlSettings.INDEX_ESCAPE)
        escape_key_rect.centerx = centerx
        escape_key_rect.top = action_key_rect.bottom + \
            ControlSettings.KEY_PADDING

        return_key_rect = self.get_rect(ControlSettings.INDEX_RETURN)
        return_key_rect.centerx = centerx
        return_key_rect.top = escape_key_rect.bottom + \
            ControlSettings.KEY_PADDING

        reset_rect = self.get_rect(ControlSettings.INDEX_RESET)
        reset_rect.centerx = int(Globals.WIDTH / 2)
        reset_rect.bottom = Globals.HEIGHT - \
            ControlSettings.RESET_MARGIN_BOTTOM

    def load_arrows(self):
        self.set_surf_arr(ControlSettings.INDEX_UP, 'arrow_up.png')
        self.set_surf_arr(ControlSettings.INDEX_DOWN, 'arrow_down.png')
        self.set_surf_arr(ControlSettings.INDEX_LEFT, 'arrow_left.png')
        self.set_surf_arr(ControlSettings.INDEX_RIGHT, 'arrow_right.png')

        arrow_up_rect = self.get_rect(ControlSettings.INDEX_UP)
        arrow_up_rect.centerx = self.arrows_x_center
        arrow_up_rect.top = self.arrows_top
        arrow_down_rect = self.get_rect(ControlSettings.INDEX_DOWN)
        arrow_down_rect.centerx = arrow_up_rect.centerx
        arrow_down_rect.top = arrow_up_rect.bottom + \
            ControlSettings.ARROW_PADDING
        arrow_left_rect = self.get_rect(ControlSettings.INDEX_LEFT)
        arrow_left_rect.top = arrow_down_rect.top
        arrow_left_rect.right = arrow_down_rect.left - \
            ControlSettings.ARROW_PADDING
        arrow_right_rect = self.get_rect(ControlSettings.INDEX_RIGHT)
        arrow_right_rect.top = arrow_down_rect.top
        arrow_right_rect.left = arrow_down_rect.right + \
            ControlSettings.ARROW_PADDING

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        for i, pair in enumerate(self.surf_rect_pairs):
            Globals.SCREEN.blit(pair.surf_arr[self.surf_index[i]], pair.rect)

    def handle_raw_event(self, event):
        if event.type == pygame.KEYDOWN:
            index = -1
            if event in SettingsManager.EVENTS_UP:
                index = ControlSettings.INDEX_UP
            elif event in SettingsManager.EVENTS_DOWN:
                index = ControlSettings.INDEX_DOWN
            elif event in SettingsManager.EVENTS_LEFT:
                index = ControlSettings.INDEX_LEFT
            elif event in SettingsManager.EVENTS_RIGHT:
                index = ControlSettings.INDEX_RIGHT
            elif event in SettingsManager.EVENTS_ESCAPE:
                index = ControlSettings.INDEX_ESCAPE
            elif event in SettingsManager.EVENTS_ACTION:
                index = ControlSettings.INDEX_ACTION
            elif event in SettingsManager.EVENTS_ATTACK:
                index = ControlSettings.INDEX_ATTACK
            elif event in SettingsManager.EVENTS_RETURN:
                index = ControlSettings.INDEX_RETURN
            if index != -1:
                self.ignore_index[index] = 2

    def quit(self):
        import SettingsState
        Globals.STATE = SettingsState.SettingsState()

    def check_hit(self, index, keydown=True):
        if not keydown:
            self.ignore_index[index] = 0
            if self.surf_index[index] != ControlSettings.SURF_INDEX_SELECTED:
                self.set_last_state(index)
            return False
        if self.ignore_index[index] > 0:
            self.ignore_index[index] -= 1
            if self.surf_index[index] != ControlSettings.SURF_INDEX_SELECTED:
                self.set_last_state(index)
            return False
        self.last_surf_index[index] = self.surf_index[index]
        self.surf_index[index] = ControlSettings.SURF_INDEX_HIT
        return True

    def set_last_state(self, index):
        if self.last_surf_index[index] == ControlSettings.SURF_INDEX_HIT:
            self.last_surf_index[index] = ControlSettings.SURF_INDEX_NORMAL
        self.surf_index[index] = self.last_surf_index[index]

    def handle_action_key(self, keydown=True):
        self.check_hit(ControlSettings.INDEX_ACTION, keydown)

    def handle_action_keyup(self):
        self.handle_action_key(False)

    def handle_attack(self, keydown=True):
        self.check_hit(ControlSettings.INDEX_ATTACK, keydown)

    def handle_attack_keyup(self):
        self.handle_attack(False)

    def handle_key_down(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_DOWN] > 0:
            self.change_selection(1)
        self.check_hit(ControlSettings.INDEX_DOWN, keydown)

    def handle_key_up(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_UP] > 0:
            self.change_selection(-1)
        self.check_hit(ControlSettings.INDEX_UP, keydown)

    def handle_key_left(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_LEFT] > 0:
            self.change_selection(-1)
        self.check_hit(ControlSettings.INDEX_LEFT, keydown)

    def handle_key_right(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_RIGHT] > 0:
            self.change_selection(1)
        self.check_hit(ControlSettings.INDEX_RIGHT, keydown)

    def handle_backspace(self):
        pass

    def handle_return(self, keydown=True):
        if keydown and self.ignore_index[ControlSettings.INDEX_RETURN] > 0:
            self.select()
            self.ignore_index[ControlSettings.INDEX_RETURN] = 0
        else:
            self.check_hit(ControlSettings.INDEX_RETURN, keydown)

    def handle_return_keyup(self):
        self.handle_return(False)

    def handle_escape(self, keydown=True):
        if self.ignore_index[ControlSettings.INDEX_ESCAPE] > 0:
            self.quit()
        self.check_hit(ControlSettings.INDEX_ESCAPE, keydown)

    def handle_escape_keyup(self):
        self.handle_escape(False)
Exemplo n.º 8
0
class PauseScreen(GameState):
    UNPAUSE_KEYS = [pygame.K_p, pygame.K_RETURN]
    TITLE_FONT = pygame.font.Font(None, 100)
    TITLE_TEXT = 'Game Paused'
    TITLE_COLOR = pygame.color.Color('white')
    ALPHA_FACTOR = 550
    MIN_ALPHA = 0
    MAX_ALPHA = 255

    def __init__(self, return_state, escape_state=None):
        self.return_state = return_state
        self.escape_state = escape_state if escape_state is not None else \
            Menu.Menu()
        self.loader = AssetLoader('images')
        self.background_img = self.loader.load_image('background.png')
        self.pause_image = self.loader.load_image_alpha('game-paused.png')
        Globals.play_menu_sound()
        # self.title_surf = PauseScreen.TITLE_FONT.render(
        #     PauseScreen.TITLE_TEXT, True, PauseScreen.TITLE_COLOR)
        # self.title_rect = self.title_surf.get_rect()
        # self.title_rect.center = Globals.SCREEN.get_rect().center
        self.black_surf = pygame.Surface(
            (Globals.WIDTH, Globals.HEIGHT)).convert()
        self.black_surf.fill((0, 0, 0))
        self.fade_in = False
        self.fade_out = False
        self.alpha_factor = 300
        self.start_fade_in()

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        # Globals.SCREEN.blit(self.title_surf, self.title_rect)
        Globals.SCREEN.blit(self.pause_image, [175, Globals.HEIGHT / 3])

        if self.fade_out or self.fade_in:
            Globals.SCREEN.blit(self.black_surf, (0, 0))

    def update(self, time):
        if self.fade_out:
            old_alpha = self.black_surf.get_alpha()
            new_alpha = int(old_alpha + time * PauseScreen.ALPHA_FACTOR)
            if new_alpha >= PauseScreen.MAX_ALPHA:
                self.handle_finish_fade_out()
                self.fade_out = False
            self.black_surf.set_alpha(new_alpha)
        elif self.fade_in:
            old_alpha = self.black_surf.get_alpha()
            new_alpha = int(old_alpha - time * PauseScreen.ALPHA_FACTOR)
            if new_alpha <= PauseScreen.MIN_ALPHA:
                self.fade_in = False
            self.black_surf.set_alpha(new_alpha)

    def start_fade_out(self):
        if self.fade_out:
            return
        self.black_surf.set_alpha(PauseScreen.MIN_ALPHA)
        self.fade_out = True

    def start_fade_in(self):
        self.black_surf.set_alpha(PauseScreen.MAX_ALPHA)
        self.fade_in = True

    def handle_finish_fade_out(self):
        fn = getattr(self.return_state, "handle_unpause", None)
        if callable(fn):
            fn()
        Globals.STATE = self.return_state

    def handle_escape(self):
        Globals.STATE = self.escape_state

    def handle_return(self):
        Globals.stop_menu_sound()
        self.start_fade_out()

    def handle_action_key(self):
        Globals.stop_menu_sound()
        self.start_fade_out()

    def handle_raw_event(self, event):
        if EventManager.is_keyboard_event(event.type) and \
                event not in SettingsManager.EVENTS_ESCAPE and \
                event not in SettingsManager.EVENTS_RETURN and \
                event not in SettingsManager.EVENTS_ACTION:
            self.handle_return()
Exemplo n.º 9
0
class CustomLevelPicker(GameState):
    MAP_FILE_EXT = 'txt'
    CUSTOM_MAP_PATH = join('maps', 'custom')
    PLAY_PATH = 'custom'
    SELECTION_FONT = pygame.font.Font(None, 70)
    SELECTION_COLOR = pygame.color.Color('white')
    CREATE_NEW_TEXT = 'Create New Level'
    SELECTION_TOP_MARGIN = 30
    SELECTION_PADDING = 20
    HIGHLIGHT_PADDING_HEIGHT = 30
    HIGHLIGHT_PADDING_WIDTH = 70
    HIGHLIGHT_COLOR = pygame.color.Color("black")
    HIGHLIGHT_ALPHA = 150
    ARROW_MARGIN = 20
    SUBTITLE_BACKGROUND = pygame.color.Color("black")
    SUBTITLE_PADDING = 10
    CENTER_SUBTITLE_TEXT = "Press enter to play"
    LEFT_SUBTITLE_TEXT = "Press 'd' to delete"
    RIGHT_SUBTITLE_TEXT = "Press 'e' to edit"
    SUBTITLE_OFFSET = 40
    NEW_SUBTITLE_TEXT = "Press enter"
    SUBTITLE_COLOR = pygame.color.Color("white")
    SUBTITLE_FONT = pygame.font.Font(None, 32)
    SUBTITLE_MARGIN_BOTTOM = 50
    TITLE_IMAGE_PATH = 'customlevel.png'
    TITLE_MARGIN_TOP = 70

    def __init__(self):
        self.init_images()
        self.file_manager = FileManager(
            path=CustomLevelPicker.CUSTOM_MAP_PATH,
            file_ext=CustomLevelPicker.MAP_FILE_EXT)
        self.file_names = self.file_manager.get_files(strip_ext=True)
        self.current_selection = 0
        self.text_surf = None
        self.text_rect = None
        self.highlight_surf = None
        self.highlight_rect = None
        self.build_text()
        self.build_subtitles()
        Globals.play_menu_sound()

    def init_images(self):
        self.loader = AssetLoader('images')
        self.background_img = self.loader.load_image('background.png')
        self.title_surf = self.loader.load_image_alpha(
            CustomLevelPicker.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.center = Globals.SCREEN.get_rect().center
        self.title_rect.top = CustomLevelPicker.TITLE_MARGIN_TOP
        self.arrow_down_surf = self.loader.load_image_alpha('arrow_down.png')
        self.arrow_down_rect = self.arrow_down_surf.get_rect()
        self.arrow_up_surf = self.loader.load_image_alpha('arrow_up.png')
        self.arrow_up_rect = self.arrow_up_surf.get_rect()
        self.arrow_up_rect.centerx = Globals.WIDTH / 2
        self.arrow_down_rect.centerx = Globals.WIDTH / 2

    def build_subtitles(self):
        self.left_subtitle_surf, self.left_subtitle_rect = self.init_subtitle(
            CustomLevelPicker.LEFT_SUBTITLE_TEXT,
            Globals.WIDTH / 4 - CustomLevelPicker.SUBTITLE_OFFSET)
        self.center_subtitle_surf, self.center_subtitle_rect = \
            self.init_subtitle(CustomLevelPicker.CENTER_SUBTITLE_TEXT,
                               Globals.WIDTH / 2)
        self.right_subtitle_surf, self.right_subtitle_rect = \
            self.init_subtitle(
                CustomLevelPicker.RIGHT_SUBTITLE_TEXT,
                (3 * Globals.WIDTH) / 4 + CustomLevelPicker.SUBTITLE_OFFSET)
        self.new_subtitle_surf, self.new_subtitle_rect = \
            self.init_subtitle(CustomLevelPicker.NEW_SUBTITLE_TEXT,
                               Globals.WIDTH / 2)

    def init_subtitle(self, text, centerx):
        text_surf = CustomLevelPicker.SUBTITLE_FONT.render(
            text, True, CustomLevelPicker.SUBTITLE_COLOR)
        subtitle_rect = text_surf.get_rect()
        subtitle_rect.bottom = \
            Globals.HEIGHT - CustomLevelPicker.SUBTITLE_MARGIN_BOTTOM
        subtitle_rect.centerx = centerx
        subtitle_rect.inflate_ip(
            CustomLevelPicker.SUBTITLE_PADDING * 2,
            CustomLevelPicker.SUBTITLE_PADDING * 2
        )
        subtitle_surf = pygame.Surface(subtitle_rect.size).convert()
        subtitle_surf.fill(CustomLevelPicker.SUBTITLE_BACKGROUND)
        subtitle_surf.blit(text_surf, (
            CustomLevelPicker.SUBTITLE_PADDING,
            CustomLevelPicker.SUBTITLE_PADDING
        ))
        return subtitle_surf, subtitle_rect

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        Globals.SCREEN.blit(self.highlight_surf, self.highlight_rect)
        Globals.SCREEN.blit(self.text_surf, self.text_rect)
        if self.current_selection == 0:
            Globals.SCREEN.blit(self.new_subtitle_surf, self.new_subtitle_rect)
        else:
            Globals.SCREEN.blit(
                self.left_subtitle_surf, self.left_subtitle_rect)
            Globals.SCREEN.blit(
                self.center_subtitle_surf, self.center_subtitle_rect)
            Globals.SCREEN.blit(
                self.right_subtitle_surf, self.right_subtitle_rect)
        if len(self.file_names) > 0:
            Globals.SCREEN.blit(self.arrow_down_surf, self.arrow_down_rect)
            Globals.SCREEN.blit(self.arrow_up_surf, self.arrow_up_rect)

    def build_text(self):
        self.text_surf = CustomLevelPicker.SELECTION_FONT.render(
            self.get_selection_name(), True, CustomLevelPicker.SELECTION_COLOR)
        self.text_rect = self.text_surf.get_rect()
        self.text_rect.center = Globals.SCREEN.get_rect().center
        self.text_rect.top += CustomLevelPicker.SELECTION_TOP_MARGIN
        self.highlight_rect = self.text_rect.inflate(
            CustomLevelPicker.HIGHLIGHT_PADDING_WIDTH,
            CustomLevelPicker.HIGHLIGHT_PADDING_HEIGHT)
        self.highlight_surf = pygame.Surface(self.highlight_rect.size)
        self.highlight_surf.fill(CustomLevelPicker.HIGHLIGHT_COLOR)
        self.highlight_surf.set_alpha(CustomLevelPicker.HIGHLIGHT_ALPHA)
        self.arrow_up_rect.bottom = self.highlight_rect.top - \
            CustomLevelPicker.ARROW_MARGIN
        self.arrow_down_rect.top = self.highlight_rect.bottom + \
            CustomLevelPicker.ARROW_MARGIN

    def get_selection_name(self):
        if self.current_selection == 0:
            return CustomLevelPicker.CREATE_NEW_TEXT
        else:
            return self.file_names[self.current_selection - 1]

    def handle_change(self, delta):
        self.current_selection = (self.current_selection + delta) % \
            (len(self.file_names) + 1)
        self.build_text()

    def handle_selection(self):
        if self.current_selection != 0:
            file_path = self.file_manager.fix_ext(
                self.file_names[self.current_selection - 1])
            level = CustomLevel(join(CustomLevelPicker.PLAY_PATH,
                                     file_path))
            level.got_current_state()
            Globals.STATE = level
        else:
            Globals.STATE = CustomLevelNameInput()

    def handle_edit_selection(self):
        if self.current_selection != 0:
            file_path = self.file_manager.fix_ext(
                self.file_names[self.current_selection - 1])
            Globals.STATE = LevelEditor(
                join('maps', 'map_def.txt'),
                join(CustomLevelPicker.CUSTOM_MAP_PATH, file_path),
                globals=Globals, in_game=True)
        else:
            Globals.STATE = CustomLevelNameInput()

    def handle_delete(self):
        if self.current_selection != 0:
            full_name = self.file_manager.fix_ext(
                self.file_names[self.current_selection - 1])
            full_path = join(CustomLevelPicker.CUSTOM_MAP_PATH, full_name)
            try:
                os.remove(full_path)
                self.file_names = self.file_manager.get_files(strip_ext=True)
                self.handle_change(-1)
            except Exception as e:
                print 'An error occured while deleting "' + full_path + '"'
                print e

    def handle_escape(self):
        Globals.STATE = Menu.Menu()

    def handle_return(self):
        self.handle_selection()

    def handle_raw_event(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_e:
                self.handle_edit_selection()
            elif event.key == pygame.K_d:
                self.handle_delete()

    def handle_key_up(self, keydown):
        if keydown:
            self.handle_change(-1)

    def handle_key_down(self, keydown):
        if keydown:
            self.handle_change(1)
Exemplo n.º 10
0
class SettingsState(GameState):
    SLIDER_SIZE = (400, 50)
    SLIDER_DELTA = 10
    MIN_BRIGHTNESS = 30
    TITLE_IMAGE_PATH = 'settings.png'
    CONTROL_IMAGE_PATH = 'control_settings_small.png'
    VOLUME_IMAGE_PATH = 'volume.png'
    BRIGHTNESS_IMAGE_PATH = 'brightness.png'
    TITLE_MARGIN_TOP = 60
    TITLE_MARGIN_BOTTOM = 50
    LABEL_SLIDER_MARGIN = 5
    SLIDER_MARGIN = 10
    LABEL_FONT = pygame.font.Font(None, 60)
    LABEL_COLOR = pygame.color.Color('white')

    def __init__(self):
        self.loader = AssetLoader('images')
        self.background_img = self.loader.load_image('background.png')
        Globals.play_menu_sound()
        self.title_surf = self.loader.load_image_alpha(
            SettingsState.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.centerx = Globals.WIDTH / 2
        self.title_rect.top = SettingsState.TITLE_MARGIN_TOP
        self.control_index = 0
        self.init_labels()
        self.init_sliders()
        self.selected = 0

    def init_labels(self):
        self.volume_label_surf = self.loader.load_image_alpha(
            SettingsState.VOLUME_IMAGE_PATH)
        self.volume_label_rect = self.volume_label_surf.get_rect()
        self.volume_label_rect.centerx = Globals.WIDTH / 2
        self.volume_label_rect.top = self.title_rect.bottom + \
            SettingsState.TITLE_MARGIN_BOTTOM

        self.brightness_label_surf = self.loader.load_image_alpha(
            SettingsState.BRIGHTNESS_IMAGE_PATH)
        self.brightness_label_rect = self.brightness_label_surf.get_rect()
        self.brightness_label_rect.centerx = Globals.WIDTH / 2
        self.brightness_label_rect.top = self.volume_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN + \
            SettingsState.SLIDER_SIZE[1] + SettingsState.SLIDER_MARGIN

        self.control_surfs = self.loader.load_spritesheet_alpha(
            SettingsState.CONTROL_IMAGE_PATH, num_rows=2, num_cols=1)
        self.control_rect = self.control_surfs[0].get_rect()
        self.control_rect.centerx = Globals.WIDTH / 2
        self.control_rect.top = self.brightness_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN + \
            SettingsState.SLIDER_SIZE[1] + SettingsState.SLIDER_MARGIN

    def init_sliders(self):
        volume_slider_rect = pygame.Rect((0, 0), SettingsState.SLIDER_SIZE)
        volume_slider_rect.centerx = Globals.WIDTH / 2
        volume_slider_rect.top = self.volume_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN
        self.volume_slider = SettingsSlider(volume_slider_rect,
                                            max_value=100,
                                            value=SettingsManager.VOLUME)
        self.volume_slider.select()
        brightness_slider_rect = pygame.Rect((0, 0), SettingsState.SLIDER_SIZE)
        brightness_slider_rect.centerx = Globals.WIDTH / 2
        brightness_slider_rect.top = self.brightness_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN
        self.brightness_slider = SettingsSlider(
            brightness_slider_rect,
            max_value=(100 - SettingsState.MIN_BRIGHTNESS),
            value=(SettingsManager.BRIGHTNESS - SettingsState.MIN_BRIGHTNESS))

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        Globals.SCREEN.blit(self.volume_label_surf, self.volume_label_rect)

        Globals.SCREEN.blit(self.brightness_label_surf,
                            self.brightness_label_rect)
        Globals.SCREEN.blit(self.control_surfs[self.control_index],
                            self.control_rect)
        self.volume_slider.render(Globals.SCREEN)
        self.brightness_slider.render(Globals.SCREEN)

    def update(self, time):
        self.volume_slider.update(time)
        self.brightness_slider.update(time)

    def change_selection(self, delta):
        self.selected = (self.selected + delta) % 3
        if self.selected == 0:
            self.control_index = 0
            self.volume_slider.select()
            self.brightness_slider.deselect()
        if self.selected == 1:
            self.control_index = 0
            self.volume_slider.deselect()
            self.brightness_slider.select()
        elif self.selected == 2:
            self.control_index = 1
            self.brightness_slider.deselect()
            self.volume_slider.deselect()

    def change_value(self, factor=1):
        if self.selected == 0:
            self.volume_slider.change_value(SettingsState.SLIDER_DELTA *
                                            factor)
            Globals.set_volume(self.volume_slider.value)
        elif self.selected == 1:
            self.brightness_slider.change_value(SettingsState.SLIDER_DELTA *
                                                factor)
            Globals.set_brightness(SettingsState.MIN_BRIGHTNESS +
                                   self.brightness_slider.value)

    def handle_escape(self):
        Globals.STATE = Menu.Menu()

    def handle_return(self):
        if self.selected == 2:
            Globals.STATE = ControlSettings()

    def handle_key_left(self, keydown):
        if keydown:
            self.change_value(-1)

    def handle_key_right(self, keydown):
        if keydown:
            self.change_value(1)

    def handle_key_up(self, keydown):
        if keydown:
            self.change_selection(-1)

    def handle_key_down(self, keydown):
        if keydown:
            self.change_selection(1)
Exemplo n.º 11
0
class ControlSettings(GameState):
    TITLE_IMAGE_PATH = 'control_settings.png'
    TITLE_MARGIN_TOP = 60
    TITLE_TEXT_MARGIN = 40
    TITLE_ARROW_MARGIN = 100
    SURF_INDEX_NORMAL = 0
    SURF_INDEX_HIT = 1
    SURF_INDEX_SELECTED = 2
    ARROW_PADDING = 10
    KEY_PADDING = 30
    RESET_MARGIN_BOTTOM = 20
    INDEX_UP = 0
    INDEX_DOWN = 2
    INDEX_LEFT = 1
    INDEX_RIGHT = 3
    INDEX_ATTACK = 4
    INDEX_ACTION = 5
    INDEX_ESCAPE = 6
    INDEX_RETURN = 7
    INDEX_RESET = 8
    NUM_OPTIONS = 9

    def __init__(self):
        self.loader = AssetLoader('images')
        self.control_loader = AssetLoader(join('images', 'controls'))
        self.background_img = self.loader.load_image('background.png')
        self.title_surf = self.loader.load_image_alpha(
            ControlSettings.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.centerx = Globals.WIDTH / 2
        self.title_rect.top = ControlSettings.TITLE_MARGIN_TOP
        self.arrows_top = self.title_rect.bottom + \
            ControlSettings.TITLE_ARROW_MARGIN
        self.arrows_x_center = int(Globals.WIDTH / 4)
        self.text_top = self.title_rect.bottom + \
            ControlSettings.TITLE_TEXT_MARGIN
        self.surf_rect_pairs = [SurfRectPair()
                                for i in range(0, ControlSettings.NUM_OPTIONS)]
        self.surf_index = [ControlSettings.SURF_INDEX_NORMAL for i in range(
            0, ControlSettings.NUM_OPTIONS)]
        self.last_surf_index = [
            ControlSettings.SURF_INDEX_NORMAL for i in
            range(0, ControlSettings.NUM_OPTIONS)]
        self.ignore_index = [0 for i in range(0, ControlSettings.NUM_OPTIONS)]
        self.load_control_images()
        self.selection = 0
        self.set_selection(0)

    def set_selection(self, index):
        if self.selection != -1:
            if self.surf_index[self.selection] == \
                    ControlSettings.SURF_INDEX_HIT:
                self.last_surf_index[
                    self.selection] = ControlSettings.SURF_INDEX_NORMAL
            else:
                self.last_surf_index[
                    self.selection] = ControlSettings.SURF_INDEX_NORMAL
                self.surf_index[
                    self.selection] = ControlSettings.SURF_INDEX_NORMAL
        self.selection = index
        if self.surf_index[index] == ControlSettings.SURF_INDEX_HIT:
            self.last_surf_index[index] = ControlSettings.SURF_INDEX_SELECTED
        else:
            self.last_surf_index[index] = self.surf_index[index]
            self.surf_index[index] = ControlSettings.SURF_INDEX_SELECTED

    def change_selection(self, delta):
        index = self.selection + delta
        if index < 0 or index >= ControlSettings.NUM_OPTIONS:
            return
        self.set_selection(index)

    def select(self):
        if self.selection == -1:
            return
        if self.selection == ControlSettings.INDEX_RESET:
            SettingsManager.reset_controls()
            self.set_selection(0)
            return
        Globals.STATE = SetJoystickKeyState(
            self.surf_rect_pairs[self.selection].surf_arr[0],
            list_index=self.selection, return_state=self)

    def load_image_group(self, file_path):
        return self.control_loader.load_spritesheet_alpha(
            file_path, num_rows=3, num_cols=1)

    def set_surf_arr(self, index, file_path):
        self.surf_rect_pairs[index].surf_arr = self.load_image_group(file_path)
        self.surf_rect_pairs[index].rect = self.surf_rect_pairs[
            index].surf_arr[0].get_rect()

    def get_surf(self, index):
        return self.surf_rect_pairs[index].surf_arr[self.surf_index[index]]

    def get_rect(self, index):
        return self.surf_rect_pairs[index].rect

    def load_control_images(self):
        self.load_arrows()
        self.set_surf_arr(ControlSettings.INDEX_ATTACK, 'attack_key.png')
        self.set_surf_arr(ControlSettings.INDEX_ACTION, 'action_key.png')
        self.set_surf_arr(ControlSettings.INDEX_ESCAPE, 'escape_key.png')
        self.set_surf_arr(ControlSettings.INDEX_RETURN, 'return_key.png')
        self.set_surf_arr(ControlSettings.INDEX_RESET, 'reset_controls.png')

        centerx = int((3 * Globals.WIDTH) / 4)
        attack_key_rect = self.get_rect(ControlSettings.INDEX_ATTACK)
        attack_key_rect.centerx = centerx
        attack_key_rect.top = self.text_top

        action_key_rect = self.get_rect(ControlSettings.INDEX_ACTION)
        action_key_rect.centerx = centerx
        action_key_rect.top = attack_key_rect.bottom + \
            ControlSettings.KEY_PADDING

        escape_key_rect = self.get_rect(ControlSettings.INDEX_ESCAPE)
        escape_key_rect.centerx = centerx
        escape_key_rect.top = action_key_rect.bottom + \
            ControlSettings.KEY_PADDING

        return_key_rect = self.get_rect(ControlSettings.INDEX_RETURN)
        return_key_rect.centerx = centerx
        return_key_rect.top = escape_key_rect.bottom + \
            ControlSettings.KEY_PADDING

        reset_rect = self.get_rect(ControlSettings.INDEX_RESET)
        reset_rect.centerx = int(Globals.WIDTH / 2)
        reset_rect.bottom = Globals.HEIGHT - \
            ControlSettings.RESET_MARGIN_BOTTOM

    def load_arrows(self):
        self.set_surf_arr(ControlSettings.INDEX_UP, 'arrow_up.png')
        self.set_surf_arr(ControlSettings.INDEX_DOWN, 'arrow_down.png')
        self.set_surf_arr(ControlSettings.INDEX_LEFT, 'arrow_left.png')
        self.set_surf_arr(ControlSettings.INDEX_RIGHT, 'arrow_right.png')

        arrow_up_rect = self.get_rect(ControlSettings.INDEX_UP)
        arrow_up_rect.centerx = self.arrows_x_center
        arrow_up_rect.top = self.arrows_top
        arrow_down_rect = self.get_rect(ControlSettings.INDEX_DOWN)
        arrow_down_rect.centerx = arrow_up_rect.centerx
        arrow_down_rect.top = arrow_up_rect.bottom + \
            ControlSettings.ARROW_PADDING
        arrow_left_rect = self.get_rect(ControlSettings.INDEX_LEFT)
        arrow_left_rect.top = arrow_down_rect.top
        arrow_left_rect.right = arrow_down_rect.left - \
            ControlSettings.ARROW_PADDING
        arrow_right_rect = self.get_rect(ControlSettings.INDEX_RIGHT)
        arrow_right_rect.top = arrow_down_rect.top
        arrow_right_rect.left = arrow_down_rect.right + \
            ControlSettings.ARROW_PADDING

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        for i, pair in enumerate(self.surf_rect_pairs):
            Globals.SCREEN.blit(pair.surf_arr[self.surf_index[i]], pair.rect)

    def handle_raw_event(self, event):
        if event.type == pygame.KEYDOWN:
            index = -1
            if event in SettingsManager.EVENTS_UP:
                index = ControlSettings.INDEX_UP
            elif event in SettingsManager.EVENTS_DOWN:
                index = ControlSettings.INDEX_DOWN
            elif event in SettingsManager.EVENTS_LEFT:
                index = ControlSettings.INDEX_LEFT
            elif event in SettingsManager.EVENTS_RIGHT:
                index = ControlSettings.INDEX_RIGHT
            elif event in SettingsManager.EVENTS_ESCAPE:
                index = ControlSettings.INDEX_ESCAPE
            elif event in SettingsManager.EVENTS_ACTION:
                index = ControlSettings.INDEX_ACTION
            elif event in SettingsManager.EVENTS_ATTACK:
                index = ControlSettings.INDEX_ATTACK
            elif event in SettingsManager.EVENTS_RETURN:
                index = ControlSettings.INDEX_RETURN
            if index != -1:
                self.ignore_index[index] = 2

    def quit(self):
        import SettingsState
        Globals.STATE = SettingsState.SettingsState()

    def check_hit(self, index, keydown=True):
        if not keydown:
            self.ignore_index[index] = 0
            if self.surf_index[index] != ControlSettings.SURF_INDEX_SELECTED:
                self.set_last_state(index)
            return False
        if self.ignore_index[index] > 0:
            self.ignore_index[index] -= 1
            if self.surf_index[index] != ControlSettings.SURF_INDEX_SELECTED:
                self.set_last_state(index)
            return False
        self.last_surf_index[index] = self.surf_index[index]
        self.surf_index[index] = ControlSettings.SURF_INDEX_HIT
        return True

    def set_last_state(self, index):
        if self.last_surf_index[index] == ControlSettings.SURF_INDEX_HIT:
            self.last_surf_index[index] = ControlSettings.SURF_INDEX_NORMAL
        self.surf_index[index] = self.last_surf_index[index]

    def handle_action_key(self, keydown=True):
        self.check_hit(ControlSettings.INDEX_ACTION, keydown)

    def handle_action_keyup(self):
        self.handle_action_key(False)

    def handle_attack(self, keydown=True):
        self.check_hit(ControlSettings.INDEX_ATTACK, keydown)

    def handle_attack_keyup(self):
        self.handle_attack(False)

    def handle_key_down(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_DOWN] > 0:
            self.change_selection(1)
        self.check_hit(ControlSettings.INDEX_DOWN, keydown)

    def handle_key_up(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_UP] > 0:
            self.change_selection(-1)
        self.check_hit(ControlSettings.INDEX_UP, keydown)

    def handle_key_left(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_LEFT] > 0:
            self.change_selection(-1)
        self.check_hit(ControlSettings.INDEX_LEFT, keydown)

    def handle_key_right(self, keydown):
        if keydown and self.ignore_index[ControlSettings.INDEX_RIGHT] > 0:
            self.change_selection(1)
        self.check_hit(ControlSettings.INDEX_RIGHT, keydown)

    def handle_backspace(self):
        pass

    def handle_return(self, keydown=True):
        if keydown and self.ignore_index[ControlSettings.INDEX_RETURN] > 0:
            self.select()
            self.ignore_index[ControlSettings.INDEX_RETURN] = 0
        else:
            self.check_hit(ControlSettings.INDEX_RETURN, keydown)

    def handle_return_keyup(self):
        self.handle_return(False)

    def handle_escape(self, keydown=True):
        if self.ignore_index[ControlSettings.INDEX_ESCAPE] > 0:
            self.quit()
        self.check_hit(ControlSettings.INDEX_ESCAPE, keydown)

    def handle_escape_keyup(self):
        self.handle_escape(False)
Exemplo n.º 12
0
class SettingsSlider(object):
    BASE_HEIGHT_PERCENT = .5
    BASE_COLOR = (0, 229, 255)
    BASE_HIGHLIGHT_COLOR = pygame.color.Color('yellow')
    BASE_BORDER_COLOR = pygame.color.Color('black')
    BASE_BORDER_WIDTH = 4
    INDICATOR_WIDTH_PERCENT = .4
    INDICATOR_BORDER_PERCENT = .6
    INDICATOR_BORDER_COLOR = pygame.color.Color('black')
    INDICATOR_INNER_COLOR = pygame.color.Color('gray')
    ARROW_MARGIN = 15
    VELOCITY = 300

    def __init__(self, container, max_value=100, value=None):
        self.container = container
        self.max_value = max_value
        self.value = value if value is not None else self.max_value
        self.loader = AssetLoader('images')
        self.init_slider()
        self.init_arrows()
        self.selected = False

    def init_slider(self):
        self.init_indicator()
        self.init_base()

    def init_indicator(self):
        indicator_height = self.container.height
        indicator_width = indicator_height * \
            SettingsSlider.INDICATOR_WIDTH_PERCENT
        self.indicator_surf = pygame.Surface(
            (indicator_width, indicator_height)).convert()
        self.indicator_surf.fill(SettingsSlider.INDICATOR_INNER_COLOR)
        self.indicator_rect = self.indicator_surf.get_rect()
        pygame.draw.rect(
            self.indicator_surf,
            SettingsSlider.INDICATOR_BORDER_COLOR, self.indicator_rect,
            int(indicator_width * SettingsSlider.INDICATOR_BORDER_PERCENT))
        self.indicator_rect.top = self.container.top
        self.target_x = self.container.left + \
            self.container.width * self.get_percentage()
        self.indicator_rect.centerx = self.target_x

    def init_arrows(self):
        self.arrow_left_surf = self.loader.load_image_alpha('arrow_left.png')
        self.arrow_right_surf = self.loader.load_image_alpha('arrow_right.png')
        self.arrow_left_rect = self.arrow_left_surf.get_rect()
        self.arrow_right_rect = self.arrow_right_surf.get_rect()
        self.arrow_left_rect.centery = self.container.centery
        self.arrow_right_rect.centery = self.container.centery
        self.arrow_left_rect.right = self.container.left - \
            SettingsSlider.ARROW_MARGIN
        self.arrow_right_rect.left = self.container.right + \
            SettingsSlider.ARROW_MARGIN

    def init_base(self):
        base_height = self.container.height * \
            SettingsSlider.BASE_HEIGHT_PERCENT
        self.base_surf = pygame.Surface(
            (self.container.width, base_height)).convert()
        self.base_rect = self.base_surf.get_rect()
        self.base_rect.topleft = self.container.topleft
        self.base_rect.top += (self.container.height - base_height) / 2
        self.fill_base()

    def fill_base(self, base_color=BASE_COLOR):
        self.base_surf.fill(base_color)
        area = self.base_surf.get_rect()
        pygame.draw.rect(
            self.base_surf,
            SettingsSlider.BASE_BORDER_COLOR, area,
            SettingsSlider.BASE_BORDER_WIDTH)

    def select(self):
        self.fill_base(SettingsSlider.BASE_HIGHLIGHT_COLOR)
        self.selected = True

    def deselect(self):
        self.fill_base()
        self.selected = False

    def change_value(self, delta):
        self.set_value(self.value + delta)

    def set_value(self, value):
        self.value = value
        if self.value < 0:
            self.value = 0
        elif self.value > self.max_value:
            self.value = self.max_value
        self.target_x = self.container.left + \
            self.container.width * self.get_percentage()

    def get_percentage(self):
        return self.value / self.max_value

    def render(self, screen):
        screen.blit(self.base_surf, self.base_rect)
        screen.blit(self.indicator_surf, self.indicator_rect)
        if self.selected:
            if self.value > 0:
                screen.blit(self.arrow_left_surf, self.arrow_left_rect)
            if self.value < self.max_value:
                screen.blit(self.arrow_right_surf, self.arrow_right_rect)

    def update(self, time):
        if self.indicator_rect.centerx < self.target_x:
            self.indicator_rect.centerx = min(
                self.indicator_rect.centerx + SettingsSlider.VELOCITY * time,
                self.target_x)
        elif self.indicator_rect.centerx > self.target_x:
            self.indicator_rect.centerx = max(
                self.indicator_rect.centerx - SettingsSlider.VELOCITY * time,
                self.target_x)
Exemplo n.º 13
0
class SettingsState(GameState):
    SLIDER_SIZE = (400, 50)
    SLIDER_DELTA = 10
    MIN_BRIGHTNESS = 30
    TITLE_IMAGE_PATH = 'settings.png'
    CONTROL_IMAGE_PATH = 'control_settings_small.png'
    VOLUME_IMAGE_PATH = 'volume.png'
    BRIGHTNESS_IMAGE_PATH = 'brightness.png'
    TITLE_MARGIN_TOP = 60
    TITLE_MARGIN_BOTTOM = 50
    LABEL_SLIDER_MARGIN = 5
    SLIDER_MARGIN = 10
    LABEL_FONT = pygame.font.Font(None, 60)
    LABEL_COLOR = pygame.color.Color('white')

    def __init__(self):
        self.loader = AssetLoader('images')
        self.background_img = self.loader.load_image('background.png')
        Globals.play_menu_sound()
        self.title_surf = self.loader.load_image_alpha(
            SettingsState.TITLE_IMAGE_PATH)
        self.title_rect = self.title_surf.get_rect()
        self.title_rect.centerx = Globals.WIDTH / 2
        self.title_rect.top = SettingsState.TITLE_MARGIN_TOP
        self.control_index = 0
        self.init_labels()
        self.init_sliders()
        self.selected = 0

    def init_labels(self):
        self.volume_label_surf = self.loader.load_image_alpha(
            SettingsState.VOLUME_IMAGE_PATH)
        self.volume_label_rect = self.volume_label_surf.get_rect()
        self.volume_label_rect.centerx = Globals.WIDTH / 2
        self.volume_label_rect.top = self.title_rect.bottom + \
            SettingsState.TITLE_MARGIN_BOTTOM

        self.brightness_label_surf = self.loader.load_image_alpha(
            SettingsState.BRIGHTNESS_IMAGE_PATH)
        self.brightness_label_rect = self.brightness_label_surf.get_rect()
        self.brightness_label_rect.centerx = Globals.WIDTH / 2
        self.brightness_label_rect.top = self.volume_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN + \
            SettingsState.SLIDER_SIZE[1] + SettingsState.SLIDER_MARGIN

        self.control_surfs = self.loader.load_spritesheet_alpha(
            SettingsState.CONTROL_IMAGE_PATH, num_rows=2, num_cols=1)
        self.control_rect = self.control_surfs[0].get_rect()
        self.control_rect.centerx = Globals.WIDTH / 2
        self.control_rect.top = self.brightness_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN + \
            SettingsState.SLIDER_SIZE[1] + SettingsState.SLIDER_MARGIN

    def init_sliders(self):
        volume_slider_rect = pygame.Rect((0, 0), SettingsState.SLIDER_SIZE)
        volume_slider_rect.centerx = Globals.WIDTH / 2
        volume_slider_rect.top = self.volume_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN
        self.volume_slider = SettingsSlider(
            volume_slider_rect,
            max_value=100, value=SettingsManager.VOLUME)
        self.volume_slider.select()
        brightness_slider_rect = pygame.Rect((0, 0), SettingsState.SLIDER_SIZE)
        brightness_slider_rect.centerx = Globals.WIDTH / 2
        brightness_slider_rect.top = self.brightness_label_rect.bottom + \
            SettingsState.LABEL_SLIDER_MARGIN
        self.brightness_slider = SettingsSlider(
            brightness_slider_rect,
            max_value=(100 - SettingsState.MIN_BRIGHTNESS),
            value=(SettingsManager.BRIGHTNESS - SettingsState.MIN_BRIGHTNESS))

    def render(self):
        Globals.SCREEN.blit(self.background_img, (0, 0))
        Globals.SCREEN.blit(self.title_surf, self.title_rect)
        Globals.SCREEN.blit(self.volume_label_surf, self.volume_label_rect)

        Globals.SCREEN.blit(self.brightness_label_surf,
                            self.brightness_label_rect)
        Globals.SCREEN.blit(self.control_surfs[self.control_index],
                            self.control_rect)
        self.volume_slider.render(Globals.SCREEN)
        self.brightness_slider.render(Globals.SCREEN)

    def update(self, time):
        self.volume_slider.update(time)
        self.brightness_slider.update(time)

    def change_selection(self, delta):
        self.selected = (self.selected + delta) % 3
        if self.selected == 0:
            self.control_index = 0
            self.volume_slider.select()
            self.brightness_slider.deselect()
        if self.selected == 1:
            self.control_index = 0
            self.volume_slider.deselect()
            self.brightness_slider.select()
        elif self.selected == 2:
            self.control_index = 1
            self.brightness_slider.deselect()
            self.volume_slider.deselect()

    def change_value(self, factor=1):
        if self.selected == 0:
            self.volume_slider.change_value(
                SettingsState.SLIDER_DELTA * factor)
            Globals.set_volume(self.volume_slider.value)
        elif self.selected == 1:
            self.brightness_slider.change_value(
                SettingsState.SLIDER_DELTA * factor)
            Globals.set_brightness(SettingsState.MIN_BRIGHTNESS +
                                   self.brightness_slider.value)

    def handle_escape(self):
        Globals.STATE = Menu.Menu()

    def handle_return(self):
        if self.selected == 2:
            Globals.STATE = ControlSettings()

    def handle_key_left(self, keydown):
        if keydown:
            self.change_value(-1)

    def handle_key_right(self, keydown):
        if keydown:
            self.change_value(1)

    def handle_key_up(self, keydown):
        if keydown:
            self.change_selection(-1)

    def handle_key_down(self, keydown):
        if keydown:
            self.change_selection(1)