Nine slices panelek

This commit is contained in:
markojozsef
2026-09-11 19:08:17 +02:00
parent 11bd208c79
commit 77b767b575
5 changed files with 136 additions and 1 deletions

View File

@@ -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"),
}

15
src/gamestates/menu.py Normal file
View File

@@ -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()

View File

@@ -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()

View File

@@ -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
)