Přejít k navigační liště

Zdroják » JavaScript » Artisan: kreslíme v JavaScriptu

Artisan: kreslíme v JavaScriptu

Články JavaScript, Různé

Před nedávnem jsme si na těchto stránkách představili grafickou knihovnu Raphaël, která umožňuje jednoduše vytvářet vektorovou grafiku. Používá k tomu SVG (či VML). Podobně funguje i knihovna, kterou si představíme dnes, jenom místo SVG pracuje nad Canvasem. Hlavní výhodou je schopnost používat vrstvy.

Knihovna Artisan.js zjednodušuje kreslení grafických objektů pomocí HTML5 elementu Canvas a jeho API.

Kreslíme s Canvasem

Použití canvasu je široce rozebíráno a známo. Příklad použití canvasu ukazuje následující kód:

var canvas = document.getElementById(target);
var context = canvas.getContext('2d');
context.fillStyle = fill_color;
context.strokeStyle = stroke_color;
context.lineWidth = line_width;
context.globalAlpha = alpha;
context.shadowOffsetX = shadow_offset_x;
context.shadowOffsetY = shadow_offset_y;
context.shadowBlur = shadow_blur;
context.shadowColor = shadow_color;
context.fillRect(start_x, start_y, width, height);
context.strokeRect(start_x, start_y, width, height);

Artisan zapouzdřuje veškerý tento kód a nabízí zjednodušené volání pomocí jedné funkce:

artisan.drawRectangle(target, start_x, start_y, width, height,
   fill_color, line_width, stroke_color, alpha, shadow_blur, shadow_color, shadow_offset_x, shadow_offset_y
);

Parametry od fill_color jsou nepovinné.

Vrstvy

Canvas funguje jako prostá bitmapa s jednou vrstvou, např. jako PNG obrázek. Jakmile do něj nakreslíte kružnici, je v něm nakreslená a zůstává tam, nelze ji jednoduše odstranit ani změnit.

Artisan nabízí koncept vrstev – jednotlivé objekty lze kreslit do „virtuálních ploch“. Tyto plochy lze pak individuálně vykreslit do elementu Canvas, lze je vykreslovat opakovaně či do různých canvasů.

Kromě vrstev umí Artisan pracovat i se zásobníky (stacks) – tedy se seznamy vrstev, které lze vykreslovat najednou. Vrstvy jsou přidávány do zásobníků postupně a tvoří historii. Ukažme si práci s nimi názorně. Nejprve si vytvoříme zásobník a v něm vrstvu:

artisan.create.stack();
artisan.create.layer(1);

Na začátku je vždy vytvořen default stack. Volání funkce create.stack() vytvoří nový stack s pořadovým číslem 1 (zásobníky jsou číslovány od nuly, default stack má číslo 0). Funkce create.layer() vytvoří vrstvu v zásobníku, jehož číslo je v parametru. tedy v tomto případě v prvním.

var kruh = [100, 100, 30, '#FF0000'];
artisan.addToHistory(1, 0, 0, 'circle', kruh);

Na prvním řádku je vytvořeno pole se seznamem parametrů pro volání funkce circle – souřadnice X, Y, poloměr a barvu. Parametry jsou předány funkci addToHistory. Její volání si rozeberme podrobněji:

addToHistory má pět argumentů. První je číslo zásobníku (v našem příkladu 1), druhý je číslo vrstvy v daném zásobníku (první vrstva, tj. číslo 0), třetí argument je pořadí v historii. Pokud nechcete používat historii (např. pro funkci „o krok zpět“), nechte prostě 0.

Čtvrtým argumentem je název kreslicí funkce – „circle“. Posledním pak seznam parametrů pro volání té funkce.

Všimněte si, že nikde není uveden element, do něhož se kruh kreslí. Je to proto, že v tuto chvíli je pouze připraveno volání funkce. Vlastní vykreslení pak zařídí volání funkce drawLayer nebo drawStack:

artisan.drawLayer('elementCanvas', 1, 0, 0);

Funkci předáváme jméno elementu, číslo stacku, číslo vrstvy a číslo kroku (historie). Celý zásobník vykreslíme obdobně:

artisan.drawStack('elementCanvas', 1, 0);

Z parametrů vypadlo číslo vrstvy – vykreslují se všechny.

Výhodou tohoto přístupu je mj. i to, že připravený obrázek můžeme vykreslit, měnit a vykreslovat znovu tak, jak budeme potřebovat.

Kreslíme…

Seznam funkcí pro vlastní kreslení není nijak úctyhodný – současná verze obsahuje těchto šest:

artisan.drawCircle(target, placex, placey, radius, fill_color, line_width, stroke_color, alpha, shadow_blur, shadow_color, shadow_offset_x, shadow_offset_y);
artisan.drawImage(target, src, placex, placey, width, height, alpha, fill_color, line_width, stroke_color, shadow_blur, shadow_color, shadow_offset_x, shadow_offset_y);
artisan.drawLine(target, start_x, start_y, end_x, end_y, line_width, line_color, type, cp1_x, cp1_y, cp2_x, cp2_y)
artisan.drawPath(target, path, line_width, line_color, fill_color);
artisan.drawRectangle(target, start_x, start_y, width, height, fill_color, line_width, stroke_color, alpha, shadow_blur, shadow_color, shadow_offset_x, shadow_offset_y);
artisan.drawText(target, place_x, place_y, text, text_color, weight, size, font, align, alpha, line_width, line_color, baseline);

Funkce slouží ke kreslení kruhu, obrázku, čáry, cesty (navazující čára), obdélníku a textu. Pomocí vrstev a zásobníků lze kombinovat nakreslené objekty do složitějších tvarů.

Závěr

Knihovna Artisan je použita např. v generátoru wallpaperů. Koncept zásobníků, vrstev a historie je při kreslení bitmapové grafiky velmi užitečný a myšlenka zjednodušení přístupu k canvasu zapouzdřením do jednoduchých funkcí může být v některých situacích vhodná.

Bohužel při použití nemusí všem vyhovovat přístup k vrstvám a zásobníkům přes indexy – mnohem vhodnější by bylo přistupovat přes objekty.

Komentáře

Odebírat
Upozornit na
guest
1 Komentář
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře
MyOwnClone

Diky za clanek,
nedavno jsem si zkousel v Canvasu napsat takovou jednodussi hru a Canvasovske API mi moc nevyhovovalo. Zda se ze Artisan vetsinu mych problemu primo resi. Jen se chci zeptat, nema pouziti Artisanu vetsi dopad na vykon? Precijenom u JS her je kazde FPS dobre…

Cesta URL: co se děje, než se načte webová stránka

Když do adresního řádku prohlížeče napíšete webovou adresu a stisknete Enter, spustí se fascinující řetězec procesů, které propojují váš počítač s celým světem. Od překladu doménového jména na IP adresu, přes navázání šifrovaného spojení, až po vykreslení každého pixelu na obrazovce - to všechno se odehraje během zlomků sekundy. Pojďme se podívat, co se mezitím děje pod kapotou webu.

Stav SIMD v Rustu v roce 2025

Různé
Komentáře: 1
SIMD - neboli Single Instruction, Multiple Data - znamená, že procesor může jednou instrukcí zpracovat více datových prvků najednou. Typicky to znamená, že místo sčítání dvou čísel přičtete dvě sady čísel paralelně. To může přinést výrazné zrychlení například při zpracování obrazu, audia nebo numerických výpočtů. Pokud již SIMD znáte, tato tabulka je vše, co budete potřebovat. A pokud s SIMD teprve začínáte, tabulku pochopíte do konce tohoto článku