Plnohodnotné kreslení



Podobné dokumenty
Kreslíme do webu. Canvas

2 Grafický výstup s využitím knihovny

POČÍTAČOVÁ GRAFIKA VEKTOROVÁ GRAFIKA VÍCENÁSOBNÉ KOPÍROVÁNÍ

Knihovna CanvasLib TXV první vydání prosinec 2014 změny vyhrazeny

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Rasterizace je proces při kterém se vektorově definovaná grafika konvertuje na. x 2 x 1

EU peníze středním školám digitální učební materiál

Java aplety. Předávání parametrů z HTML

VÝUKA PČ NA 2. STUPNI základy technického modelování. Kreslící a modelovací nástroje objekty, čáry

Závěrečná práce. AutoCAD Inventor (Zadání D1)

. Grafika a plovoucí prostředí. Zpracování textů na počítači. Ing. Pavel Haluza, Ph.D. ústav informatiky PEF MENDELU v Brně haluza@mendelu.

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

OBSAH. ÚVOD...5 O Advance CADu...5 Kde nalézt informace...5 Použitím Online nápovědy...5. INSTALACE...6 Systémové požadavky...6 Začátek instalace...

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

INFORMATIKA PRO ZŠ. Ing. Veronika Šolcová

9. Práce s naskenovanými mapami

Aplikované úlohy Solid Edge. SPŠSE a VOŠ Liberec. Ing. Jan Boháček [ÚLOHA 27 NÁSTROJE KRESLENÍ]

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Základní vzorce a funkce v tabulkovém procesoru

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

Informatika 6. ročník/9. Malování IV

Řešení úloh z TSP MU SADY S 1

4. cvičení. 15. října 2014

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Projekt Obrázek strana 135

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Registrační číslo projektu: CZ.1.07/1.5.00/ Název projektu: Moderní škola 21. století. Zařazení materiálu: Ověření materiálu ve výuce:

Nástroje v InDesignu. Panel nástrojů 1. část. Nástroje otevřeme Okna Nástroje

CAD_Inventor -cvičení k modelování a tvorbě technické obrazové dokumentace Vytváření výrobního výkresu rotační součásti - hřídele

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Další nutný soubor je laydiv.js, ve kterém jsou uloženy funkce pro zobrazování virů na ploše a funkce pro odkaz na Teachers Guide.

Kreslení a vlastnosti objektů

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Tisk výkresu. Projekt SIPVZ 2006 Řešené příklady AutoCADu Autor: ing. Laďka Krejčí

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Zadejte ručně název první kapitoly. Manuál. Rozhraní pro program ETABS

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Souřadný systém. Obr.: Druhý objekt v otočeném souřadném systému

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Tvorba fotogalerie v HTML str.1

2 Tvorba interaktivních grafických programů

2. Numerické výpočty. 1. Numerická derivace funkce

Výkresy. Projekt SIPVZ D Modelování v SolidWorks. Autor: ing. Laďka Krejčí

Cvičné příklady Hodina 2

Konstrukce součástky

StatSoft Jak vyzrát na datum

Univerzita Palackého. Pedagogická fakulta

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

verze Grafický editor PALSTAT s.r.o. systémy řízení jakosti PALSTAT CAQ 1 Obsah

Comenius Logo. Princip programování. Prostředí Comenius Logo

POČÍTAČOVÁ GRAFIKA VEKTOROVÁ GRAFIKA POKROČILEJŠÍ ČINNOSTI

SPIRIT Nové funkce. SOFTconsult spol. s r. o., Praha

Java - Kresba. 2/28/11 1/8 Java - kresba

Zadání soutěžních úloh

Zobrazování bannerů podporují pouze nově vytvořené šablony motivů vzhledu.

K OZA SE PASE NA POLOVINĚ ZAHRADY Zadání úlohy

Multimediální prezentace MS PowerPoint I

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Algoritmizace a programování

Dokument a jeho části oddíly, záhlaví, zápatí

Výukový manuál 1 /64

Rovnice přímek v rovině

Popis výukového materiálu

Jazyk C# (seminář 9)

Nápověda ke cvičení 5

Prostředí Microstationu a jeho nastavení. Nastavení výkresu

Sada 2 Microsoft Word 2007

DUM 02 téma: Corel - křivky

Úvod do problematiky ÚPRAVY TABULKY

Soukromá střední odborná škola Frýdek-Místek, s.r.o. VY_32_INOVACE_03_IVT_MSOFFICE_02_Excel

Digitální učební materiál

Učebnice pro modeláře Ing. Ivo Mikač 2008

DUM 06 téma: Tvorba makra pomocí VBA

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Obsah. SEZNÁMENÍ S HRAMI V HTML Nové funkce HTML Nové funkce CSS

František Hudek. leden Informační a komunikační technologie ZONER Práce s textem. Tvorba a editace odstavcového a uměleckého textu.

WEB BASED DYNAMIC MODELING BY MEANS OF PHP AND JAVASCRIPT

3.2 3DgrafyvMaple 106 KAPITOLA 3. UŽITÍ MAPLE PŘI ŘEŠENÍ KVADRIK

Software602 Form Designer

2.17 Webová grafika. Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Jiří Hort. Vyrobeno pro SOŠ a SOU Kuřim, s.r.o.

GeoGebra známá i neznámá

Vytvoření a úpravy geologického modelu

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Úloha 1. Text úlohy. Vyberte jednu z nabízených možností: NEPRAVDA. PRAVDA Úloha 2. Text úlohy

Vytvoření tabulky: V následujícím okně si editujete okno tabulky. Vyzkoušejte si viz podklad Cv_09_Podklad_tabulka.xls a Cv_09_Tabulka.dwg.

1. Úvod do obsluhy AutoCADu

1. Průběh funkce. 1. Nejjednodušší řešení

Aplikované úlohy Solid Edge. SPŠSE a VOŠ Liberec. Ing. Aleš Najman [ÚLOHA 28 NÁSTROJE EDITACE ]

Programování v jazyce JavaScript

6. Formátování: Formátování odstavce

Gabriela Janská. Středočeský vzdělávací institut akademie J. A. Komenského

1 MODEL STOLU. Obr. 1. Základ stolu

Funkce, podmíněný příkaz if-else, příkaz cyklu for

MALUJEME. ZÁKLADNÍ VZDĚLÁVÁNÍ, INFORMAČNÍ A KOMUNIKAČNÍ TECHNOLOGIE, 1. STUPEŇ ZŠ. Autor prezentace Mgr. Hana Nová

Informatika 8. třída/6

MAXScript výukový kurz

2D-skicování Tato část poskytuje shrnutí 2D-skicování, které je nezbytné ke tvorbě modelů Solid Works.

Transkript:

Plnohodnotné kreslení KAPITOLA 6 V této kapitole: Odbočka (terminologická): Yak Shaving HTML <canvas> Klíčové slovo this a pseudoprivátní vlastnosti Příprava canvasu a mřížka Buňky a atomy v nich Ostatní soubory Předchozí kapitola nepřinesla žádné velké novoty, je tedy nejvyšší čas pustit se do vylepšování některých aspektů aplikace. Do plné hratelnosti zatím schází podpora pro více hráčů (a tím pádem i možnost umísťovat atomy různé barvy), počítání skóre (jde ruku v ruce s testováním, zdali už někdo vyhrál) a také klíčová herní mechanika exploze těch polí, ve kterých počet atomů překročil kritické množství. Právě tato část bude patrně algoritmicky nejzajímavější, neboť exploze v jedné buňce může snadno odstartovat řetězovou reakci v buňkách dalších. Zároveň se dá ale očekávat, že půjde i o jednu z komplikovanějších komponent aplikace. Odbočka (terminologická) Yak Shaving Ne vždy se chceme do hlavního problému vrhnout po hlavě a prát se s ním tak dlouho, než bude celý vyřešen. Někdy se nám prostě nechce, jindy máme dojem, že před hlavním útokem bude taktičtější chvíli chodit okolo a situaci obhlížet. Třeba si při řešení dílčích a doplňkových úkolů všimneme něčeho zajímavého, možná tak najdeme způsob, jak ten největší rozdělit na menší nebo úplně rozmělnit. Takovému odkládání něčeho velkého se anglicky říká Yak Shaving (stříhání jaků). Nesmíme si tento osobitý termín plést s obyčejnou prokrastinací při ní se věnujeme zcela nesouvisejícím činnostem. U vývojářského Yak Shavingu se stále soustředíme na společný cíl, ale snažíme se věnovat se doplňkovým úkolům, které by klidně mohly počkat. Pro zvídavé: Tento termín vznikl počátkem devadesátých let celkem náhodně v návaznosti na díl animovaného seriálu The Ren & Stimpy Show, ve kterém figuroval Yak Shaving Day coby alterna- 41

KAPITOLA 6 Plnohodnotné kreslení tiva Štědrého dne. Je tedy dost pravděpodobné, že se autor termínu Carlin Vieri 3 nikdy žádného opravdového stříhání jaků neúčastnil. Obrázek 6.1 Jak, nestříhaný. Foto Dennis Jarvis HTML <canvas> Pojďme tedy otázku řetězové reakce ještě chvíli odkládat. Namísto toho můžeme ozkoušet, jak dobře jsme v předchozí kapitole provedli rozdělení kódu na komponenty třeba tím, že zkusíme naimplementovat nějakou estetičtější formu vizualizace. Současné vypisování písmene o je přece nouzové řešení. Pro potřeby kreslení je v jazyce HTML5 k dispozici značka <canvas>. Její vznik se datuje do roku 2004 a jedná se (s ohledem na ostatní HTML prvky) o poměrně revoluční techniku. Pomocí jednoduchého JavaScriptového rozhraní lze do canvasu (přímý překlad plátno se nepoužívá) kreslit velmi obdobně, jako se například maluje v tradičním programu Malování (MS Paint) ve Windows. HTML canvas je tedy rastrová oblast, nad kterou máme přesnou kontrolu až na úroveň jednotlivých pixelů. Tatáž značka se používá také k realizaci technologie WebGL, to jest přístup k hardwarově akcelerovanému vykreslování pomocí jazyka OpenGL ES. Této technice se budeme krátce věnovat až v sedmnácté kapitole; pro naše účely zatím bohatě postačí využívání běžných dvourozměrných rozhraní. 3 http://en.wiktionary.org/wiki/talk:yak_shaving#etymology 42

Klíčové slovo this a pseudoprivátní vlastnosti Pojďme se nejprve podívat, jaké hlavní funkce jsou pro nás k dispozici : getcontext vrací tzv. kontext objekt, na kterém jsou volány všechny následující metody, filltext a stroketext pro kreslení písmen, clearrect, fillrect a strokerect pro kreslení obdélníků, getimagedata a putimagedata pro změnu jednotlivých pixelů, drawimage pro vložení jiného obrázku, sada transformačních funkcí (rotate, scale a dalších), beginpath a souvisejíci funkce pro nakreslení (a volitelně vyplnění) zcela obecné křivky. Nakreslením celé hrací plochy pomocí jediné HTML značky (<canvas>) zcela skryjeme její strukturu pro ostatní komponenty aplikace. To pěkně koresponduje s požadavkem, že o zobrazování by se měla starat jen jedna vyhrazená část aplikace. Přechodem na jinou zobrazovací technologii zároveň otestujeme, jak dobře jsme navrhli API pro komunikaci s komponentou Draw. V ideálním případě bychom vůbec nemuseli měnit signatury veřejných metod, jen jejich implementaci. Pro zbytek aplikace tak bude skutečnost, že jsme změnili vykr eslování, úplně skryta. Klíčové slovo this a pseudoprivátní vlastnosti Při úpravách vykreslovací komponenty Draw zároveň odstraníme jeden z jejích dalších neduhů. Tento objekt obsahuje celou řadu metod a zdá se, že jejich počet budeme dále navyšovat. Přitom způsob jejich volání je nešťastný; když chceme nyní vykreslit jednu buňku, píšeme Draw.atoms(...). Takovéto pevné umístění názvu objektu je nevhodné, protože nám například brání snadnému přejmenování. Také z kódu není na první pohled patrné, že se jedná o naši vlastní metodu (tj. že Draw není nějaká oddělená komponenta). S vyčištěním kódu nám v tomto případě může pomoci klíčové slovo this. Nejprve si ale musíme dobře připomenout, jak klíčové slovo this v JavaScriptu přesně funguje. Jedná se totiž o komplikovanou vlastnost jazyka, která je často pro programátory (zejména ty, kteří přichází z jiných objektových jazyků) notně zavádějící. V případě JavaScriptu není hodnota this známa ve chvíli parsování kódu, ale až ve chvíli jeho vykonání. Představme si tedy velmi triviální funkci f: var f = function() { alert(this); 43

KAPITOLA 6 Plnohodnotné kreslení Dopředu není možné rozhodout, jakou hodnotu bude mít this. Existují k tomu tato pravidla: 1. Při volání vpravo od tečky je this rovno objektu vlevo od tečky. To odpovídá této situaci: var obj = {; obj.f = f; obj.f(); // this == obj 2. Pokud chceme hodnotu this explicitně nastavit, voláme funkci pomocí jejích metod call a apply: var obj = {; f.call(obj); // this == obj f.apply(obj); // this == obj Rozdíl mezi call a apply je v tom, jak takto volané funkci předáváme parametry: u call jako další parametry tohoto volání, u apply ve druhém parametru coby pole. 3. Speciální metoda bind dovoluje z jedné funkce vyrobit funkci druhou, která tu první zavolá s hodnotou this pevně zadanou ve chvíli volání bind. Využití vypadá takto: var obj = {; var g = f.bind(obj); g(); // ve funkci f je this == obj Zajímavé je, že nezáleží na tom, jakým způsobem nově vytvořenou funkci zavoláme. Metoda bind je sice standardní součástí jazyka (od verze ES5), ale dovedli bychom ji zjednodušeně nasimulovat sami: f.bind = function(newthis) { return function() { return f.call(newthis); 4. Pokud nepoužijeme žádný z předchozích způsobů a funkci zavoláme jen prostým zapsáním jejího jména a kulatých závorek, hodnota this je buď undefined (ve striktním režimu), nebo globální jmenný prostor (tj. v prohlížeči window). Touto formou volání se nebudeme hlouběji zabývat, protože nedává smysl chceme-li ve funkci smysluplně využít this, musíme ji volat některým z předchozích zápisů. Zde vidíme i podstatu terminologické nejednoznačnosti: JavaScriptové funkce nikomu nepatří, a tak o nich nelze jednoznačně říci, jestli se jedná o metody v objektovém slova smyslu. Metodami tedy nazýváme ty funkce, které máme v plánu volat pomocí operátoru tečky (a je v nich proto smysluplné použití this). Se znalostí fungování this můžeme veškerá volání v rámci objektu přepsat tak, aby toto klíčové slovo využívala. Ruku v ruce s používáním this jde ale také problematika tzv. 44

Příprava canvasu a mřížka privátních vlastností (a metod). Tyto jsou určeny výhradně k tomu, aby byly používány jen zevnitř objektu, tedy právě pomocí this. Do privátních vlastností ukládáme taková data (a kód), která jsou určena jen pro objekt samotný a ostatní k nim nesmí přímo přistupovat. Situaci komplikuje skutečnost, že JavaScript žádné privátní vlastnosti nemá. Teoreticky je můžeme do jisté míry suplovat pomocí uzávěr a v nejnovější verzi jazyka ES6 je můžeme plnohodnotně nasimulovat pomocí objektu WeakMap. Vždy to bude ale speciální servisní logika navíc; v jazyce jako takovém jednoduše privátní vlastnosti nejsou. V praxi se nicméně často hodí odlišit veřejná a neveřejná rozhraní. My se proto budeme držet jednoduchého pravidla: Ty vlastnosti, jejichž název začíná podtržítkem, budeme považovat za soukromé a pokusíme se k nim přistupovat výhradně pomocí klíčového slova this. Pamatujme ale, že se jedná jen o naše vlastní pravidlo, které interpret jazyka nedokáže automaticky vynutit. Mimochodem, čím více má objekt privátních rozhraní (na úkor těch veřejných), tím lépe se v něm provádějí změny. Při úpravách jeho privátních metod nemusíme brát ohled na případné další komponenty, které s ním spolupracují proto je dobrý nápad definovat všechny metody zpočátku jako privátní a zveřejňovat je až dle potřeby. Příprava canvasu a mřížka Soubor draw.js změnou vykreslovací technologie notně nakyne. Pojďme se na něj tedy podívat po jednotlivých částech. var Draw = { CELL: 60, LINE: 2, ATOM: 7, _context: null ; V objektu Draw definujeme tři konstanty (skutečné konstanty jsou k dispozici až od verze ES6; nám postačí proměnné pojmenované velkými písmeny), kterými řídíme vzhled: velikost jedné buňky, tloušťka čáry, poloměr atomu (vše v pixelech). Do vlastnosti Draw._context uložíme 2D kontext canvasu, používaný pro všechny následné kreslicí operace. /* Výroba canvasu a jeho příprava */ Draw.init = function() { var canvas = document.createelement( canvas ); this.cell += this.line; var size = Game.SIZE * this.cell + this.line; canvas.width = size; 45

KAPITOLA 6 Plnohodnotné kreslení canvas.height = size; this._context = canvas.getcontext( 2d ); this._context.linewidth = this.line; document.body.appendchild(canvas); this.all(); Metoda Draw.init slouží k výrobě canvasu a jeho nastavení. Jeho rozměry jsou dány počtem bu ňek, rozměrem buňky a tloušťkou oddělovací čáry. Hrací plochu chceme také orámovat, takže oddělovacích čar je v každé ose vždy o jednu více než buněk. S ohledem na tloušťku oddělovacích čar (a skutečnost, že jsme namísto opravdových konstant použili jen obyčejné proměnné) můžeme využít malý trik, kterým zvětšíme Game.CELL o Game.LINE. Pro potřeby všech dalších výpočtů se totiž hodí do rozměru buňky zahrnout i její jednostranné orámování. Počet buněk jsme v rámci vylepšování přesunuli z definice hrací plochy (dříve board.js) do konstanty Game.SIZE. Lépe to odpovídá skutečnosti, že se jedná a veřejně užitečnou informaci. /* Vykreslit celou hrací plochu */ Draw.all = function() { this._context.fillstyle = #fff ; var width = this._context.canvas.width; var height = this._context.canvas.height; this._context.fillrect(0, 0, width, height); this._lines(); this._cells(); Vykreslení celé herní plochy je přímočará operace: nejprve celou oblast vyplníme bílou barvou, poté nakreslíme jednotlivé čáry, vposled pak všechny buňky (respektive atomy v nich). Za zmínku stojí, že this._context.canvas odpovídá použité HTML značce <canvas>, nemusíme si ji proto nikde nadbytečně ukládat. /* Vykreslit mřížku */ Draw._lines = function() { this._context.beginpath(); for (var i=0; i<game.size+1; i++) { // svislé var x = this.line/2 + i*this.cell; this._context.moveto(x, 0); this._context.lineto(x, this._context.canvas.height); 46

Buňky a atomy v nich for (var i=0; i<game.size+1; i++) { // vodorovné var y = this.line/2 + i*this.cell; this._context.moveto(0, y); this._context.lineto(this._context.canvas.width, y); this._context.stroke(); Pro oddělovací čáry a orámování využijeme path, tj. obecnou křivku. Ta naše bude sestávat z mnoha úseček: nejprve svislých, poté vodorovných. Jednotlivá volání moveto a lineto sama o sobě nic nevykreslují, pouze definují pohyb virtuálního pera; proto na konci nezapomene zavolat this._context.stroke() pro zobrazení nadefinovné křivky. Buňky a atomy v nich S klíčovým slovem this se nemusíme ostýchat dělit kód na větší množství krátkých funkcí. Pro vykreslení všech buňek tak máme velmi triviální metodu Draw._cells: /* Vykreslit buňky s atomy */ Draw._cells = function() { for (var i=0; i<game.size; i++) { for (var j=0; j<game.size; j++) { this._cell(i, j, Board[i][j]); Následuje metoda pro vykreslení jedné buňky: /* Vykreslit jednu buňku */ Draw._cell = function(x, y, count) { x *= this.cell; y *= this.cell; switch (count) { case 1: this._atom(x + this.cell/2, y + this.cell/2); break; case 2: this._atom(x + this.cell/4, y + this.cell/4); this._atom(x + this.cell*3/4, y + this.cell*3/4); break; case 3: this._atom(x + this.cell/2, y + this.cell/2); this._atom(x + this.cell/4, y + this.cell/4); this._atom(x + this.cell*3/4, y + this.cell*3/4); break; 47

KAPITOLA 6 Plnohodnotné kreslení case 4: this._atom(x + this.cell/4, y + this.cell/4); this._atom(x + this.cell*3/4, y + this.cell*3/4); this._atom(x + this.cell/4, y + this.cell*3/4); this._atom(x + this.cell*3/4, y + this.cell/4); break; V ní nejprve převedeme zadané souřadnice buňky na pixely (v rámci canvasu) tak, že je vynásobíme pixelovou velikostí buňky. Operátor *= je zkratka za = původní hodnota *; klidně si tak přitom přepíšeme hodnoty parametrů x a y. (Na tom není nic špatného; pro každý parametr máme k dispozici zcela obyčejnou lokální proměnnou a smíme ji dle libosti měnit.) Pravidla hry říkají, že v buňce smí být nejvýše čtyři atomy (to je podkritické množství pro buňku mimo okraje plochy); pokud bychom přidali pátý, došlo by k reakci a snížení počtu. Stačí nám tedy rozhodnout o vizualizaci pro jeden až čtyři atomy v buňce. Čeká nás tak poslední kreslicí metoda: /* Vykreslit jeden atom */ Draw._atom = function(x, y) { this._context.beginpath(); this._context.moveto(x+this.atom, y); this._context.arc(x, y, this.atom, 0, 2*Math.PI, false); this._context.fillstyle = blue ; this._context.fill(); this._context.stroke(); Ta přijímá parametry v pixelech a má jediný úkol vykreslit jeden atom. Opět použijeme křivku, tentokráte tvořenou jediným obloukem (anglicky arc) tak velkým, že s ním obtáhneme celou kružnici. Parametry metody arc jsou: střed oblouku (dvě hodnoty), poloměr, počáteční a koncový úhel oblouku, směr (true = proti směru hodinových ručiček; v tomto případě je to jedno). Úhly se zadávají v radiánech, takže naše křivka odpovídá kružnici ano, takto obskurně se v canvasu kreslí kolečko. Křivku pak nejen vyplníme (modrou barvou, this._context.fil l()), ale i orámujeme. K tomu využijeme skutečnost, že výchozí barva orámování je nastavena na černou. 48

Buňky a atomy v nich Obrázek 6.2 Kreslíme atomy do canvasu Výsledek je vizuálně hodnotnější než prostá tabulka z předchozích kapitol. Zbývá veřejná metoda Draw.getPosition, která slouží pro získání informace o souřadnicích ve chvíli klepnutí myší. Zde budeme muset bohužel upravit signaturu, protože předávat aktuální HTML prvek nedává smysl. Ať uživatel klepne kamkoliv na hrací plochu, událost nastane vždy na značce <canvas>. Vhodnější tedy bude předávat spíše souřadnice kurzoru myši: /* Převod pozice kurzoru na souřadnice buňky */ Draw.getPosition = function(cursorx, cursory) { var rectangle = this._context.canvas.getboundingclientrect(); cursorx -= rectangle.left; cursory -= rectangle.top; if (cursorx < 0 cursorx > rectangle.width) { return null; if (cursory < 0 cursory > rectangle.height) { return null; var cellx = Math.floor(cursorX / this.cell); var celly = Math.floor(cursorY / this.cell); return [cellx, celly]; 49