Skip to content

Usare il Contesto di Disegno (Draw Context)

Questa pagina assume che tu abbia guardato la pagina Concetti di Rendering di Base.

La classe DrawContext è la principale classe utilizzata per il rendering nel gioco. Viene usata per renderizzare forme, testi e texture, e come visto in precedente, usata per manipolare leMatrixStack ed i BufferBuilder.

Disegnare Forme

La classe DrawContext può essere usata per disegnare facilmente forme rettangolari. Se vuoi disegnare triangoli, o altre forme non rettangolari, dovrai usare un BufferBuilder.

Disegnare Rettangoli

Puoi usare il metodo DrawContext.fill(...)\` per disegnare un rettango pieno.

java
int rectangleX = 10;
int rectangleY = 10;
int rectangleWidth = 100;
int rectangleHeight = 50;
// x1, y1, x2, y2, color
context.fill(rectangleX, rectangleY, rectangleX + rectangleWidth, rectangleY + rectangleHeight, 0xFF0000FF);

Un rettangolo.

Disegnare Contorni/Bordi

Diciamo che vogliamo fare un contorno al rettangolo che abbiamo disegnato. Possimao usare il metodo DrawContext.drawBorder(...) per disegnare un contorno.

java
// x, y, width, height, color
context.drawBorder(rectangleX, rectangleY, rectangleWidth, rectangleHeight, 0xFFFF0000);

Rettangolo con bordo.

Disegnare Singole Linee

Possiamo usare i metodi DrawContext.drawHorizontalLine(...) e DrawContext.drawVerticalLine(...) per disegnare linee.

java
// Let's split the rectangle in half using a green line.
// x, y1, y2, color
context.drawVerticalLine(rectangleX + rectangleWidth / 2, rectangleY, rectangleY + rectangleHeight, 0xFF00FF00);

Linee

Il Gestore di Forbici (Scrissor Manager)

La classe DrawContext ha uno scrissor manager incluso. Questo ti permette di ritagliare il rendering e confinarlo ad un area specifica. Questo è utile per renderizzare cose come consigli, i altri elementi che non dovrebbero essere renderizzati al di fuori di un'area specifica.

Usare lo Scrissor Manager

TIP

Le regioni Scrissor posso assets annotate l'una dentro l'altra! Ma assicurati di disabilitare lo scrissor manager lo stesso numero di volte che lo abiliti.

Per abilitare lo scrissor manager, semplicemente usa il metodo DrawContext.enableScissor(...). Similarmente per disabilitarlo usa il metodo DrawContext.disableScissor().

java
// Let's create a scissor region that covers a middle bar section of the screen.
int scissorRegionX = 200;
int scissorRegionY = 20;
int scissorRegionWidth = 100;

// The height of the scissor region is the height of the screen minus the height of the top and bottom bars.
int scissorRegionHeight = this.height - 40;

// x1, y1, x2, y2
context.enableScissor(scissorRegionX, scissorRegionY, scissorRegionX + scissorRegionWidth, scissorRegionY + scissorRegionHeight);

// Let's fill the entire screen with a color gradient, it should only be visible in the scissor region.
// x1, y1, x2, y2, color1, color2
context.fillGradient(0, 0, this.width, this.height, 0xFFFF0000, 0xFF0000FF);

// Disable the scissor region.
context.disableScissor();

Regione Scissor in azione.

Come puoi vedere, anche se diciamo al gioco di renderizzare il gradiente attraverso tutto lo schermo, lo renderizza solo nella regione scrissor.

Disegnare Texture

Non c'è un modo "corretto" per disegnare texture su uno schermo, siccome il metodo drawTexture(...) ha tanti diversi overload. Questa sezione coprirà gli usi più comuni.

Disegnare una Texture Intera

Generalmente, è raccomandato usare l'overload che specifica i parametri textureWidth e textureHeight. Questo perché la classe DrawContext assumerà questi valori se non li specifici, che può essere sbagliato a volte.

java
Identifier texture = new Identifier("minecraft", "textures/block/deepslate.png");
// texture, x, y, u, v, width, height, textureWidth, textureHeight
context.drawTexture(texture, 90, 90, 0, 0, 16, 16, 16, 16);

Esempio di tutta la texture disegnata.

Disegnare una Porzione di una Texture

Qui è dove u e v entrano in gico. Questi parametri specificano l'angolo in alto a sinistra della texture da diseganre, ed i parametri regionWidth e regionHeight specificano la dimensione della porzione della texture da disegnare.

Prendiamo questa texture come esempio.

Texture del Libro di Ricette

Se vogliamo solo diseganre una regione che contiene la lante, possiamo usare i seguenti valori per u, v, regionWidth e regionHeight:

java
Identifier texture2 = new Identifier("fabric-docs-reference", "textures/gui/test-uv-drawing.png");
int u = 10, v = 13, regionWidth = 14, regionHeight = 14;
// texture, x, y, width, height, u, v, regionWidth, regionHeight, textureWidth, textureHeight
context.drawTexture(texture2, 90, 190, 14, 14, u, v, regionWidth, regionHeight, 256, 256);

Texture Regione

Disegnare Testo

La classe DrawContext ha vari metodoi auto-esplicatori per renderizzare del testo - per brevità, non verrano coperti qui.

Diciamoc he vogliamo disegnare "Hello World" sullo schermo. Possiamo usare il metodo DrawContext.drawText(...) per farlo.

java
// TextRenderer, text (string, or Text object), x, y, color, shadow
context.drawText(client.textRenderer, "Hello, world!", 10, 200, 0xFFFFFFFF, false);

Disegnare testo