Written by Legolas Luglio 16, 2014, 11:02:00 am20854 ViewsRating: 0 (0 Rates)Print
Come si è potuto constatare dalla puntata precedente, lavorare sui background è davvero semplice. La libreria libnds ci mette a disposizione un numero incredibile di funzioni e procedure che coprono qualsiasi aspetto relativo alla gestione dei layer, dal movimento allo zoom, dalla priorità alle rotazioni. Ed è appunto di rotazioni e zoom che ci occuperemo nel prossimo esempio.
Per prima cosa occorre cambiare la modalità dello schermo, perché il Mode 0 non gestisce rotazioni e zoom sui background. Potremmo usare, per esempio, il Mode 5, che permette di gestire due background di tipo text e due di tipo extended rotation. Vediamo subito il codice di esempio, che non varia poi molto da quanto già visto:
program Mode5_a;
{$L build/wood.o}{$mode objfpc}uses
ctypes, nds9;
const
woodTilesLen = 16448;
woodMapLen = 2048;
woodPalLen = 512;
var
woodTiles: array [0..0] of cuint; cvar; external;
woodMap: array [0..0] of cushort; cvar; external;
woodPal: array [0..0] of cushort; cvar; external;
var
bg3: integer;
x: integer = 256;
zoomOut: boolean = true;
const
angle = 64;
begin
videoSetMode(MODE_5_2D);
vramSetBankA(VRAM_A_MAIN_BG);
bg3 := bgInit(3, BgType_ExRotation, BgSize_ER_256x256, 0, 1);
bgSetScroll(bg3, 128, 128);
bgSetCenter(bg3, 128, 128);
dmaCopy(@woodTiles, bgGetGfxPtr(bg3), woodTilesLen);
dmaCopy(@woodMap, bgGetMapPtr(bg3), woodMapLen);
dmaCopy(@woodPal, BG_PALETTE, woodPalLen);
whiletruedobeginif x = 128then zoomOut := true;
if x = 512then zoomOut := false;
if zoomOut then
inc(x)
else
dec(x);
bgSetScale(bg3, x, x);
bgRotate(bg3, angle);
swiWaitForVBlank();
bgUpdate();
end;
end.
Come al solito, scorriamo insieme le righe di codice più significative.
[32]: Dopo le solite impostazioni e dopo avere attivato il Mode 5, impostiamo il background 3 che ruoteremo e scaleremo.
[34-35]: Centriamo il background nello schermo e impostiamo il punto di rotazione in modo tale che sia al centro dell'immagine (provate a giocare con i valori per vedere come varia la rotazione).
[51]: Effettuiamo lo zoom, utilizzando lo stesso valore di x, in modo tale da avere uno zoom proporzionato. Cambiando i due valori è possibile ottenere anche un effetto stretching sul background. La funzione che si occupa dello zoom è
bgSetScale(id: cint; sx, sy: cint32);
che richiede come parametri il background da zoomare (id) e il livello di zoom orizzontale e verticale (sx, sy). Un valore pari a 256 indica che non c'è nessuno zoom; un valore inferiore ingrandisce il background (128 indica un fattore di zoom di 2X) e un valore superiore rimpicciolisce il background (512 indica un fattore di zoom di 1/2X). Da notare che nei background (extended) rotation la tilemap non viene ripetuta, come accade invece nei background di tipo text.
[52]: La rotazione di un background può essere effettuata in due modi, utilizzando una delle funzioni
Queste due funzioni non sono equivalenti. Infatti, in bgRotate la rotazione è cumulativa, quindi è sufficiente passare un valore costante come parametro e l'angolo di rotazione viene incrementato di quel valore ad ogni frame. bgSetRotate non è cumulativa, quindi ad ogni frame il valore dell'angolo viene riportato a 0.
Esiste poi una funzione che si occupa di ruotare e scalare un background in un sol colpo:
Legolas registered at Italian community of Lazarus and Free Pascal on Ottobre 18, 2011, 11:43:22 am and has posted 366 posts in the boards since then. Last visit was Novembre 03, 2022, 07:43:11 pm.
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.