From 4f5fc257012745d4dec6b41184fba1ee60ae389d Mon Sep 17 00:00:00 2001 From: moonbak Date: Mon, 22 Apr 2024 21:01:43 +0200 Subject: [PATCH] code cleanup + engine version bump --- src/pyved_engine/api.py | 2 +- src/pyved_engine/classes.py | 141 ---------------------------------- src/pyved_engine/compo/gfx.py | 8 +- src/pyved_engine/vars.py | 2 +- 4 files changed, 6 insertions(+), 147 deletions(-) delete mode 100644 src/pyved_engine/classes.py diff --git a/src/pyved_engine/api.py b/src/pyved_engine/api.py index 5666aa0..3e44362 100644 --- a/src/pyved_engine/api.py +++ b/src/pyved_engine/api.py @@ -41,7 +41,7 @@ from abc import ABCMeta, abstractmethod from . import vars from math import degrees as _degrees -from .classes import Spritesheet as _Spritesheet +# from .classes import Spritesheet as _Spritesheet from . import _hub import time from .compo import vscreen diff --git a/src/pyved_engine/classes.py b/src/pyved_engine/classes.py deleted file mode 100644 index 5e3cb36..0000000 --- a/src/pyved_engine/classes.py +++ /dev/null @@ -1,141 +0,0 @@ -from collections import defaultdict - -from . import _hub - - -class Spritesheet: - """ - handles sprite sheets in an optimized way! - REMARK: When calling images_at the rect is the format: (x, y, x + offset, y + offset) - """ - - def __init__(self, resource_info, chosen_scale=1): - """ - :param resource_info: either pygame.Surface or filepath - :param chosen_scale: - """ - if isinstance(resource_info, _hub.pygame.Surface): - self._sheet = resource_info - else: - self._sheet = _hub.pygame.image.load(resource_info).convert() - - if float(chosen_scale) != 1.0: - homo = _hub.pygame.transform.scale - w, h = self._sheet.get_size() - self._sheet = homo(self._sheet, (chosen_scale * w, chosen_scale * h)) - - # can be init later - self._per_line_img_quant = 0 - self._card = 0 - self._tilesize = None - - self._colorkey = None - - # goal: speed-up - self.cache = defaultdict(lambda: None) - self._spacing = 0 - - @property - def colorkey(self): - return self._colorkey - - @colorkey.setter - def colorkey(self, v): - self._colorkey = v - self._cache_update() - - @property - def card(self): - return self._card - - @property - def tilesize(self): - return self._tilesize - - def set_infos(self, pair_wh, count_tiles=None, nb_columns=None, spacing=0): - self._tilesize = pair_wh[0], pair_wh[1] - - if count_tiles is not None and nb_columns is not None: - self._per_line_img_quant = nb_columns - self._card = count_tiles - else: - sz = self._sheet.get_size() - self._per_line_img_quant = sz[0] // self._tilesize[0] - self._card = (sz[1] // self._tilesize[1]) * self._per_line_img_quant - - self._spacing = spacing - # - debug - # print( - # f'infos dans Spritesheet saisies depuis dehors:\n___tilesize {self._tilesize}\n' - # + '___count_img {count_tiles}\n___nbcol {nb_columns}\n___spacing {spacing}' - # ) - self._cache_update() - - def _cache_update(self): - # re - populate the whole cache! - self.cache.clear() - pg = _hub.pygame - - if self._tilesize is None: - return - tile_w, tile_h = self._tilesize - ident = 0 - nb_lines = self._card // self._per_line_img_quant - for curr_line in range(1, nb_lines + 1): - for column in range(1, self._per_line_img_quant + 1): - adhocx = -tile_w + column * tile_w + (column - 1) * self._spacing - adhocy = -tile_h + curr_line * tile_h + (curr_line - 1) * self._spacing - decoupe = pg.Rect(adhocx, adhocy, tile_w, tile_h) - y = self._sheet.subsurface(decoupe) - if self._colorkey is not None: - y.set_colorkey(self._colorkey) - self.cache[ident] = y - ident += 1 - - @property - def spacing(self): - return self._spacing - - def __getitem__(self, item): - return self.image_by_rank(item) - - def image_at(self, rectangle): - y = self._sheet.subsurface(rectangle).copy() - if self._colorkey: - y.set_colorkey(self._colorkey) - return y - - # USE WITH CAUTION! This method provides no optimization - def images_at(self, rects, colorkey): - """ - Loads a bunch of images at once - :param rects: a list of coordinates - :param colorkey: - :return: several images as a list - """ - res = [self.image_at(rect) for rect in rects] - for e in res: - e.set_colorkey(colorkey) - return res - - def image_by_rank(self, kval): - if self._tilesize is None: - raise ValueError('Spritesheet.image_by_rank call but tilesize hasnt been set!') - y = self.cache[kval] - if y is None: - tw, th = self._tilesize - # map kval -> to a rect - i, j = kval % self._per_line_img_quant, int(kval / self._per_line_img_quant) - rect_obj = _hub.pygame.Rect(i * tw, j * th, tw, th) - # crop from the sheet save & return the result - y = self.cache[kval] = self.image_at(rect_obj) - return y - - # USE WITH CAUTION! This method provides no optimization - def load_strip(self, rect_img0, image_count, colorkey=None): - """Loads a strip of images and returns them as a list, rect must cut out the img rank 0""" - rect = rect_img0 - tw, th = rect[2], rect[3] - tups = [(rect[0] + x * tw, rect[1], tw, th) for x in range(image_count)] - return self.images_at(tups, colorkey) - diff --git a/src/pyved_engine/compo/gfx.py b/src/pyved_engine/compo/gfx.py index 8119e4d..7ac036b 100644 --- a/src/pyved_engine/compo/gfx.py +++ b/src/pyved_engine/compo/gfx.py @@ -16,7 +16,7 @@ def __init__(self, filename_noext_nopath, pathinfo=None, ck=None): avoid several bugs that exist in the pyVM component. (scaling images, and use .subsurface on these images for cutting sub images) As long as the pyVM has not bee toroughly debugged and tested, - I recommend not modifying the following code /!\ unless you want to take risks + I recommend not modifying the following code, unless you want to take risks """ print('create SpriteSheet based on json:', filename_noext_nopath) @@ -91,7 +91,7 @@ def _init_sheet_attr(self): def __init__(self): self.forcing_transparency = False - self._sheet = None + self._sheet = dict() self._init_sheet_attr() # specific to capello-ft.png and capello-ft.json... @@ -134,11 +134,11 @@ def __init__(self): # - generic self.ascii2img = dict() - defaultw = self._sheet['tile{:03d}.png'.format(self.UNKNOWN_CAR_RK)].get_width() + defaultw = self._sheet["tile{:03d}.png".format(self.UNKNOWN_CAR_RK)].get_width() self.car_width = defaultdict(lambda: defaultw) for my_asciicode in mappingtable.keys(): - ssurf = self._sheet['tile{:03d}.png'.format(mappingtable[my_asciicode])] + ssurf = self._sheet["tile{:03d}.png".format(mappingtable[my_asciicode])] self.ascii2img[my_asciicode] = ssurf self.car_width[chr(my_asciicode)] = ssurf.get_width() diff --git a/src/pyved_engine/vars.py b/src/pyved_engine/vars.py index 35e8d70..70cc58b 100644 --- a/src/pyved_engine/vars.py +++ b/src/pyved_engine/vars.py @@ -10,7 +10,7 @@ # below is a read-only value, # to retrieve this value from outside you can call pyv.get_version() -ENGINE_VERSION_STR = '24.4a2' +ENGINE_VERSION_STR = '24.4a3' # deprecated but mandatory for web ctx STD_SCR_SIZE = [960, 720]