HTML5 Canvas Cvičení 6 Z8144 Počítačová grafika v kartografii Jaro 2019 Šimon Leitgeb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Ukázky HTML Canvas Definice Canvas Ukázky HTML Canvas http://www.effectgames.com/demos/canvascycle/ http://www.sinuousgame.com/ https://lab.hakim.se/trail/03/ http://kennethjorgensen.com/blog/2014/canvas-trees – zmáčkněte F5 https://mario5.florian-rappl.de/#menu Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Ukázky HTML Canvas Definice Canvas Definice Canvas const DRAW_CANVAS = document.getElementById("draw"); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Kreslení Canvas const DRAW_CANVAS = document.getElementById("draw"); const DRAW_CONTEXT = DRAW_CANVAS.getContext("2d"); DRAW_CONTEXT.fillRect(25, 25, 200, 60); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference .getContext("2d")? A co 3d? Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference .getContext("2d")? A co 3d? → WebGL Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference .getContext("2d")? A co 3d? → WebGL Trochu jiný vesmír … Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Obdélníky DRAW_CONTEXT.rect(x, y, width, height) DRAW_CONTEXT.fillRect(x, y, width, height) DRAW_CONTEXT.strokeRect(x, y, width, height) DRAW_CONTEXT.clearRect(x, y, width, height) Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Barvy – fill, stroke DRAW_CONTEXT.fillStyle = "#rrggbb"; DRAW_CONTEXT.strokeStyle = "#rrggbb"; Nastaví barvy pro další kreslení. Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Fill – příklad const DRAW_CANVAS = document.getElementById("draw"); const DRAW_CONTEXT = DRAW_CANVAS.getContext("2d"); DRAW_CONTEXT.fillStyle = "#ff0000"; DRAW_CONTEXT.fillRect(25, 25, 200, 60); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Stroke – příklad const DRAW_CANVAS = document.getElementById("draw"); const DRAW_CONTEXT = DRAW_CANVAS.getContext("2d"); DRAW_CONTEXT.strokeStyle = "#00ff00"; DRAW_CONTEXT.strokeRect(25, 25, 200, 60); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Clear const DRAW_CANVAS = document.getElementById("draw"); const DRAW_CONTEXT = DRAW_CANVAS.getContext("2d"); DRAW_CONTEXT.fillStyle = "#ff0000"; DRAW_CONTEXT.fillRect(25, 25, 200, 60); DRAW_CONTEXT.clearRect(50, 50, 75, 75); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Obdélníky Barvy – fill, stroke Clear Reference Reference http://www.w3schools.com/tags/ref_canvas.asp http://diveintohtml5.info/canvas.html Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol beginPath Kruh 1. úkol Canvas Path fill() stroke() beginPath() moveTo() closePath() lineTo() clip() quadraticCurveTo() bezierCurveTo() arc() arcTo() isPointInPath() Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol beginPath Kruh 1. úkol beginPath https://www.w3schools.com/tags/canvas_beginpath.asp const DRAW_CANVAS = document.getElementById("draw"); const DRAW_CONTEXT = DRAW_CANVAS.getContext("2d"); DRAW_CONTEXT.beginPath(); DRAW_CONTEXT.lineWidth="5"; DRAW_CONTEXT.strokeStyle="green"; DRAW_CONTEXT.moveTo(0,75); DRAW_CONTEXT.lineTo(200,75); DRAW_CONTEXT.stroke(); DRAW_CONTEXT.beginPath(); DRAW_CONTEXT.strokeStyle="purple"; DRAW_CONTEXT.moveTo(50,0); DRAW_CONTEXT.lineTo(50,110); DRAW_CONTEXT.stroke(); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol beginPath Kruh 1. úkol Kruh const DRAW_CANVAS = document.getElementById("draw"); const DRAW_CONTEXT = DRAW_CANVAS.getContext("2d"); const CX = DRAW_CANVAS.width / 2; const CY = DRAW_CANVAS.height / 2; const R = 70; DRAW_CONTEXT.beginPath(); DRAW_CONTEXT.arc(CX, CY, R, 0, 2 * Math.PI, false); DRAW_CONTEXT.lineWidth = 3; DRAW_CONTEXT.strokeStyle = '#000000'; DRAW_CONTEXT.stroke(); DRAW_CONTEXT.fillStyle = 'green'; DRAW_CONTEXT.fill(); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol beginPath Kruh 1. úkol 1. úkol Nakreslete sněhuláka v canvas. Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Click eventy Korektní detekce myši Korektní detekce myši 2 2. úkol 2. úkol – bonus Click eventy const DRAW_CANVAS = document.getElementById("draw"); DRAW_CANVAS.addEventListener('click', function(evt) { const CX = evt.pageX; const CY = evt.pageY; const CANVAS_BOX = DRAW_CANVAS.getBoundingClientRect(); const RX = CX - CANVAS_BOX.left; const RY = CY - CANVAS_BOX.top; alert("CX:" + CX + ", CY:" + CY + " | " + "RX:" + RX + ", RY:" + RY);→ }, false); Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Click eventy Korektní detekce myši Korektní detekce myši 2 2. úkol 2. úkol – bonus Korektní detekce myši viz http://www.quirksmode.org/js/events_properties.html#position function doSomething(e) { let posx = 0; let posy = 0; if (!e) let e = window.event; if (e.pageX || e.pageY) { posx = e.pageX; posy = e.pageY; } else if (e.clientX || e.clientY) { posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; } // posx and posy contain the mouse position relative to the document→ } Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Click eventy Korektní detekce myši Korektní detekce myši 2 2. úkol 2. úkol – bonus Korektní detekce myši 2 function doSomething(e) { … // posx and posy contain the mouse position relative to the document→ const CANVAS_BOX = document.getElementById("draw").getBoundingClientRect();→ const C_POSX = CANVAS_BOX.left + document.body.scrollLeft + document.documentElement.scrollLeft; const C_POSY = CANVAS_BOX.top + document.body.scrollTop + document.documentElement.scrollTop; const RELATIVE_X = POSX - C_POSX; const RELATIVE_Y = POSY - C_POSY; alert(RELATIVE_X + " " + RELATIVE_Y); } Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Click eventy Korektní detekce myši Korektní detekce myši 2 2. úkol 2. úkol – bonus 2. úkol V canvas vytvořte bílou plochu Po kliknutí do plochy se v ní objeví červený kruh s orámováním na pozici myši Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol Click eventy Korektní detekce myši Korektní detekce myši 2 2. úkol 2. úkol – bonus 2. úkol – bonus V canvas vytvořte bílou plochu Po kliknutí do plochy se v ní objeví červený kruh s orámováním na pozici myši V ploše zůstane zobrazeno maximálně 5 kruhů, starší budou postupně blednout Šimon Leitgeb HTML5 Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Základy Canvas Kreslení Canvas Canvas Path Interaktivita v Canvas Domácí úkol 3. úkol 3. úkol Vytvořte 2 verze hry “Tic Tac Toe” Jedna z těchto verzí bude v SVG (+JS) a druhá v HTML5 canvas (+JS) Pravidla viz http://en.wikipedia.org/wiki/Tic-tac-toe Hra nemusí obsahovat „umělou inteligenci“. V tomto případě se „hráči“ střídají. (Jednou po kliknutí křížek, jednou kolečko). Použijte co nejvíce společného JS kódu. 3 týdny na vypracování, 17. konzultační hodina možno získat až 60 bodů úkol odevzdávejte jako jeden HTML soubor nebo archiv .zip 24. 4. JS knihovny, 15. 5. animace? Šimon Leitgeb HTML5 Canvas Díky za pozornost! https://discord.gg/UHTPUDU . . . . . . . . . . . . . . . . . . . .