Widget Plátno
Volná kreslicí plocha s kontrolou na úrovni pixelů. Podporuje nastavování jednotlivých pixelů, geometrické primitivy (čára, obdélník, kruh), kreslení textu a práci se sprity včetně cache.
Vytvoření plátna
from tuix.core import builders, objects, buffers
uid = objects.create_object(
builders.CANVAS, b"main",
1.0, 1.0, # full terminal width and height
0.0, 0.0 # no margin (top-left corner)
)
buf = buffers.get_buffer_by_uid(uid)
obj = buf.contents.obj.contentsOperace s pixely
tuix_canvas_set_pixel(obj, x, y, sym, fgr, fgg, fgb, bgr, bgg, bgb)
Nastaví jeden pixel na (x, y) na daný znak a barvy.
| Parametr | Typ | Popis |
|---|---|---|
| obj | TuixObject | Ukazatel na objekt |
| x, y | int | Souřadnice pixelu (od 0) |
| sym | int/char | Hodnota znaku (jeden bajt) |
| fgr, fgg, fgb | int (0–255) | Barva popředí RGB |
| bgr, bgg, bgb | int (0–255) | Barva pozadí RGB |
# Draw a red 'X' on black background at position (10, 5)
objects.tuix_canvas_set_pixel(obj, 10, 5, ord(b'X'), 255, 0, 0, 0, 0, 0)tuix_canvas_insert_buffer(obj, pixels_ptr, size)
Nahradí pixelový buffer plátna předpřipraveným polem pixelů. Používá se pro hromadné operace.
| Parametr | Typ | Popis |
|---|---|---|
| obj | TuixObject | Ukazatel na objekt |
| pixels_ptr | ctypes pointer | Ukazatel na pole TuixPixel |
| size | int | Počet pixelů v poli |
Kreslicí primitiva
tuix_canvas_draw_line(obj, x0, y0, x1, y1, sym, fgr, fgg, fgb, bgr, bgg, bgb)
Nakreslí čáru z (x0, y0) do (x1, y1) pomocí Bresenhamova algoritmu.
| Parametr | Typ | Popis |
|---|---|---|
| x0, y0 | int | Počáteční souřadnice |
| x1, y1 | int | Koncové souřadnice |
| sym | int/char | Znak, kterým se kreslí |
| fgr, fgg, fgb | int (0–255) | RGB popředí |
| bgr, bgg, bgb | int (0–255) | RGB pozadí |
# Draw a green line from (0,0) to (20,10)
objects.tuix_canvas_draw_line(obj, 0, 0, 20, 10, ord(b'*'), 0, 255, 0, 0, 0, 0)tuix_canvas_draw_rect(obj, x, y, w, h, sym, filled, fgr, fgg, fgb, bgr, bgg, bgb)
Nakreslí obdélník. Nastavte filled=1 pro plný obdélník, filled=0 pouze pro obrys.
| Parametr | Typ | Popis |
|---|---|---|
| x, y | int | Levý horní roh |
| w, h | int | Šířka a výška |
| sym | int/char | Znak, kterým se kreslí |
| filled | int | 1 pro plný, 0 jen obrys |
| fgr, fgg, fgb | int (0–255) | RGB popředí |
| bgr, bgg, bgb | int (0–255) | RGB pozadí |
# Draw a blue filled rectangle
objects.tuix_canvas_draw_rect(obj, 5, 2, 15, 8, ord(b'#'), 1, 0, 100, 255, 0, 0, 0)
# Draw a red outline rectangle
objects.tuix_canvas_draw_rect(obj, 5, 2, 15, 8, ord(b'+'), 0, 255, 0, 0, 0, 0, 0)tuix_canvas_draw_circle(obj, cx, cy, radius, sym, filled, fgr, fgg, fgb, bgr, bgg, bgb)
Nakreslí kruh se středem v (cx, cy) a daným poloměrem.
| Parametr | Typ | Popis |
|---|---|---|
| cx, cy | int | Souřadnice středu |
| radius | int | Poloměr kruhu |
| sym | int/char | Znak, kterým se kreslí |
| filled | int | 1 pro plný, 0 jen obrys |
| fgr, fgg, fgb | int (0–255) | RGB popředí |
| bgr, bgg, bgb | int (0–255) | RGB pozadí |
# Draw a yellow filled circle
objects.tuix_canvas_draw_circle(obj, 20, 10, 5, ord(b'O'), 1, 255, 255, 0, 0, 0, 0)Kreslení textu
tuix_canvas_draw_text(obj, x, y, text, fgr, fgg, fgb, bgr, bgg, bgb)
Vykreslí textový řetězec od (x, y). Podporuje znak nového řádku (\n) pro vícerádkový text.
| Parametr | Typ | Popis |
|---|---|---|
| x, y | int | Počáteční pozice |
| text | bytes | Text k vykreslení (např. b"Hello\nWorld") |
| fgr, fgg, fgb | int (0–255) | RGB popředí |
| bgr, bgg, bgb | int (0–255) | RGB pozadí |
objects.tuix_canvas_draw_text(obj, 5, 2, b"Hello World!", 255, 255, 255, 0, 0, 0)Operace se sprity
tuix_canvas_draw_sprite(obj, dst_x, dst_y, sprite_w, sprite_h, sprite_ptr)
Vykreslí sprite (předpřipravené pole TuixPixel) na danou pozici.
| Parametr | Typ | Popis |
|---|---|---|
| dst_x, dst_y | int | Cílová pozice na plátně |
| sprite_w, sprite_h | int | Rozměry spritu |
| sprite_ptr | ctypes pointer | Ukazatel na pole TuixPixel |
Cache spritů
Pro sprity kreslené opakovaně použijte cache API, abyste se vyhnuli opakovanému přenosu dat:
# Cache a sprite (upload to C-side memory)
sprite_id = objects.tuix_canvas_cache_sprite(obj, sprite_w, sprite_h, sprite_ptr)
# Draw cached sprite at multiple positions (fast — no data transfer)
objects.tuix_canvas_draw_cached_sprite(obj, sprite_id, 10, 5)
objects.tuix_canvas_draw_cached_sprite(obj, sprite_id, 30, 5)
objects.tuix_canvas_draw_cached_sprite(obj, sprite_id, 50, 5)
# Free cached sprite when no longer needed
objects.tuix_canvas_free_cached_sprite(obj, sprite_id)| Funkce | Návratová hodnota | Popis |
|---|---|---|
| tuix_canvas_cache_sprite(obj, w, h, ptr) | int | Nezáporné ID cache, nebo -1 při chybě |
| tuix_canvas_draw_cached_sprite(obj, id, x, y) | int | 0 při úspěchu |
| tuix_canvas_free_cached_sprite(obj, id) | None | Uvolní cachovaný sprite |
Kompletní příklad: skákající míček
from tuix.core import engine, builders, scenes, registry, objects, buffers, input
import time, math
engine.init()
builders.register_standard()
scenes.init_scene(b"main")
registry.registry.current_scene_name = b"main"
input.listen()
uid = objects.create_object(builders.CANVAS, b"main", 1.0, 1.0, 0.0, 0.0)
buf = buffers.get_buffer_by_uid(uid)
obj = buf.contents.obj.contents
# Run main_loop once to resolve geometry
engine.main_loop()
w = buf.contents.width
h = buf.contents.height
# Ball state
bx, by = w // 2, h // 2
vx, vy = 1, 1
hue = 0
for frame in range(600):
# Clear with background
objects.tuix_canvas_draw_rect(obj, 0, 0, w, h, ord(b' '), 1, 0, 0, 0, 20, 20, 30)
# Draw border
objects.tuix_canvas_draw_rect(obj, 0, 0, w, h, ord(b'.'), 0, 60, 60, 60, 20, 20, 30)
# Move ball
bx += vx
by += vy
if bx <= 1 or bx >= w - 2:
vx = -vx
if by <= 1 or by >= h - 2:
vy = -vy
# HSL color cycling
r = int(127 + 127 * math.sin(hue))
g = int(127 + 127 * math.sin(hue + 2.094))
b_color = int(127 + 127 * math.sin(hue + 4.189))
hue += 0.05
# Draw ball
objects.tuix_canvas_draw_circle(obj, bx, by, 2, ord(b'O'), 1, r, g, b_color, 20, 20, 30)
engine.main_loop()
time.sleep(0.016)
buffers.free_buffer(b"main", uid)
input.stop()
engine.shutdown()