Преглед на файлове

Text() added to texts and add_text() added to videogame.

Zero! Studio преди 1 година
родител
ревизия
52eeb9d080
променени са 7 файла, в които са добавени 70 реда и са изтрити 16 реда
  1. BIN
      fonts/digital.ttf
  2. 1 0
      jogai/__init__.py
  3. 1 0
      jogai/_globals.py
  4. 0 2
      jogai/character.py
  5. 7 6
      jogai/settings.py
  6. 30 0
      jogai/texts.py
  7. 31 8
      jogai/videogame.py

BIN
fonts/digital.ttf


+ 1 - 0
jogai/__init__.py

@@ -3,6 +3,7 @@ import pygame
 from jogai.character import Character
 from jogai.group import *
 from jogai.scene import Scene
+from jogai.texts import *
 from jogai.videogame import *
 
 pygame.init()

+ 1 - 0
jogai/_globals.py

@@ -21,3 +21,4 @@ mark_font = None
 vg_scene = None
 vg_characters = []
 vg_groups = []
+vg_texts = []

+ 0 - 2
jogai/character.py

@@ -1,5 +1,3 @@
-import os
-from copy import deepcopy
 from typing import Type
 
 import pygame

+ 7 - 6
jogai/settings.py

@@ -2,9 +2,9 @@
 Videogame settings
 """
 
-import os
+from os.path import abspath, dirname, join
 
-import jogai
+from jogai.translations import gettext as _
 
 LANGUAGE_CODE = 'gl'
 
@@ -17,12 +17,13 @@ WINDOW_HEIGHT = 600
 SCENE_DEFAULT_BACKGROUND = (0, 0, 0)
 
 # PATHS
-BASE_DIR = os.path.dirname((os.path.abspath(__file__)))
-SCENES_DIR = os.path.join('images', 'scenes')
-CHARACTERS_DIR = os.path.join('images', 'characters')
+BASE_DIR = dirname((abspath(__file__)))
+SCENES_DIR = join(_('images'), _('scenes'))
+CHARACTERS_DIR = join(_('images'), _('characters'))
+FONTS_DIR = _('fonts')
 
 DEFAULT_DATA_FILENAME = 'default_data.yaml'
-DATA_DIR = 'data'
+DATA_DIR = _('data')
 
 # DEFAULT CHARACTER FEATURES
 DEFAULT_JUMP_FORCE = 10.0

+ 30 - 0
jogai/texts.py

@@ -0,0 +1,30 @@
+from os.path import join
+
+import pygame
+
+from jogai import _globals, settings
+
+
+class Text:
+    def __init__(
+        self,
+        message: str = '',
+        size: int = 20,
+        color: tuple = (0, 0, 0),
+        position: tuple = (0, 0),
+        font: str = 'digital.ttf',
+        bold: bool = False,
+        italic: bool = False,
+        shadow: tuple = (),
+    ):
+        self.message = message
+        self.color = color
+        self.x = position[0]
+        self.y = position[1]
+        self.font = pygame.font.Font(join(settings.FONTS_DIR, font), size)
+        self.font.set_bold(bold)
+        self.font.set_italic(italic)
+        self.image = self.font.render(self.message, True, self.color)
+        self.rect = self.image.get_rect()
+        self.rect.x = self.x
+        self.rect.y = self.y

+ 31 - 8
jogai/videogame.py

@@ -8,7 +8,7 @@ import pygame
 import jogai
 import jogai._globals as _globals
 import jogai.settings as settings
-from jogai import character, group, logger, scene, utils
+from jogai import character, group, logger, scene, texts, utils
 from jogai.translations import gettext as _
 from jogai.utils import _get_events, _get_keys
 
@@ -165,6 +165,22 @@ def add_group(new_group: 'group.SquareGroup'):
     _globals.vg_groups.append(new_group)
 
 
+def add_text(new_text: 'texts.Text'):
+    """
+    Add a new text to the videogame.
+
+    Parameters:
+        new_text: the text to be added
+
+    Examples:
+        >>> text = texts.Text('Test')
+        >>> add_text(text) # doctest: +SKIP
+    """
+    if not isinstance(new_text, texts.Text):
+        raise TypeError(_('Only Group instances can be added.'))
+    _globals.vg_texts.append(new_text)
+
+
 def init():
     """
     Start the pygame engine if it is not started.
@@ -239,7 +255,11 @@ def get_color(x: int, y: int) -> Tuple[int, int, int]:
     return tuple(_globals._window.get_at((x, y))[:-1])
 
 
-def paint(sprite: Type['scene.Scene'] | Type['character.Character']):
+def paint(
+    sprite: Type['scene.Scene']
+    | Type['character.Character']
+    | Type['texts.Text'],
+):
     """
     Paint both a scene and a character.
 
@@ -249,7 +269,7 @@ def paint(sprite: Type['scene.Scene'] | Type['character.Character']):
     # TODO: check sprite type
     if hasattr(sprite, 'background'):
         _globals._window.fill(sprite.background)
-    if sprite.image and sprite.rect:
+    if hasattr(sprite, 'image') and hasattr(sprite, 'rect'):
         _globals._window.blit(sprite.image, sprite.rect)
 
 
@@ -352,11 +372,14 @@ def update():
             paint(vg_character)
             vg_character.update()
     if _globals.vg_groups:
-        for g in _globals.vg_groups:
-            for e in g.sprites():
-                e._update_rect_position()
-                paint(e)
-                e.update()
+        for group_item in _globals.vg_groups:
+            for sprite_item in group_item.sprites():
+                sprite_item._update_rect_position()
+                paint(sprite_item)
+                sprite_item.update()
+    if _globals.vg_texts:
+        for text_item in _globals.vg_texts:
+            paint(text_item)
     if _globals.marks:
         _globals.marks.draw()
     pygame.display.flip()