Zpět na projekty
TUIX v0.2.0Beta

Naposledy aktualizováno: 2026-05-20

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

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

ParametrTypPopis
objTuixObjectUkazatel na objekt
x, yintSouřadnice pixelu (od 0)
symint/charHodnota znaku (jeden bajt)
fgr, fgg, fgbint (0–255)Barva popředí RGB
bgr, bgg, bgbint (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.

ParametrTypPopis
objTuixObjectUkazatel na objekt
pixels_ptrctypes pointerUkazatel na pole TuixPixel
sizeintPoč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.

ParametrTypPopis
x0, y0intPočáteční souřadnice
x1, y1intKoncové souřadnice
symint/charZnak, kterým se kreslí
fgr, fgg, fgbint (0–255)RGB popředí
bgr, bgg, bgbint (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.

ParametrTypPopis
x, yintLevý horní roh
w, hintŠířka a výška
symint/charZnak, kterým se kreslí
filledint1 pro plný, 0 jen obrys
fgr, fgg, fgbint (0–255)RGB popředí
bgr, bgg, bgbint (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.

ParametrTypPopis
cx, cyintSouřadnice středu
radiusintPoloměr kruhu
symint/charZnak, kterým se kreslí
filledint1 pro plný, 0 jen obrys
fgr, fgg, fgbint (0–255)RGB popředí
bgr, bgg, bgbint (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.

ParametrTypPopis
x, yintPočáteční pozice
textbytesText k vykreslení (např. b"Hello\nWorld")
fgr, fgg, fgbint (0–255)RGB popředí
bgr, bgg, bgbint (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.

ParametrTypPopis
dst_x, dst_yintCílová pozice na plátně
sprite_w, sprite_hintRozměry spritu
sprite_ptrctypes pointerUkazatel 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)
FunkceNávratová hodnotaPopis
tuix_canvas_cache_sprite(obj, w, h, ptr)intNezáporné ID cache, nebo -1 při chybě
tuix_canvas_draw_cached_sprite(obj, id, x, y)int0 při úspěchu
tuix_canvas_free_cached_sprite(obj, id)NoneUvolní 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()