Zapewnia lekki wrapper wokół kontekstu renderowania HTML5 Canvas 2D. Moduł odpowiada za:
RenderState)Oferowanie prostych funkcji pomocniczych do rysowania typowych prymitywów:
Tworzenie → Aktualizacja → Zniszczenie
createRenderState(canvasId).RenderState.Podczas renderowania:
clear().Rysuj prymitywy za pomocą:
drawCircle()drawRect()drawLine()drawText()resize() jest wywoływane automatycznie.Ten moduł nie zapewnia jawnego czyszczenia zasobów.
Klienci, którzy dynamicznie tworzą i niszczą renderery, powinni usunąć zarejestrowany nasłuchiwacz zmiany rozmiaru, jeśli wymagane jest zarządzanie cyklem życia.
RenderStateReprezentuje aktywne środowisko renderowania.
interface RenderState {
canvas: HTMLCanvasElement;
ctx: CanvasRenderingContext2D;
}
| Właściwość | Typ | Opis |
|---|---|---|
canvas |
HTMLCanvasElement |
Docelowy element canvas. |
ctx |
CanvasRenderingContext2D |
Kontekst rysowania 2D używany do operacji renderowania. |
createRenderState(canvasId: string): RenderStateTworzy i inicjalizuje stan renderowania.
| Nazwa | Typ | Opis |
|---|---|---|
canvasId |
string |
Identyfikator DOM docelowego elementu canvas. |
RenderState
Error("Canvas not found!")
Jeśli nie istnieje canvas o podanym identyfikatorze.
resize(state: RenderState): voidZmienia rozmiar canvas tak, aby wypełniał obszar widoku przeglądarki.
| Nazwa | Typ |
|---|---|
state |
RenderState |
window.devicePixelRatio do renderowania w wysokim DPI.clear(state: RenderState): voidCzyści cały canvas.
| Nazwa | Typ |
|---|---|
state |
RenderState |
ctx.clearRect(0, 0, canvas.width, canvas.height);
Usuwa całą wcześniej wyrenderowaną zawartość.
state,
x,
y,
radius,
color
): void`
Rysuje 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. |
state,
x,
y,
width,
height,
color
): void`
Rysuje wypełniony prostokąt.
| Nazwa | Typ | Opis |
|---|---|---|
state |
RenderState |
Stan renderowania. |
x |
number |
Pozycja lewa. |
y |
number |
Pozycja górna. |
width |
number |
Szerokość prostokąta. |
height |
number |
Wysokość prostokąta. |
color |
string |
Kolor wypełnienia. |
state,
x1,
y1,
x2,
y2,
color,
lineWidth?
): void`
Rysuje 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 |
Szerokość obrysu. Domyślnie 1. |
state,
text,
x,
y,
color,
font?
): void`
Rysuje tekst na canvas.
| Nazwa | Typ | Opis |
|---|---|---|
state |
RenderState |
Stan renderowania. |
text |
string |
Zawartość tekstowa. |
x |
number |
Współrzędna X tekstu. |
y |
number |
Współrzędna Y tekstu. |
color |
string |
Kolor tekstu. |
font |
string |
Definicja czcionki canvas. Domyślnie "16px sans-serif". |
Moduł kompensuje wyświetlacze o wysokiej gęstości pikseli poprzez skalowanie bazowej rozdzielczości canvas przy użyciu:
const dpr = window.devicePixelRatio || 1;
Wymiary canvas w pikselach są mnożone przez dpr, podczas gdy wyświetlany rozmiar pozostaje równy rozmiarowi obszaru widoku.
Przykład:
Obszar widoku: 1920 × 1080
DPR: 2
Rozdzielczość canvas:
3840 × 2160
Wyświetlany rozmiar:
1920 × 1080
Zapobiega to rozmytemu renderowaniu na ekranach Retina i innych ekranach o wysokiej gęstości pikseli.
Po zmianie rozmiaru transformacja jest resetowana:
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
Zapewnia to, że funkcje rysowania nadal używają współrzędnych pikseli obszaru widoku zamiast przeskalowanych współrzędnych urządzenia.
Podczas inicjalizacji rejestrowany jest nasłuchiwacz zmiany rozmiaru:
window.addEventListener("resize", () => resize(state));
Za każdym razem, gdy rozmiar okna przeglądarki się zmienia, rozdzielczość canvas i jego wyświetlane wymiary są automatycznie przeliczane.
const render = createRenderState("gameCanvas");
function frame() {
clear(render);
drawCircle(render, 200, 150, 40, "red");
drawRect(render, 300, 100, 120, 80, "blue");
drawLine(render, 50, 50, 250, 200, "white", 2);
drawText(render, "Hello Canvas", 20, 30, "yellow");
requestAnimationFrame(frame);
}
frame();
<canvas id="gameCanvas"></canvas>
HTMLCanvasElementCanvasRenderingContext2Dwindow.devicePixelRatiorequestAnimationFrame()arc, fillRect, lineTo, fillText)