Zapewnia lekką abstrakcję renderowania na canvasie dla elementów HTML5 <canvas>. Moduł:
RenderState)Zapewnia podstawowe prymitywy rysowania:
Ten moduł ma na celu uproszczenie typowych operacji konfiguracji i renderowania 2D na canvasie.
Tworzenie → Aktualizacja → Zniszczenie
createRenderState(canvasId).drawCircle, drawRect, drawLine, drawText) są wywoływane w każdej klatce lub zawsze wtedy, gdy potrzebne są aktualizacje wizualne.clear() może zostać użyte do wyzerowania canvasa przed ponownym rysowaniem.resize() jest wywoływane automatycznie.Ten moduł nie zapewnia jawnej funkcjonalności czyszczenia.
Zarejestrowany nasłuchiwacz zdarzenia zmiany rozmiaru pozostaje aktywny przez cały czas życia strony. Jeśli wymagane jest zachowanie związane ze zwalnianiem zasobów, należy zaimplementować dodatkową logikę usuwającą nasłuchiwacz.
interface RenderStateReprezentuje środowisko renderowania.
| Właściwość | Typ | Opis |
|---|---|---|
canvas |
HTMLCanvasElement |
Docelowy element canvas. |
ctx |
CanvasRenderingContext2D |
Kontekst renderowania 2D używany do rysowania. |
createRenderState(canvasId: string): RenderStateTworzy i inicjalizuje stan renderowania.
| Nazwa | Typ | Opis |
|---|---|---|
canvasId |
string |
Identyfikator DOM docelowego elementu canvas. |
RenderState
| Warunek | Błąd |
|---|---|
| Nie można znaleźć elementu canvas | Error("Canvas not found!") |
resize(state: RenderState): voidZmienia rozmiar canvasa tak, aby odpowiadał rozmiarowi okna przeglądarki.
| Nazwa | Typ |
|---|---|
state |
RenderState |
window.devicePixelRatio do obsługi wyświetlaczy o wysokim DPI.clear(state: RenderState): voidCzyści cały canvas.
| Nazwa | Typ |
|---|---|
state |
RenderState |
Usuwa całą wyrenderowaną zawartość z canvasa.
drawCircle(state, x, y, radius, color): voidRysuje wypełniony okrąg.
| Nazwa | Typ | Opis |
|---|---|---|
state |
RenderState |
Stan renderowania. |
x |
number |
Współrzędna X środka. |
y |
number |
Współrzędna Y środka. |
radius |
number |
Promień okręgu. |
color |
string |
Kolor wypełnienia. |
drawRect(state, x, y, width, height, color): voidRysuje wypełniony prostokąt.
| Nazwa | Typ | Opis |
|---|---|---|
state |
RenderState |
Stan renderowania. |
x |
number |
Współrzędna X lewego górnego rogu. |
y |
number |
Współrzędna Y lewego górnego rogu. |
width |
number |
Szerokość prostokąta. |
height |
number |
Wysokość prostokąta. |
color |
string |
Kolor wypełnienia. |
drawLine(state, x1, y1, x2, y2, color, lineWidth?): voidRysuje odcinek linii.
| Nazwa | Typ | Opis |
|---|---|---|
state |
RenderState |
Stan renderowania. |
x1 |
number |
Początkowa współrzędna X. |
y1 |
number |
Początkowa współrzędna Y. |
x2 |
number |
Końcowa współrzędna X. |
y2 |
number |
Końcowa współrzędna Y. |
color |
string |
Kolor obrysu. |
lineWidth |
number |
Opcjonalna szerokość linii. Domyślnie 1. |
drawText(state, text, x, y, color, font?): voidRysuje tekst na canvasie.
| Nazwa | Typ | Opis |
|---|---|---|
state |
RenderState |
Stan renderowania. |
text |
string |
Treść tekstu. |
x |
number |
Pozycja X tekstu. |
y |
number |
Pozycja Y linii bazowej tekstu. |
color |
string |
Kolor tekstu. |
font |
string |
Deklaracja czcionki CSS. Domyślnie "16px sans-serif". |
Moduł skaluje canvas przy użyciu:
const dpr = window.devicePixelRatio || 1;
Zapewnia to, że wyrenderowana zawartość wygląda ostro na wyświetlaczach Retina i innych wyświetlaczach o wysokiej gęstości pikseli.
Canvas utrzymuje dwa oddzielne rozmiary:
Wewnętrzna rozdzielczość pikselowa
canvas.width
canvas.height
Wizualny rozmiar CSS
canvas.style.width
canvas.style.height
Wewnętrzna rozdzielczość jest mnożona przez współczynnik pikseli urządzenia, podczas gdy rozmiar CSS odpowiada wymiarom obszaru widoku.
Po zmianie rozmiaru transformacja kontekstu jest resetowana:
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
Pozwala to operacjom rysowania nadal używać logicznych współrzędnych ekranu zamiast ręcznego skalowania wartości.
Wszystkie funkcje pomocnicze rysowania operują bezpośrednio na współdzielonym CanvasRenderingContext2D przechowywanym w RenderState. Nie jest utrzymywany żaden graf sceny, buforowanie ani śledzenie obiektów.
import {
createRenderState,
clear,
drawCircle,
drawRect,
drawLine,
drawText
} from "./render";
const render = createRenderState("game-canvas");
function frame() {
clear(render);
drawRect(render, 50, 50, 200, 100, "#4caf50");
drawCircle(render, 200, 200, 40, "#2196f3");
drawLine(render, 100, 100, 300, 200, "#ffffff", 2);
drawText(render, "Hello Canvas", 50, 300, "#000");
requestAnimationFrame(frame);
}
frame();
<canvas>CanvasRenderingContext2Dwindow przeglądarkiwindow.devicePixelRatiorequestAnimationFrame()fillRect, arc, fillText, stroke)