From b30a7c291b5abc9cf9a26d5da29d3777fec1d8aa Mon Sep 17 00:00:00 2001 From: markojozsef Date: Wed, 7 Oct 2026 11:56:14 +0200 Subject: [PATCH] =?UTF-8?q?MenuItem=20=C3=A9s=20TextRenderer=20dokument?= =?UTF-8?q?=C3=A1ci=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/MenuItem.md | 203 +++++++++++++++++++++++++++++++++++++++++ doc/TextRenderer.md | 218 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 421 insertions(+) create mode 100644 doc/MenuItem.md create mode 100644 doc/TextRenderer.md diff --git a/doc/MenuItem.md b/doc/MenuItem.md new file mode 100644 index 0000000..5afc455 --- /dev/null +++ b/doc/MenuItem.md @@ -0,0 +1,203 @@ +# MenuItem + +## Áttekintés + +A `MenuItem` osztály egy játék menürendszerének egyetlen választható elemét reprezentálja. Az osztály kezeli: + +- a menüpont szövegének megjelenítését, +- a kijelölést, +- a menüpontok közötti navigációt, +- a kiválasztáskor meghívandó függvényt (akciót), +- valamint a kurzor kirajzolását. + +A menüpontok egy irányított hálózatot alkotnak, ahol minden elem ismeri a szomszédait (`up`, `down`, `left`, `right`). + +--- + +## Konstruktor + +```python +MenuItem( + label, + x, + y, + left, + right, + up, + down, + action, + data=None +) +``` + +### Paraméterek + +- `label` (`str`) + A menüpont megjelenő szövege. + +- `x` (`int`) + A menüpont vízszintes pozíciója. + +- `y` (`int`) + A menüpont függőleges pozíciója. + +- `left` (`MenuItem | None`) + A bal oldali szomszédos menüpont. + +- `right` (`MenuItem | None`) + A jobb oldali szomszédos menüpont. + +- `up` (`MenuItem | None`) + A felső szomszédos menüpont. + +- `down` (`MenuItem | None`) + Az alsó szomszédos menüpont. + +- `action` (`callable`) + A menüpont kiválasztásakor meghívandó függvény. + +- `data` (`any`, opcionális) + A kiválasztáskor az akciónak átadott adat. + +--- + +## Attribútumok + +### Navigáció + +```python +self.left +self.right +self.up +self.down +``` + +A szomszédos menüpontokra mutató referenciák. + +Ha egy adott irányban nincs további menüpont, akkor az attribútum értéke: + +```python +None +``` + +--- + +### Akció + +```python +self.action +``` + +A kiválasztás során meghívandó függvény. + +Példa: + +```python +def start_game(data): + print("Játék indul!") +``` + +--- + +### Adat + +```python +self.data +``` + +A menüelemhez kapcsolódó opcionális adat, amelyet az akciófüggvény paraméterként kap meg. + +Példa: + +```python +MenuItem( + "Nehéz", + 100, 100, + None, None, None, None, + set_difficulty, + "hard" +) +``` + +Kiválasztáskor: + +```python +set_difficulty("hard") +``` + +fut le. + +--- + +### Pozíció + +```python +self.x +self.y +``` + +A menüpont képernyőn elfoglalt pozíciója. + +--- + +### Szövegmegjelenítő + +```python +self.text +``` + +Egy `TextRenderer` objektum, amely a felirat megjelenítéséért felel. + +--- + +### Kijelölt állapot + +```python +self.selected +``` + +Logikai érték: + +- `True`: a menüpont jelenleg ki van jelölve; +- `False`: a menüpont nincs kijelölve. + +--- + +## Metódusok + +### `select()` + +```python +select() +``` + +Kijelöli a menüpontot. + +#### Működés + +```python +self.selected = True +``` + +#### Példa + +```python +start_button.select() +``` + +--- + +### `update()` + +```python +update() +``` + +A menüpont állapotának frissítése. + +Ha az elem nincs kijelölve, a függvény azonnal visszatér: + +```python +if not self.selected: + return +``` diff --git a/doc/TextRenderer.md b/doc/TextRenderer.md new file mode 100644 index 0000000..df42c0b --- /dev/null +++ b/doc/TextRenderer.md @@ -0,0 +1,218 @@ +# TextRenderer + +A `TextRenderer` osztály egy egyszerű, karakterenként gépelődő (typewriter effektusú) szövegmegjelenítő. A szöveget sprite-okként tárolja és rendereli, támogatja a sortörést meghatározott szélesség esetén, valamint speciális karakterek kezelését egyedi `display()` függvényeken keresztül. + +--- + +## Konstruktor + +```python +TextRenderer(x, y, width=None) +``` + +Új szövegmegjelenítőt hoz létre. + +### Paraméterek + +- `x` (`int`) - A szöveg kezdő X koordinátája. +- `y` (`int`) - A szöveg kezdő Y koordinátája. +- `width` (`int | None`) - Opcionális maximális szélesség pixelekben. Túllépés esetén automatikus sortörés történik. + +### Attribútumok + +- `sprites` - A renderelendő karaktersprite-ok listája. +- `base_x` - Kezdő X koordináta. +- `base_y` - Kezdő Y koordináta. +- `width` - Maximális szövegszélesség. +- `text` - A megjelenítendő szöveg. +- `textptr` - Az aktuálisan feldolgozott karakter indexe. +- `x` - Aktuális rajzolási pozíció X tengelyen. +- `y` - Aktuális rajzolási pozíció Y tengelyen. + +--- + +## `reset(text)` + +```python +reset(text) +``` + +Visszaállítja a renderelőt alapállapotba, és új szöveget tölt be. + +### Paraméterek + +- `text` (`str`) - A megjelenítendő szöveg. + +### Működés + +- Törli az összes korábbi sprite-ot. +- Visszaállítja a rajzolási pozíciót a kezdőkoordinátákra. +- Nullázza a karaktermutatót (`textptr`). + +### Példa + +```python +renderer.reset("Helló világ!") +``` + +--- + +## `amend(text)` + +```python +amend(text) +``` + +Hozzáfűz további szöveget a már meglévő szöveghez. + +### Paraméterek + +- `text` (`str`) - A hozzáfűzendő szöveg. + +### Példa + +```python +renderer.reset("Helló") +renderer.amend(" világ!") +``` + +Eredmény: + +```text +Helló világ! +``` + +--- + +## `type_tick()` + +```python +type_tick() +``` + +Egyetlen karakter feldolgozását végzi el. A függvény elsősorban gépelési animációk megvalósítására használható. + +### Visszatérési érték + +```python +bool +``` + +- `True` - a teljes szöveg feldolgozása befejeződött. +- `False` - még vannak feldolgozatlan karakterek. + +### Működés + +1. Lekéri az aktuális karakterhez tartozó definíciót a `texttable` szótárból. +2. Ismeretlen karakter esetén a `'?'` definíciót használja. +3. Látható karakter esetén: + - kivágja a megfelelő textúrát a font atlaszból, + - létrehozza a sprite adatait, + - hozzáadja azokat a `sprites` listához. +4. Ha a megadott szélesség elfogyott: + - új sorba lép, + - az Y koordinátát 13 pixellel csökkenti. +5. Nem látható karakter esetén meghívja a karakter: + +```python +display(renderer) +``` + +metódusát. + +### Példa + +```python +while not renderer.type_tick(): + pass +``` + +--- + +## `type_all()` + +```python +type_all() +``` + +A teljes szöveget azonnal feldolgozza. + +### Működés + +A `type_tick()` függvényt hívja ismételten addig, amíg minden karakter feldolgozásra nem kerül. + +### Példa + +```python +renderer.reset("Szia!") +renderer.type_all() +``` + +A teljes szöveg egyetlen frame alatt elkészül. + +--- + +## `render()` + +```python +render() +``` + +Kirajzolja az összes létrehozott karaktersprite-ot. + +### Működés + +A `sprites` listán végighaladva minden karakterhez meghívja: + +```python +arcade.draw_texture_rect() +``` + +függvényt pixelpontos (`pixelated=True`) rendereléssel. + +### Példa + +```python +def on_draw(self): + arcade.start_render() + renderer.render() +``` + +--- + +# Tipikus használat + +## Gépelési effekt + +```python +renderer = TextRenderer(10, 100, width=200) + +renderer.reset( + "Ez egy hosszabb szöveg, amely több sorba törhet." +) + +renderer.type_tick() + +renderer.render() +``` + +## Azonnali megjelenítés + +```python +renderer = TextRenderer(10, 100) + +renderer.reset("Helló világ!") +renderer.type_all() + +renderer.render() +``` + +--- + +# Megjegyzések + +- Az osztály nem hoz létre külön `Sprite` objektumot minden karakterhez, hanem csak a szükséges textúrát és pozíciót tárolja. +- Ismeretlen karakter esetén automatikusan a `'?'` karakter kerül megjelenítésre. +- A sortörés kizárólag a megadott `width` túllépésekor történik. +- Speciális vezérlőkarakterek létrehozhatók `visible=False` karakterdefiníciókkal. +- Ezek a karakterek tetszőleges működést valósíthatnak meg a `display(renderer)` metóduson keresztül. \ No newline at end of file