all repos — Legends-RPG @ bca46b8c54d44e37d0ae536923d18721651ea045

A fantasy mini-RPG built with Python and Pygame.

data/components/player.py (view raw)

  1__author__ = 'justinarmstrong'
  2
  3import pygame as pg
  4from .. import setup
  5
  6class Player(pg.sprite.Sprite):
  7    """User controllable character"""
  8    def __init__(self):
  9        super(Player, self).__init__()
 10        self.get_image = setup.tools.get_image
 11        self.spritesheet_dict = self.create_spritesheet()
 12        self.animation_lists = self.create_animation_lists()
 13        self.index = 1
 14        self.direction = 'up'
 15        self.image_list = self.animation_lists[self.direction]
 16        self.image = self.image_list[self.index]
 17        self.rect = self.image.get_rect()
 18        self.state_dict = self.create_state_dict()
 19        self.direction_dict = self.create_direction_dict()
 20        self.state = 'resting'
 21        self.x_vel = 0
 22        self.y_vel = 0
 23        self.direction = 'up'
 24        self.timer = 0.0
 25
 26
 27    def create_spritesheet(self):
 28        """Creates the sprite sheet dictionary for player"""
 29        sheet = setup.GFX['player']
 30        image_list = []
 31        for row in range(2):
 32            for column in range(4):
 33                image_list.append(self.get_image(
 34                    self, column*32, row*32, 32, 32, sheet))
 35
 36        dict = {'facing up 1': image_list[0],
 37                'facing up 2': image_list[1],
 38                'facing down 1': image_list[2],
 39                'facing down 2': image_list[3],
 40                'facing left 1': image_list[4],
 41                'facing left 2': image_list[5],
 42                'facing right 1': image_list[6],
 43                'facing right 2': image_list[7]}
 44
 45        return dict
 46
 47
 48    def create_animation_lists(self):
 49        """Create the lists for each walking direction"""
 50        image_dict = self.spritesheet_dict
 51
 52        left_list = [image_dict['facing left 1'], image_dict['facing left 2']]
 53        right_list = [image_dict['facing right 1'], image_dict['facing right 2']]
 54        up_list = [image_dict['facing up 1'], image_dict['facing up 2']]
 55        down_list = [image_dict['facing down 1'], image_dict['facing down 2']]
 56
 57        dict = {'left': left_list,
 58                'right': right_list,
 59                'up': up_list,
 60                'down': down_list}
 61
 62        return dict
 63
 64
 65
 66
 67    def create_state_dict(self):
 68        """Creates a dictionary of all the states the player
 69        can be in"""
 70        dict = {'resting': self.resting,
 71                'moving': self.moving}
 72
 73        return dict
 74
 75
 76    def create_direction_dict(self):
 77        """Creates a dictionary of directions with truth values
 78        corresponding to the player's direction"""
 79        dict = {'up': (0, -2),
 80                'down': (0, 2),
 81                'left': (-2, 0),
 82                'right': (2, 0)}
 83
 84        return dict
 85
 86
 87    def update(self, keys, current_time):
 88        """Updates player behavior"""
 89        self.keys = keys
 90        self.current_time = current_time
 91        self.check_for_input()
 92        state = self.state_dict[self.state]
 93        state()
 94
 95
 96    def resting(self):
 97        """When the player is not moving between tiles.
 98        Checks if the player is centered on a tile"""
 99        self.image = self.image_list[self.index]
100
101        assert(self.rect.y % 32 == 0), ('Player not centered on tile: '
102                                        + str(self.rect.y))
103        assert(self.rect.x % 32 == 0), ('Player not centered on tile'
104                                        + str(self.rect.x))
105
106
107    def moving(self):
108        """When the player is moving between tiles"""
109        self.rect.x += self.x_vel
110        self.rect.y += self.y_vel
111
112        if (self.current_time - self.timer) > 100:
113            if self.index < (len(self.image_list) - 1):
114                self.index += 1
115            else:
116                self.index = 0
117            self.timer = self.current_time
118
119        self.image = self.image_list[self.index]
120
121        if self.rect.x % 32 == 0 and self.rect.y % 32 == 0:
122            self.begin_resting()
123
124        assert(self.rect.x % 32 == 0 or self.rect.y % 32 == 0), \
125            'Not centered on tile'
126
127
128    def begin_moving(self, direction):
129        """Transitions the player into the moving state"""
130        self.state = 'moving'
131        self.direction = direction
132        self.image_list = self.animation_lists[direction]
133        self.timer = self.current_time
134
135        if self.rect.x % 32 == 0:
136            self.y_vel = self.direction_dict[self.direction][1]
137        if self.rect.y % 32 == 0:
138            self.x_vel = self.direction_dict[self.direction][0]
139
140
141    def begin_resting(self):
142        """Transitions the player into the resting state"""
143        self.state = 'resting'
144        self.index = 1
145        self.x_vel = self.y_vel = 0
146
147
148    def check_for_input(self):
149        """Checks for player input"""
150        if self.state == 'resting':
151            if self.keys[pg.K_UP]:
152                self.begin_moving('up')
153            elif self.keys[pg.K_DOWN]:
154                self.begin_moving('down')
155            elif self.keys[pg.K_LEFT]:
156                self.begin_moving('left')
157            elif self.keys[pg.K_RIGHT]:
158                self.begin_moving('right')
159
160
161
162