Bladeren bron

show_inventory and other tasks on Inventory

Zero! Studio 1 jaar geleden
bovenliggende
commit
e0c89da6ca
5 gewijzigde bestanden met toevoegingen van 69 en 15 verwijderingen
  1. 1 0
      data/02.yaml
  2. 36 0
      jogai/character.py
  3. 2 1
      jogai/settings.py
  4. 29 9
      jogai/widgets.py
  5. 1 5
      scripts/basics.py

+ 1 - 0
data/02.yaml

@@ -18,6 +18,7 @@ characters:
       increase: e
       decrease: q
       jump: SPACE
+      show_inventory: i
   secondary:
     speed: 5
     width: 150

+ 36 - 0
jogai/character.py

@@ -1,4 +1,5 @@
 import os
+from time import sleep
 from typing import Type
 
 import pygame
@@ -57,6 +58,7 @@ class Character(pygame.sprite.Sprite):
         _('down'),
         _('forward'),
         _('increase'),
+        _('show_inventory'),
         _('jump'),
         _('up'),
     ]
@@ -95,6 +97,7 @@ class Character(pygame.sprite.Sprite):
         self.score = None
         self.lives = None
         self.chronometer = None
+        self.inventory = widgets.Inventory(name)
 
         super().__init__()
         self.load(image_filename)
@@ -623,6 +626,19 @@ class Character(pygame.sprite.Sprite):
         )
         self.rect = self.image.get_rect()
 
+    def set_inventory(self, key: str):
+        """
+        Set the character lives.
+
+        Parameters:
+            lives: The character lives
+
+        Examples:
+            >>> protagonist = Character('protagonist.png')
+            >>> protagonist.set_lives(5)
+        """
+        self.inventory = widgets.Inventory(key)
+
     def set_lives(self, lives: int):
         """
         Set the character lives.
@@ -749,6 +765,26 @@ class Character(pygame.sprite.Sprite):
         )
         self.rect = self.image.get_rect()
 
+    def show_inventory(self, key: str = '', delay: float = 0.5):
+        """
+        Show and hide the character inventory.
+
+        Parameters:
+            key: Optional key to perform the action
+
+        Examples:
+            >>> protagonist = Character('protagonist.png')
+            >>> protagonist.show_inventory()
+        """
+        if _get_keys()[utils.eval_key(key)]:
+            if self.inventory is None:
+                self.set_inventory()
+            if _globals.visible_inventory:
+                _globals.visible_inventory = None
+            else:
+                _globals.visible_inventory = self.inventory
+            sleep(delay)
+
     def touch(
         self,
         other_characters: Type['Character'] | Type['jogai.group.Group'] | list,

+ 2 - 1
jogai/settings.py

@@ -58,4 +58,5 @@ LEVELBARS_DEFAULT_POSITION = (WINDOW_WIDTH - LEVELBARS_DEFAULT_WIDTH - 20, 25)
 INVENTORY_DEFAULT_BACKGROUND_COLOR = (0, 0, 0, 180)
 INVENTORY_DEFAULT_TEXT_COLOR = (255, 255, 255)
 INVENTORY_DEFAULT_ITEMS_BY_ROW = 6
-INVENTORY_MARGIN = 50
+INVENTORY_LEFT_MARGIN = 50
+INVENTORY_TOP_MARGIN = 50

+ 29 - 9
jogai/widgets.py

@@ -262,11 +262,13 @@ class Chronometer(Text):
 class Inventory:
     def __init__(
         self,
+        name: str,
         background_color: tuple = settings.INVENTORY_DEFAULT_BACKGROUND_COLOR,
         text_color: tuple = settings.INVENTORY_DEFAULT_TEXT_COLOR,
         font: str = '',
         size: int = 30,
     ):
+        self.name = name
         self.background_color = background_color
         self.text_color = text_color
         self._items = {}
@@ -286,33 +288,51 @@ class Inventory:
         else:
             self._items.update({item: 1})
 
-    def show(self, key: str = ''):
-        if not isinstance(key, str):
-            raise TypeError(_('Key pressed must be a string.'))
+    def show(self):
         if not key or _get_keys()[utils.eval_key(key)]:
             _globals.visible_inventory = self
 
-    def hide(self, key: str = ''):
-        if not isinstance(key, str):
-            raise TypeError(_('Key pressed must be a string.'))
+    def hide(self):
         if not key or _get_keys()[utils.eval_key(key)]:
             _globals.visible_inventory = None
 
     def draw(self):
         shape = pygame.Surface(self.rect.size, pygame.SRCALPHA)
         pygame.draw.rect(shape, self.background_color, self.rect)
+        pygame.draw.line(
+            shape,
+            self.text_color,
+            (
+                settings.INVENTORY_LEFT_MARGIN,
+                settings.INVENTORY_TOP_MARGIN + 30,
+            ),
+            (
+                settings.WINDOW_WIDTH - settings.INVENTORY_LEFT_MARGIN,
+                settings.INVENTORY_TOP_MARGIN + 30,
+            ),
+        )
         _globals._window.blit(shape, self.rect)
+        _globals._window.blit(
+            self.font.render(
+                f"{_('INVENTORY')} [{self.name}]", 1, self.text_color
+            ),
+            (settings.INVENTORY_LEFT_MARGIN, settings.INVENTORY_TOP_MARGIN),
+        )
+
         for pos, item in enumerate(self._items.keys()):
             width = item.thumbnail.get_width()
             height = item.thumbnail.get_height()
             x = (
-                settings.INVENTORY_MARGIN
+                settings.INVENTORY_LEFT_MARGIN
                 + (pos // settings.INVENTORY_DEFAULT_ITEMS_BY_ROW)
                 * settings.CHARACTER_DEFAULT_THUMBNAIL_SIZE
                 * 4
             )
-            y = settings.INVENTORY_MARGIN + (pos % 7) * (
-                height + settings.CHARACTER_DEFAULT_THUMBNAIL_SIZE // 2
+            y = (
+                settings.INVENTORY_TOP_MARGIN
+                + 50
+                + (pos % 7)
+                * (height + settings.CHARACTER_DEFAULT_THUMBNAIL_SIZE // 2)
             )
             _globals._window.blit(item.thumbnail, (x, y))
             _globals._window.blit(

+ 1 - 5
scripts/basics.py

@@ -6,11 +6,7 @@ def test_example01():
     prepare('02.yaml')
     sq = StairsGroup(brick, 5)
     add_group(sq)
-
-    inv = Inventory()
-    inv.add(brick)
-    inv.add(secondary)
-    inv.show()
+    protagonist.inventory.add(brick)
 
     while is_running():
         update()