|
|
@@ -1,4 +1,5 @@
|
|
|
import os
|
|
|
+from typing import Type
|
|
|
|
|
|
import pygame
|
|
|
|
|
|
@@ -46,6 +47,8 @@ class Character(pygame.sprite.Sprite):
|
|
|
self._original_rect = None
|
|
|
self._rect = None
|
|
|
self.name = name
|
|
|
+ self.x = 0
|
|
|
+ self.y = 0
|
|
|
|
|
|
super().__init__()
|
|
|
self.load(image_filename)
|
|
|
@@ -75,14 +78,6 @@ class Character(pygame.sprite.Sprite):
|
|
|
def width(self):
|
|
|
return self._rect.width
|
|
|
|
|
|
- @property
|
|
|
- def x(self):
|
|
|
- return self._rect.x
|
|
|
-
|
|
|
- @property
|
|
|
- def y(self):
|
|
|
- return self._rect.y
|
|
|
-
|
|
|
def _eval_predefined_function(
|
|
|
self, function: str, arguments: str | list | dict
|
|
|
):
|
|
|
@@ -95,6 +90,39 @@ class Character(pygame.sprite.Sprite):
|
|
|
|
|
|
eval(f'self.{function}({processed_arguments})')
|
|
|
|
|
|
+ def _update_rect_position(
|
|
|
+ self, vg_scene: Type['scene.Scene'], tracking: bool = False
|
|
|
+ ) -> int:
|
|
|
+ """
|
|
|
+ Calculate and update the position where the character must be painted.
|
|
|
+ Only one character can be tracked.
|
|
|
+
|
|
|
+ Parameters:
|
|
|
+ vg_scene: The scene information.
|
|
|
+ tracking: True if the character must be followed, False otherwise.
|
|
|
+ """
|
|
|
+ # TODO: check vg_scene type
|
|
|
+ if not isinstance(tracking, bool):
|
|
|
+ raise TypeError(_('The tracking parameter must be a boolean.'))
|
|
|
+
|
|
|
+ if tracking:
|
|
|
+ if self.x < settings.WINDOW_WIDTH // 2:
|
|
|
+ self._rect.x = self.x
|
|
|
+ elif (
|
|
|
+ settings.WINDOW_WIDTH // 2
|
|
|
+ < self.x
|
|
|
+ < vg_scene.width - settings.WINDOW_WIDTH
|
|
|
+ ):
|
|
|
+ self._rect.x = settings.WINDOW_WIDTH // 2
|
|
|
+ elif self.x > vg_scene.width - settings.WINDOW_WIDTH:
|
|
|
+ self._rect.x = settings.WINDOW_WIDTH * 3 / 2 - (
|
|
|
+ -self.x % vg_scene.width
|
|
|
+ )
|
|
|
+ self._rect.y = self.y
|
|
|
+ else:
|
|
|
+ self._rect.x = self.x + vg_scene.x
|
|
|
+ self._rect.y = self.y
|
|
|
+
|
|
|
def move(
|
|
|
self,
|
|
|
x: int | None = None,
|
|
|
@@ -129,10 +157,11 @@ class Character(pygame.sprite.Sprite):
|
|
|
|
|
|
if not key or _get_keys()[utils.eval_key(key)]:
|
|
|
if relative:
|
|
|
- self._rect.move_ip(x, y)
|
|
|
+ self.x += x
|
|
|
+ self.y += y
|
|
|
else:
|
|
|
- self._rect.x = x
|
|
|
- self._rect.y = y
|
|
|
+ self.x = x
|
|
|
+ self.y = y
|
|
|
|
|
|
def move_to(self, x: int, y: int, key: str = ''):
|
|
|
"""
|
|
|
@@ -288,9 +317,7 @@ class Character(pygame.sprite.Sprite):
|
|
|
),
|
|
|
)
|
|
|
self.scale_factor = scale_factor
|
|
|
- x, y = self._rect.x, self._rect.y
|
|
|
self._rect = self._image.get_rect()
|
|
|
- self.move_to(x, y)
|
|
|
|
|
|
def set_height(self, height: int = 0):
|
|
|
"""
|