From 77b767b5759cd1398e20ab911797511e91f71c6c Mon Sep 17 00:00:00 2001 From: markojozsef Date: Fri, 11 Sep 2026 19:08:17 +0200 Subject: [PATCH] Nine slices panelek --- res/sprite/panel.png | Bin 0 -> 349 bytes src/assets.py | 1 + src/gamestates/menu.py | 15 ++++++ src/gamestates/title.py | 10 +++- src/renderers.py | 111 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 res/sprite/panel.png create mode 100644 src/gamestates/menu.py diff --git a/res/sprite/panel.png b/res/sprite/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0ffdccf6d825940850414762206a1702bbf46b GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sLIFM@u0UFn;Xe=n8Db2NeJuZH zem1lLa@b0O{DQ$U|Enq=`~!-7@pN$v@#s7odYbQu0>_%r|Np0(=UuZp(6gmlt6eSX z8KaPG-*q?N!%ydDhRlwS*pmN8tV81G-svAD9S?TQ_~UUS-N41xR?}i;0(V5qWBvg1 z5Z8v4MH{32Srp#pGq^2W5FA{hzU6w-uaIduVOc8;44ESSDqiuNzGRk#MRAgwRxroZ zfCkSZDW`|~7aio&-*sfuVl}2D?{^VS|K24>H(%W?HhbGHqZv%ndHc(gryV)FW!cp@ zHjSksCr-rPmQz@fXuVRg>*U1%*$%G8%S8s>i87N`2Wh4zopr0C$&@E&u=k literal 0 HcmV?d00001 diff --git a/src/assets.py b/src/assets.py index 4bac3c7..2f135a1 100644 --- a/src/assets.py +++ b/src/assets.py @@ -7,4 +7,5 @@ sprites = { "louisb": arcade.load_texture("res/sprite/louisb.png"), "cursor": arcade.load_texture("res/sprite/handcursor.png"), "font": arcade.load_spritesheet("res/sprite/font.png"), + "panel": arcade.load_spritesheet("res/sprite/panel.png"), } diff --git a/src/gamestates/menu.py b/src/gamestates/menu.py new file mode 100644 index 0000000..9243416 --- /dev/null +++ b/src/gamestates/menu.py @@ -0,0 +1,15 @@ +import arcade +import assets +import text + +text = text.TextRenderer(0, 100, 200) + +def switch(): + text.reset("●A bölcs, gyors, fürge róka zöld ágon ül, miközben egy tyúk csípős paprikát főz, és egy whiskyvel teli dobozt cipelő dzsesszzenész kvázi jókedvűen fütyörészik.") + text.type_all() + +def update(dt): + pass + +def draw(game): + text.render() diff --git a/src/gamestates/title.py b/src/gamestates/title.py index 9243416..acf2c97 100644 --- a/src/gamestates/title.py +++ b/src/gamestates/title.py @@ -1,8 +1,10 @@ import arcade import assets import text +import renderers -text = text.TextRenderer(0, 100, 200) +text = text.TextRenderer(6, 186, 210) +panel = renderers.NineSlicesPanel(0,100,230,100); def switch(): text.reset("●A bölcs, gyors, fürge róka zöld ágon ül, miközben egy tyúk csípős paprikát főz, és egy whiskyvel teli dobozt cipelő dzsesszzenész kvázi jókedvűen fütyörészik.") @@ -12,4 +14,10 @@ def update(dt): pass def draw(game): + arcade.draw_rect_filled( + arcade.LBWH(0, 0, game.screen_width, game.screen_height), + arcade.color.RED, + ) + + panel.render() text.render() diff --git a/src/renderers.py b/src/renderers.py index e0321a4..48152d5 100644 --- a/src/renderers.py +++ b/src/renderers.py @@ -1,5 +1,7 @@ import arcade +import assets +# !!! CHATGPT !!! class TextureRenderer: def __init__(self, ctx): self.ctx = ctx @@ -56,4 +58,113 @@ class TextureRenderer: self.quad.render(self.program) +# !!! CHATGPT !!! +class NineSlicesPanel: + SLICE_SIZE = 16 + def __init__(self, x, y, w, h): + self.x = x + self.y = y + self.w = w + self.h = h + + self.sprites = [] + self.rebuild() + + def rebuild(self): + self.sprites.clear() + + sheet = assets.sprites["panel"] + s = self.SLICE_SIZE + + # Crop a specific sub-region from the spritesheet + def tex(col, row, w=s, h=s): + return sheet.get_texture( + arcade.LBWH(col * s, row * s, w, h) + ) + + # Base 9-slice textures + textures = { + "bl": tex(0, 2), + "b": tex(1, 0), + "br": tex(2, 2), + "l": tex(0, 1), + "c": tex(1, 1), + "r": tex(2, 1), + "tl": tex(0, 0), + "t": tex(1, 2), + "tr": tex(2, 0), + } + + def add(texture, x, y, w, h): + if w > 0 and h > 0: + self.sprites.append(( + texture, + arcade.XYWH(x + w / 2, y + h / 2, w, h) + )) + + # Corners + add(textures["bl"], self.x, self.y, s, s) + add(textures["br"], self.x + self.w - s, self.y, s, s) + add(textures["tl"], self.x, self.y + self.h - s, s, s) + add(textures["tr"], self.x + self.w - s, self.y + self.h - s, s, s) + + middle_w = self.w - s * 2 + middle_h = self.h - s * 2 + + # Tile horizontal edges + def tile_horizontal(col, row, x, y, width): + curr_x = x + rem_w = width + while rem_w > 0: + tile_w = min(s, rem_w) + t = tex(col, row, tile_w, s) + add(t, curr_x, y, tile_w, s) + curr_x += tile_w + rem_w -= tile_w + + # Tile vertical edges + def tile_vertical(col, row, x, y, height): + curr_y = y + rem_h = height + while rem_h > 0: + tile_h = min(s, rem_h) + # Crop from top of sprite when filling upwards + t = tex(col, row, s, tile_h) + add(t, x, curr_y, s, tile_h) + curr_y += tile_h + rem_h -= tile_h + + # Render borders + tile_horizontal(1, 2, self.x + s, self.y, middle_w) # Bottom + tile_horizontal(1, 0, self.x + s, self.y + self.h - s, middle_w) # Top + tile_vertical(0, 1, self.x, self.y + s, middle_h) # Left + tile_vertical(2, 1, self.x + self.w - s, self.y + s, middle_h) # Right + + # Render center grid + curr_y = self.y + s + rem_h = middle_h + + while rem_h > 0: + tile_h = min(s, rem_h) + curr_x = self.x + s + rem_w = middle_w + + while rem_w > 0: + tile_w = min(s, rem_w) + t = tex(1, 1, tile_w, tile_h) + add(t, curr_x, curr_y, tile_w, tile_h) + + curr_x += tile_w + rem_w -= tile_w + + curr_y += tile_h + rem_h -= tile_h + + def render(self): + for texture, rect in self.sprites: + arcade.draw_texture_rect( + texture, + rect, + pixelated=True + )