all repos — Legends-RPG @ 8d1f715d2aebeefc83f203f833ab8b86d0acec1b

A fantasy mini-RPG built with Python and Pygame.

data/states/credits.py (view raw)

  1import copy
  2import pygame as pg
  3from .. import tools, setup
  4from .. import constants as c
  5
  6
  7class CreditEntry(object):
  8    """
  9    The text for each credit for the game.
 10    """
 11    def __init__(self, level):
 12        self.alpha = 0
 13        self.font = pg.font.Font(setup.FONTS[c.MAIN_FONT], 22)
 14        self.credit_sprites = self.make_credits()
 15        self.index = 0
 16        self.current_credit = self.credit_sprites[self.index]
 17        self.state_dict = self.make_state_dict()
 18        self.state = c.TRANSITION_IN
 19        self.timer = 0.0
 20        self.level = level
 21
 22    def make_credits(self):
 23        """
 24        Make a list of lists for all the credit surfaces.
 25        """
 26        credits = [['THE STOLEN CROWN', 'A Fantasy RPG'],
 27                   ['PROGRAMMING AND GAME DESIGN', 'Justin Armstrong'],
 28                   ['ART', 'JPhilipp', 
 29                           'Reemax', 
 30                           'Lanea Zimmerman', 
 31                           'Redshrike', 
 32                           'StumpyStrust', 
 33                           'Benjamin Larsson', 
 34                           'russpuppy', 
 35                           'hc',
 36                           'Iron Star Media'],
 37                   ['MUSIC', 'Telaron: The King\'s Theme', 
 38                             'Mekathratos: Forest Dance (Town Theme)', 
 39                             'bart: Adventure Begins (Overworld Theme)', 
 40                             '8th Mode Music: High Action (Battle Theme)', 
 41                             'Arron Krogh: Coastal Town (Shop Theme)', 
 42                             'Arron Krogh: My Enemy (Dungeon Theme)', 
 43                             'Matthew Pablo: Enchanted Festival (Victory Theme)', 
 44                             'Matthew Pablo: Pleasant Creek (Brother Theme)'],
 45                   ['SOUND EFFECTS', 'Kenney',
 46                                     'Nic3_one',
 47                                     'Ekokubza123',
 48                                     'kuzyaburst',
 49                                     'audione'],
 50                   ['SPECIAL THANKS', '/r/pygame', 
 51                                      'Leif Theden', 
 52                                      'Stacey Hunniford']]
 53        
 54        credit_sprites = []
 55
 56        for credit in credits:
 57            subcredit_list = []
 58            for i, subcredit in enumerate(credit):
 59                text_sprite = pg.sprite.Sprite()
 60                text_sprite.text_image = self.font.render(subcredit, True, c.WHITE)
 61                text_sprite.rect = text_sprite.text_image.get_rect(centerx = 400,
 62                                                                   y=100+(i*40))
 63                text_sprite.image = pg.Surface(text_sprite.rect.size).convert()
 64                text_sprite.image.set_colorkey(c.BLACK)
 65                text_sprite.image.set_alpha(self.alpha)
 66                subcredit_list.append(text_sprite)
 67            credit_sprites.append(subcredit_list)
 68        
 69        return credit_sprites
 70
 71    def make_state_dict(self):
 72        """
 73        Make the dictionary of state methods used to update credit.
 74        """
 75        state_dict = {c.TRANSITION_IN: self.transition_in, 
 76                      c.TRANSITION_OUT: self.transition_out,
 77                      c.NORMAL: self.normal_update}
 78
 79        return state_dict
 80
 81    def transition_in(self):
 82        for credit in self.current_credit:
 83            credit.image = pg.Surface(credit.rect.size).convert()
 84            credit.image.set_colorkey(c.BLACK)
 85            credit.image.set_alpha(self.alpha)
 86            credit.image.blit(credit.text_image, (0, 0))
 87
 88        self.alpha += 5
 89        if self.alpha >= 255:
 90            self.alpha = 255
 91            self.state = c.NORMAL
 92            self.timer = self.current_time
 93
 94    def transition_out(self):
 95        for credit in self.current_credit:
 96            credit.image = pg.Surface(credit.rect.size).convert()
 97            credit.image.set_colorkey(c.BLACK)
 98            credit.image.set_alpha(self.alpha)
 99            credit.image.blit(credit.text_image, (0, 0))
100           
101        self.alpha -= 5
102        if self.alpha <= 0:
103            self.alpha = 0
104            if self.index < len(self.credit_sprites) - 1:
105                self.index += 1
106            else:
107                self.level.done = True
108                self.level.next = c.MAIN_MENU
109            self.current_credit = self.credit_sprites[self.index]
110            self.state = c.TRANSITION_IN
111
112    def normal_update(self):
113        if (self.current_time - self.timer) > 4500:
114            self.state = c.TRANSITION_OUT
115
116    def update(self, current_time):
117        self.current_time = current_time
118        update_method = self.state_dict[self.state]
119        update_method()
120
121    def draw(self, surface):
122        """
123        Draw the current credit to main surface.
124        """
125        for credit_sprite in self.current_credit:
126            surface.blit(credit_sprite.image, credit_sprite.rect)
127
128
129class Credits(tools._State):
130    """
131    End Credits Scene.
132    """
133    def __init__(self):
134        super(Credits, self).__init__()
135        self.name = c.CREDITS
136        self.music_title = None
137        self.previous_music = None
138        self.music = None
139        self.volume = None
140        self.credit = None
141    
142    def startup(self, current_time, game_data):
143        """
144        Initialize data at scene start. 
145        """
146        self.game_data = game_data
147        self.music = setup.MUSIC['overworld']
148        self.volume = 0.4
149        self.current_time = current_time
150        self.background = pg.Surface(setup.SCREEN_RECT.size)
151        self.background.fill(c.BLACK_BLUE)
152        self.credit = CreditEntry(self)
153
154    def update(self, surface, keys, current_time):
155        """
156        Update scene.
157        """
158        self.credit.update(current_time)
159        self.draw_scene(surface)
160
161    def draw_scene(self, surface):
162        """
163        Draw all graphics to the window surface.
164        """
165        surface.blit(self.background, (0, 0))
166        self.credit.draw(surface)
167        
168    
169