|
@@ -3,7 +3,7 @@ from os.path import join
|
|
|
import pygame
|
|
import pygame
|
|
|
|
|
|
|
|
from jogai import _globals, settings
|
|
from jogai import _globals, settings
|
|
|
-
|
|
|
|
|
|
|
+from jogai.translations import gettext as _
|
|
|
|
|
|
|
|
class Text:
|
|
class Text:
|
|
|
def __init__(
|
|
def __init__(
|
|
@@ -17,14 +17,123 @@ class Text:
|
|
|
italic: bool = False,
|
|
italic: bool = False,
|
|
|
shadow: tuple = (),
|
|
shadow: tuple = (),
|
|
|
):
|
|
):
|
|
|
- self.message = message
|
|
|
|
|
self.color = color
|
|
self.color = color
|
|
|
- self.x = position[0]
|
|
|
|
|
- self.y = position[1]
|
|
|
|
|
self.font = pygame.font.Font(join(settings.FONTS_DIR, font), size)
|
|
self.font = pygame.font.Font(join(settings.FONTS_DIR, font), size)
|
|
|
self.font.set_bold(bold)
|
|
self.font.set_bold(bold)
|
|
|
self.font.set_italic(italic)
|
|
self.font.set_italic(italic)
|
|
|
- self.image = self.font.render(self.message, True, self.color)
|
|
|
|
|
|
|
+ self._message = message
|
|
|
|
|
+ self.render(position, message)
|
|
|
|
|
+
|
|
|
|
|
+ @property
|
|
|
|
|
+ def x(self):
|
|
|
|
|
+ return self.rect.x
|
|
|
|
|
+
|
|
|
|
|
+ @property
|
|
|
|
|
+ def y(self):
|
|
|
|
|
+ return self.rect.y
|
|
|
|
|
+
|
|
|
|
|
+ def render(self, position: tuple = (), message: str = ''):
|
|
|
|
|
+ if not isinstance(position, tuple) and not isinstance(position, list):
|
|
|
|
|
+ raise TypeError(_('The position must be a tuple or list (x, y).'))
|
|
|
|
|
+ if position and len(position) != 2:
|
|
|
|
|
+ raise ValueError(_('The position has two coordinates (x, y).'))
|
|
|
|
|
+ if not isinstance(message, str):
|
|
|
|
|
+ raise TypeError(_('The message must be a string.'))
|
|
|
|
|
+ if not position:
|
|
|
|
|
+ position = (self.rect.x, self.rect.y)
|
|
|
|
|
+ if message:
|
|
|
|
|
+ self._message = message
|
|
|
|
|
+ self.image = self.font.render(self._message, True, self.color)
|
|
|
self.rect = self.image.get_rect()
|
|
self.rect = self.image.get_rect()
|
|
|
- self.rect.x = self.x
|
|
|
|
|
- self.rect.y = self.y
|
|
|
|
|
|
|
+ self.rect.x, self.rect.y = position
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ def set_message(self, message: str, key: str = ''):
|
|
|
|
|
+ """
|
|
|
|
|
+ Set a new message for the text.
|
|
|
|
|
+
|
|
|
|
|
+ Parameters:
|
|
|
|
|
+ message: The new message
|
|
|
|
|
+
|
|
|
|
|
+ Examples:
|
|
|
|
|
+ >>> t = Text()
|
|
|
|
|
+ >>> t.set_message('Test')
|
|
|
|
|
+ """
|
|
|
|
|
+ if not key or _get_keys()[utils.eval_key(key)]:
|
|
|
|
|
+ self.render(message=message)
|
|
|
|
|
+
|
|
|
|
|
+ def set_position(self, position: tuple | list, key: str = ''):
|
|
|
|
|
+ """
|
|
|
|
|
+ Set the text position as tuple.
|
|
|
|
|
+
|
|
|
|
|
+ Parameters:
|
|
|
|
|
+ position: A tuple with abscissa and ordinate coordinates
|
|
|
|
|
+
|
|
|
|
|
+ Examples:
|
|
|
|
|
+ >>> t = Text('Test')
|
|
|
|
|
+ >>> t.set_position((200, 200))
|
|
|
|
|
+ """
|
|
|
|
|
+ if not key or _get_keys()[utils.eval_key(key)]:
|
|
|
|
|
+ self.render(position=position)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+class Scoreboard(Text):
|
|
|
|
|
+ def __init__(self, prefix: str, score: int = 0, **kwargs):
|
|
|
|
|
+ if not isinstance(prefix, str):
|
|
|
|
|
+ raise TypeError(_('The prefix text must be a string.'))
|
|
|
|
|
+ super().__init__(**kwargs)
|
|
|
|
|
+ self._prefix = prefix
|
|
|
|
|
+ self.set(score)
|
|
|
|
|
+ if 'position' in kwargs:
|
|
|
|
|
+ self.render(position=kwargs['position'])
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.render()
|
|
|
|
|
+
|
|
|
|
|
+ def __int__(self):
|
|
|
|
|
+ return int(self._score)
|
|
|
|
|
+
|
|
|
|
|
+ def __repr__(self):
|
|
|
|
|
+ return f'Scoreboard <{self._message}>'
|
|
|
|
|
+
|
|
|
|
|
+ def __str__(self):
|
|
|
|
|
+ return self._message
|
|
|
|
|
+
|
|
|
|
|
+ @property
|
|
|
|
|
+ def score(self):
|
|
|
|
|
+ return self._score
|
|
|
|
|
+
|
|
|
|
|
+ @property
|
|
|
|
|
+ def message(self):
|
|
|
|
|
+ return self._message
|
|
|
|
|
+
|
|
|
|
|
+ def set(self, score: int):
|
|
|
|
|
+ """
|
|
|
|
|
+ Set the character score.
|
|
|
|
|
+
|
|
|
|
|
+ Parameters:
|
|
|
|
|
+ score: the new character score
|
|
|
|
|
+
|
|
|
|
|
+ Examples:
|
|
|
|
|
+ >>> scoreboard = Scoreboard('My character: ')
|
|
|
|
|
+ >>> scoreboard.set_score(100)
|
|
|
|
|
+ """
|
|
|
|
|
+ if not isinstance(score, int):
|
|
|
|
|
+ raise TypeError(_('Score must be an integer.'))
|
|
|
|
|
+ self._score = score
|
|
|
|
|
+ self._message = f'{self._prefix}{self.score}'
|
|
|
|
|
+ self.render()
|
|
|
|
|
+
|
|
|
|
|
+ def add(self, score: int):
|
|
|
|
|
+ """
|
|
|
|
|
+ Increment the character score.
|
|
|
|
|
+
|
|
|
|
|
+ Parameters:
|
|
|
|
|
+ score: the character score to be added
|
|
|
|
|
+
|
|
|
|
|
+ Examples:
|
|
|
|
|
+ >>> scoreboard = Scoreboard('My character: ')
|
|
|
|
|
+ >>> scoreboard.add(5)
|
|
|
|
|
+ """
|
|
|
|
|
+ if not isinstance(score, int):
|
|
|
|
|
+ raise TypeError(_('Score must be an integer.'))
|
|
|
|
|
+ self.score += score
|