Compare commits

..

2 Commits

Author SHA1 Message Date
markojozsef
4de57827b0 AI használat annotálása 2026-10-07 12:01:27 +02:00
markojozsef
b30a7c291b MenuItem és TextRenderer dokumentáció 2026-10-07 11:56:14 +02:00
5 changed files with 441 additions and 0 deletions

16
doc/AIHasznalat.md Normal file
View File

@@ -0,0 +1,16 @@
# AI használat a kódban
## Jelző
Teljesen AI-generált szakaszokat egy `# !!! CHATGPT !!!` komment jelzi
## AI generálta komponensek:
### main.py
* Game
### renderers.py
* TextureRenderer
* NineSlicesPanel
### battle_data.py
* csata függvények

203
doc/MenuItem.md Normal file
View File

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

218
doc/TextRenderer.md Normal file
View File

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

View File

@@ -13,6 +13,7 @@ def anim_default(action, text, timer, dt):
return False return False
# !!! CHATGPT !!!
def move_attack(user, target): def move_attack(user, target):
return Action("Attack", user, target, Damage(user.attack, 0, 0, 0), StatusChange(0, 0, 0), anim_default) return Action("Attack", user, target, Damage(user.attack, 0, 0, 0), StatusChange(0, 0, 0), anim_default)
@@ -79,6 +80,8 @@ def enemy_turn_test(e,ep, ap,d):
print(f" ({e.name} chooses {act} -> {target.name})") print(f" ({e.name} chooses {act} -> {target.name})")
return builder(e, target) return builder(e, target)
# !!! CHATGPT VÉGE !!!
battles = [ battles = [
{ "enemies": [ { "enemies": [
Combatant("Six-Seven kid", 120, 30, 80, 20, 0, 50, False, False), Combatant("Six-Seven kid", 120, 30, 80, 20, 0, 50, False, False),

View File

@@ -8,6 +8,7 @@ import text
SCREEN_WIDTH = 256 SCREEN_WIDTH = 256
SCREEN_HEIGHT = 224 SCREEN_HEIGHT = 224
# !!! CHATGPT !!!
class Game(arcade.Window): class Game(arcade.Window):
def __init__(self): def __init__(self):
super().__init__( super().__init__(