Veniamo all'aspetto pratico ora. Supponiamo che questo sia il mio personaggio (è Link del gioco "Zelda The Minish Cap") Come vedete le direzioni sono state messe nell'ordine GIU, DESTRA, SINISTRA, SOPRA. Se ora prendiamo l'altezza di quest'immagine, ovvero 240px, e la dividiamo per il numero di animazioni verticali, cioè 4, otteniamo che l'altezza di un frame è 64px. Stessa cosa per la larghezza. Quindi una frame è 64x64px. Se vogliamo far "girare il giocatore" in un'altra direzione come facciamo? Semplice: partendo dalla prima animazione:
GIU = 0 DESTRA = 1 SINISTRA = 2 SU = 3
Assegnati questi valori (che nel codice del programma li troviamo dentro variabili globali nell'enumerazione "Direzione") possiamo passare da una direzione all'altra semplicemente moltiplicando l'altezza di un frame per la direzione: se vogliamo, ad esempio, far girare il personaggio in su, basta impostare: YFrame = SU * 64;
E ritagliare il rettangolo di 64x64px per ottenere una singola immagine
Applicando tutte queste idee e qualche altra cosuccia che estraiamo sempre da queste 2 cose, ecco la classe che ho sfilato. Accetta come costruttore "filename" che è il nome dell'immagine del giocatore che deve essere caricata nel content. using System; using System. Collections. Generic; using System. Linq; using System. Text; using Microsoft. Xna. Framework; using Microsoft. Xna. Framework. Content; using Microsoft. Xna. Framework. Graphics; using RPG_Example. GameEngine; namespace RPG_Example. RPG_Engine { class Giocatore: SpriteBase { public int x = 0; public int y = 0; public int xoffset = 0; public int yoffset = 0; public int direzione = (int) Direzioni. GIU; public int vel_mov = 2; // Costruttore della classe public Giocatore (string filename) { // Crea il FrameData di base base. FrameData = new Rectangle (0, 0, 64, 64); this. Carica (VariabiliGlobali. GameContent, filename); } // Aggiornamento del giocatore private void aggiornaOffset () { if (xoffset! = 0) { if (xoffset < 0) { xoffset - = vel_mov; } else { xoffset + = vel_mov; } if (Math. Abs (xoffset ? vel_mov) > vel_mov) { xoffset = 0; } } if (yoffset! = 0) { if (yoffset < 0) { yoffset - = vel_mov; } else { yoffset + = vel_mov; } if (Math. Abs (yoffset ? vel_mov) > vel_mov) { yoffset = 0; } } } public new void Update (GameTime gameTime) { /* Aggiorniamo la posizione tramite X e Y di questo personaggio * e aggiungiamo alla posizione xoffset e yoffset per il "movimento" */ this. Posizione. X = x * VariabiliGlobali. TileX + xoffset; this. Posizione. Y = y * VariabiliGlobali. TileX + yoffset; // Aggioriamo l'offset aggiornaOffset (); // Aggiorniamo lo sprite base. Update (gameTime); } // Disegniamo il giocatore public void Disegna () { base. Disegna (VariabiliGlobali. SpriteBatch); } // Metodi del giocatore public bool InMovimento { get { if (yoffset! = 0 || xoffset! = 0) { return true; } return false; } } // Gira (cambia direzione) public void Gira (int nuovaDirezione) { direzione = (int) nuovaDirezione; // Adesso modifichiamo il rettangolo da renderizzare a schermo this. FrameData. Y = direzione * this. FrameData. Height; } public void Gira (Direzioni nuovaDirezione) { Gira ((int) nuovaDirezione); } // Movimenti // Muovi fino ad un determinato Tile public void Muovi (int nuovaX, int nuovaY) { xoffset = xoffset + (x ? nuovaX) * VariabiliGlobali. TileX; yoffset = yoffset + (y ? nuovaY) * VariabiliGlobali. TileY; x = nuovaX; y = nuovaY; } // Fai un passo in quella direzione public void MuoveDir (Direzioni direzione) { Gira (direzione); switch (this. Direzione) { case (int) Direzioni. DESTRA: Muovi (x+1, y); break; case (int) Direzioni. GIU: Muovi (x, y+1); break; case (int) Direzioni. SINISTRA: Muovi (x-1, y); break; case (int) Direzioni. SU: Muovi (x, y-1); break; } } } }
Sweet Vengeance della Freank-Expo
Autore: Freank
|
News di attualità
Rapunzel -...
È uscito nei cinema il 3 dicembre (in 2D) il...
Il genio di Nikola...
A lungo rimasto nell'oblio, il nome di...
Grid computing: TU...
Roma, sbarca il grid computing e tutti...
Tanto spazio da...
Il pc viene sempre più spesso utilizzato per...
Il Penny Black. Il...
Il Penny Black è stato il primo francobollo...
|