From be25865123b1d1541efc26b31321f65281ef6388 Mon Sep 17 00:00:00 2001 From: Kanewersa <30356293+Kanewersa@users.noreply.github.com> Date: Mon, 24 May 2021 13:10:10 +0200 Subject: [PATCH] Add ui and inventory --- assets/ui.png | Bin 0 -> 712 bytes survival/__init__.py | 7 +++- survival/components/inventory_component.py | 19 ++++------ survival/components/resource_component.py | 3 ++ survival/generators/player_generator.py | 2 + survival/generators/resource_generator.py | 29 +++++++++++--- survival/image.py | 11 ++++-- survival/systems/draw_system.py | 7 ++++ survival/user_interface.py | 42 +++++++++++++++++++++ 9 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 assets/ui.png create mode 100644 survival/components/resource_component.py create mode 100644 survival/user_interface.py diff --git a/assets/ui.png b/assets/ui.png new file mode 100644 index 0000000000000000000000000000000000000000..999de9f8104e67dcca297ab1e591097a75cd66f0 GIT binary patch literal 712 zcmV;(0yq7MP);Dz!+ucz_d_$I~e*d~*SvjR0#0t6+10xLLw=iX+sX@kMQDwT?x zgODSD1rPu(77LqBr#2dmY_(eXLuqye0{{Uv$U*{C5a&VbZnx`$*b%_t5cnBp2N4be zaRUhuB#h`HVLWLTgXZ?b5FdFE7L!0Mr(-0- zxw?P^AUOiN-Of$$1Q|^~Y{14?K`D~d@3bHTI_HAWKQv!TbGjvFffTrjyLi6O0_MD? zTS&kHe?Jq1sr5bvSo@U(1MgM96bU`^#szx0q%?mk0Y+n3*X>D-AIXeZrg#EcY~G=1 z5m7z=h5$)?N^V^67k&@5&&5D0-QFQuCsOkN9TDp@Yd^=w2%y$O&?tZe37Oo8_F@qV z_o#wAHv_N|__zgPmxKnU-sweFc(f3O>wFgQjz&4=H@0Js5V$8{nfC;EFKfqpPqSAg zR^~kcd_X|f>vi9RAST$o-XoK80SjHNR&#?v?=3)cBM4iqmi7C6HzxrG>AedoRm8L< z!~X#&sF~*JKvOJ02H+0_JDxBNLy)4ft(^}*VSz@Yktg7NAq;sTX+shch=IjOXcn=_ ujaopv;Mj$fB9L15h=m;P&6iJ#nSB8(auo=48D?4l0000 self.maxitems: self.items[item] = self.maxitems - def removeItem(self, item, count): - if self.items: + def remove_item(self, item, count): + if item in self.items: self.items[item] = self.items[item] - count - if self.items[item] < 0: - self.items[item] = 0 + if self.items[item] < 0: + self.items[item] = 0 - def hasItem(self, item): - if self.items[item] != 0: - return True - else: - return False + def has_item(self, item): + return item in self.items and self.items[item] != 0 diff --git a/survival/components/resource_component.py b/survival/components/resource_component.py new file mode 100644 index 0000000..0a95b73 --- /dev/null +++ b/survival/components/resource_component.py @@ -0,0 +1,3 @@ +class ResourceComponent: + def __init__(self, resource_type): + self.resource_type = resource_type diff --git a/survival/generators/player_generator.py b/survival/generators/player_generator.py index 1dc8014..46561c1 100644 --- a/survival/generators/player_generator.py +++ b/survival/generators/player_generator.py @@ -1,6 +1,7 @@ from survival.components.OnCollisionComponent import OnCollisionComponent from survival.components.camera_target_component import CameraTargetComponent from survival.components.input_component import InputComponent +from survival.components.inventory_component import InventoryComponent from survival.components.movement_component import MovementComponent from survival.components.position_component import PositionComponent from survival.components.sprite_component import SpriteComponent @@ -16,6 +17,7 @@ class PlayerGenerator: world.add_component(player, MovementComponent()) world.add_component(player, InputComponent()) world.add_component(player, OnCollisionComponent()) + world.add_component(player, InventoryComponent()) camera_target = CameraTargetComponent(pos) world.add_component(player, camera_target) game_map.add_entity(player, pos) diff --git a/survival/generators/resource_generator.py b/survival/generators/resource_generator.py index ada4820..b9a8309 100644 --- a/survival/generators/resource_generator.py +++ b/survival/generators/resource_generator.py @@ -1,33 +1,47 @@ import random +from enum import Enum from survival import GameMap from survival.components.OnCollisionComponent import OnCollisionComponent +from survival.components.inventory_component import InventoryComponent from survival.components.position_component import PositionComponent +from survival.components.resource_component import ResourceComponent from survival.components.sprite_component import SpriteComponent from survival.esper import World from survival.settings import RESOURCES_AMOUNT +class ResourceType(Enum): + FOOD = 1 + WATER = 2 + WOOD = 3 + + class ResourceGenerator: def __init__(self, world, game_map): self.world = world self.map = game_map - def generate_resources(self): + def generate_resources(self, player: int): for x in range(RESOURCES_AMOUNT): obj = self.world.create_entity() - sprites = ['apple.png', 'water.png', 'wood.png'] + sprites = { + ResourceType.FOOD: 'apple.png', + ResourceType.WATER: 'water.png', + ResourceType.WOOD: 'wood.png' + } empty_grid_pos = self.get_empty_grid_position() empty_pos = [empty_grid_pos[0] * 32, empty_grid_pos[1] * 32] - pos = PositionComponent(empty_pos, empty_grid_pos) - sprite = SpriteComponent(random.choice(sprites)) + resource_type = random.choice(list(ResourceType)) + sprite = SpriteComponent(sprites[resource_type]) col = OnCollisionComponent() - col.addCallback(self.remove_resource, world=self.world, game_map=self.map, entity=obj) + col.addCallback(self.remove_resource, world=self.world, game_map=self.map, entity=obj, player=player) self.world.add_component(obj, pos) self.world.add_component(obj, sprite) self.world.add_component(obj, col) + self.world.add_component(obj, ResourceComponent(resource_type)) self.map.add_entity(obj, pos) def get_empty_grid_position(self): @@ -37,7 +51,10 @@ class ResourceGenerator: return free_pos @staticmethod - def remove_resource(world: World, game_map: GameMap, entity: int): + def remove_resource(world: World, game_map: GameMap, entity: int, player: int): pos = world.component_for_entity(entity, PositionComponent) + resource = world.component_for_entity(entity, ResourceComponent) + inventory = world.component_for_entity(player, InventoryComponent) + inventory.add_item(resource.resource_type, 1) game_map.remove_entity(pos.grid_position) world.delete_entity(entity, immediate=True) diff --git a/survival/image.py b/survival/image.py index 3c93b9c..c1727cf 100644 --- a/survival/image.py +++ b/survival/image.py @@ -4,12 +4,12 @@ import pygame class Image: - def __init__(self, filename): + def __init__(self, filename, pos=(0, 0), scale=1): self.texture = pygame.image.load(os.path.join('..', 'assets', filename)).convert_alpha() self.image = self.texture self.origin = (0, 0) - self.pos = (0, 0) - self.scale = 1 + self.pos = pos + self.set_scale(scale) def set_scale(self, scale): self.image = pygame.transform.scale(self.texture, @@ -20,3 +20,8 @@ class Image: window.blit(self.image, camera.apply(self.pos), pygame.Rect(self.origin[0] * self.scale, self.origin[1] * self.scale, 32 * self.scale, 32 * self.scale)) + + def draw_static(self, window): + window.blit(self.image, self.pos, + pygame.Rect(self.origin[0] * self.scale, self.origin[1] * self.scale, 32 * self.scale, + 32 * self.scale)) diff --git a/survival/systems/draw_system.py b/survival/systems/draw_system.py index 2cb35ae..38aac3e 100644 --- a/survival/systems/draw_system.py +++ b/survival/systems/draw_system.py @@ -1,14 +1,21 @@ from survival import esper from survival.components.position_component import PositionComponent from survival.components.sprite_component import SpriteComponent +from survival.user_interface import UserInterface class DrawSystem(esper.Processor): def __init__(self, camera): self.camera = camera + self.ui = None + + def initialize_interface(self, inventory): + self.ui = UserInterface(self.camera.window, inventory) def process(self, dt): for ent, (sprite, pos) in self.world.get_components(SpriteComponent, PositionComponent): sprite.image.pos = pos.position sprite.image.origin = (32 * pos.direction.value, 0) self.camera.draw(sprite.image) + self.ui.update() + self.ui.draw() diff --git a/survival/user_interface.py b/survival/user_interface.py new file mode 100644 index 0000000..33e8841 --- /dev/null +++ b/survival/user_interface.py @@ -0,0 +1,42 @@ +import pygame.font + +from survival import settings +from survival.components.inventory_component import InventoryComponent +from survival.generators.resource_generator import ResourceType +from survival.image import Image + + +class UserInterface: + def __init__(self, window, inventory: InventoryComponent): + self.width = settings.SCREEN_WIDTH + self.height = settings.SCREEN_HEIGHT + self.window = window + self.pos = (self.width - 240, 50) + self.scale = 2 + self.inventory = inventory + self.images = { + ResourceType.FOOD: Image('apple.png', self.pos, self.scale), + ResourceType.WATER: Image('water.png', self.pos, self.scale), + ResourceType.WOOD: Image('wood.png', self.pos, self.scale) + } + i = 0 + for key, value in self.images.items(): + self.images[key].pos = (self.pos[0] + i * 32 * self.scale + 8 * i, self.pos[1]) + i += 1 + self.slot_image = Image('ui.png', self.pos, scale=2) + self.font = pygame.font.SysFont('Comic Sans MS', 20) + + def update(self): + pass + + def draw(self): + for key, image in self.images.items(): + items_count = self.inventory.items[key] if self.inventory.has_item(key) else 0 + + self.slot_image.pos = image.pos + self.slot_image.draw_static(self.window) + image.draw_static(self.window) + + textsurface = self.font.render(str(items_count), False, (255, 255, 255)) + self.window.blit(textsurface, (image.pos[0] + 48, image.pos[1] + 36)) +