|
@@ -28,12 +28,10 @@ class Character(pygame.sprite.Sprite):
|
|
|
RIGHT_COLLISION = _('right')
|
|
RIGHT_COLLISION = _('right')
|
|
|
STATIC_COLLISION = _('static')
|
|
STATIC_COLLISION = _('static')
|
|
|
|
|
|
|
|
- _predefined_key_actions_allowed = [
|
|
|
|
|
|
|
+ _predefined_animations_allowed = [
|
|
|
_('backward'),
|
|
_('backward'),
|
|
|
- _('decrease'),
|
|
|
|
|
_('down'),
|
|
_('down'),
|
|
|
_('forward'),
|
|
_('forward'),
|
|
|
- _('increase'),
|
|
|
|
|
_('jump'),
|
|
_('jump'),
|
|
|
_('up'),
|
|
_('up'),
|
|
|
]
|
|
]
|
|
@@ -51,10 +49,21 @@ class Character(pygame.sprite.Sprite):
|
|
|
_('width'),
|
|
_('width'),
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
|
|
+ _predefined_key_actions_allowed = [
|
|
|
|
|
+ _('backward'),
|
|
|
|
|
+ _('decrease'),
|
|
|
|
|
+ _('down'),
|
|
|
|
|
+ _('forward'),
|
|
|
|
|
+ _('increase'),
|
|
|
|
|
+ _('jump'),
|
|
|
|
|
+ _('up'),
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
def __init__(
|
|
def __init__(
|
|
|
self,
|
|
self,
|
|
|
image_filename: str,
|
|
image_filename: str,
|
|
|
name: str = '',
|
|
name: str = '',
|
|
|
|
|
+ animation_filenames: dict = {},
|
|
|
):
|
|
):
|
|
|
if not isinstance(name, str):
|
|
if not isinstance(name, str):
|
|
|
raise TypeError(_('The character name must be a string.'))
|
|
raise TypeError(_('The character name must be a string.'))
|
|
@@ -65,6 +74,7 @@ class Character(pygame.sprite.Sprite):
|
|
|
self.predefined_keys = {}
|
|
self.predefined_keys = {}
|
|
|
self.image_filename = image_filename
|
|
self.image_filename = image_filename
|
|
|
self.image = None
|
|
self.image = None
|
|
|
|
|
+ self.animation_filenames = {}
|
|
|
self._original_image = None
|
|
self._original_image = None
|
|
|
self._original_rect = None
|
|
self._original_rect = None
|
|
|
self.rect = None
|
|
self.rect = None
|
|
@@ -84,6 +94,7 @@ class Character(pygame.sprite.Sprite):
|
|
|
|
|
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
self.load(image_filename)
|
|
self.load(image_filename)
|
|
|
|
|
+ self.set_animations(animation_filenames)
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
def __repr__(self):
|
|
|
return f'{_("Character")}: {self.name}'
|
|
return f'{_("Character")}: {self.name}'
|
|
@@ -497,6 +508,27 @@ class Character(pygame.sprite.Sprite):
|
|
|
self._original_image, self.angle, self.scale_factor
|
|
self._original_image, self.angle, self.scale_factor
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
+ def set_animations(self, animations: dict):
|
|
|
|
|
+ """
|
|
|
|
|
+ Set the image animation filenames for this character.
|
|
|
|
|
+
|
|
|
|
|
+ Parameters:
|
|
|
|
|
+ animations: A dict with pairs {action: filename}
|
|
|
|
|
+
|
|
|
|
|
+ Examples:
|
|
|
|
|
+ >>> protagonist = Character('protagonist.png')
|
|
|
|
|
+ >>> protagonist.set_animations({'jump': 'protagonist_jump.png'})
|
|
|
|
|
+ """
|
|
|
|
|
+ if not isinstance(animations, dict):
|
|
|
|
|
+ raise TypeError(_('The animations must be a dict.'))
|
|
|
|
|
+
|
|
|
|
|
+ self.animation_filenames = dict(
|
|
|
|
|
+ filter(
|
|
|
|
|
+ lambda pair: pair[0] in self._predefined_animations_allowed,
|
|
|
|
|
+ animations.items(),
|
|
|
|
|
+ )
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
def set_chronometer(self, time: int):
|
|
def set_chronometer(self, time: int):
|
|
|
"""
|
|
"""
|
|
|
Set a chronometer for this character.
|
|
Set a chronometer for this character.
|
|
@@ -508,6 +540,9 @@ class Character(pygame.sprite.Sprite):
|
|
|
>>> protagonist = Character('protagonist.png')
|
|
>>> protagonist = Character('protagonist.png')
|
|
|
>>> protagonist.set_chronometer(30)
|
|
>>> protagonist.set_chronometer(30)
|
|
|
"""
|
|
"""
|
|
|
|
|
+ if not isinstance(time, int):
|
|
|
|
|
+ raise TypeError(_('Time must be a integer.'))
|
|
|
|
|
+
|
|
|
chronometer_pos = len(_globals.vg_chronometers)
|
|
chronometer_pos = len(_globals.vg_chronometers)
|
|
|
self.chronometer = widgets.Chronometer(
|
|
self.chronometer = widgets.Chronometer(
|
|
|
time,
|
|
time,
|
|
@@ -831,7 +866,7 @@ class Character(pygame.sprite.Sprite):
|
|
|
):
|
|
):
|
|
|
offset_rect.x = settings.WINDOW_WIDTH // 2
|
|
offset_rect.x = settings.WINDOW_WIDTH // 2
|
|
|
elif x >= _globals.vg_scene.width - settings.WINDOW_WIDTH:
|
|
elif x >= _globals.vg_scene.width - settings.WINDOW_WIDTH:
|
|
|
- offset_rect.x = settings.WINDOW_WIDTH*3 // 2 - (
|
|
|
|
|
|
|
+ offset_rect.x = settings.WINDOW_WIDTH * 3 // 2 - (
|
|
|
-x % _globals.vg_scene.width
|
|
-x % _globals.vg_scene.width
|
|
|
)
|
|
)
|
|
|
else:
|
|
else:
|