Úloha 5 – Jednoduchá animace: pohyb čtverce
Úvod do úlohy
Animace dává kresbě život: pohybující se objekt, otáčení, zmenšování či zvětšování. Na <canvas> probíhá animace tak, že opakovaně překreslujeme scénu – při každém kroku upravíme souřadnice (nebo transformaci) objektu a znovu vykreslíme. K tomu slouží requestAnimationFrame(), které spouští plynulé smyčky synchronizované s obnovovací frekvencí displeje. V této části si vyzkoušíte, jak správně mazat předchozí obrázek, měnit polohu a jak používat transformace (translate, rotate, scale) bez „rozbití“ dalších kreslení.
Teorie a principy
-
Animace = opakované překreslování:
-
Vymazat plátno (
clearRect). -
Aktualizovat stav (souřadnice, úhel, měřítko).
-
Vykreslit objekt v nové poloze.
-
Znovu zavolat
requestAnimationFrame(krok).
-
-
requestAnimationFrame(fn): zavolá funkci před dalším překreslením obrazovky → plynulejší nežsetInterval. -
Transformace vs. souřadnice:
-
Souřadnice: kreslíte přímo na konkrétní (x, y).
-
Transformace: dočasně posunou/otočí/škálují souřadnicový systém.
Vždy používejtesave()→ transformace → kreslení →restore(), aby se transformace nelepily na další tvary.
-
-
Mazání:
ctx.clearRect(0, 0, canvas.width, canvas.height)před každým krokem animace. -
Pořadí je klíčové: nejdřív čistíme, pak aktualizujeme stav, potom kreslíme, nakonec plánujeme další snímek.
Praktické příklady kódu
1) Základní animace – pohybující se čtverec (souřadnicemi)
HTML
JavaScript
Co si všímat: při každém snímku nejdřív čistíme (
clearRect), až pak kreslíme novou polohu. Bez mazání by se čtverec „smearoval“ (zanechával stopu).
2) Transformace – rotující obdélník kolem středu
Tady nekreslíme obdélník na absolutní (x, y), ale posuneme souřadnicový systém do středu objektu a pak jej otočíme. Díky save() a restore() nepřenášíme transformace na další kreslení.
Všimněte si: bez
save()arestore()by se rotace a posun kumulovaly i na další kresby a souřadnice by „ulétly“.
3) Kombinace výplně, průhlednosti a mazání části scény (mini-efekt)
Krátká ukázka, jak globalAlpha ovlivní vzhled a jak „vykousnout“ otvor.
Typické chyby / záludnosti
-
Nemazání plátna v každém kroku → vznikají šmouhy a „duchové“ objektů.
-
Zapomenuté
save()/restore()u transformací → transformace se sčítají a rozhodí další kreslení. -
Špatné pořadí operací: změním transformaci až po kreslení nebo aktualizuji stav po vykreslení → objekt reaguje se zpožděním.
-
Přehnaná rychlost: změny souřadnic příliš velké → objekt „skáče“. Začněte malými kroky (např.
+2), pak dolaďte. -
Záměna stupňů a radiánů při rotaci (canvas používá radiány:
Math.PI= 180°). -
Nevhodné rozměry canvasu jen přes CSS → rozmazané vykreslení. Rozměry nastavte atributy
widthaheightv HTML.
Shrnutí
-
Animace na
<canvas>= cyklus srequestAnimationFrame: čistit → aktualizovat → kreslit → požádat o další snímek. -
Souřadnice určují polohu objektu; transformace dočasně mění souřadnicový systém (používejte
save()/restore()). -
clearRectčistíme scénu,translate/rotate/scaleovládáme pohyb, otáčení a měřítko. -
Udržujte správné pořadí volání, malé kroky a radiány pro rotaci.