Iscriviti ora!   
 
Viso Lifting  Viso Lifting      4) Un RPG in XNA - Classe: giocatore - PARTE... 
 



 Menù

Forum
Chat

 Ultimi post forum

Laura Pausini:...
Se l'avete ascoltata almeno una volta,...

Radiofreccia
Vi piace il primo film di Ligabue?...

In che Regno vi...
Ecco le prime descrizione delle...

Il terzo tempo nel...
Come funziona il terzo tempo nel basket? Il...

Programmi per la...
Potreste inserire in questo topic molti...

aFiGoZ: I Miss You
Dove sei???????

Il collante della...
"È la cattiveria il collante che tiene...

Monkey Island...
Forse è gia stata fatta una discussione al...

schermo nero
ciao a tutti, ho un grosso problema,ho un...

La morte di Socrate
Cosa pensate del dilemma della morte di...

Film dell'orrore
Qual è il film dell'orrore che vi ha fatto...

 


4) Un RPG in XNA - Classe: giocatore - PARTE 2


 
4) Un RPG in XNA - Classe: giocatore - PARTE 2

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

 Commenti
LEGGI TUTTI

News di attualità

Nature and Nurture...
Francis Galton, studioso britannico del XIX...

Spunti e spuntini...
Con questo terzo post vi sottopongo un'idea...

L'arco e il teatro...
Orange è una piccola città della Provenza...

Spunti e spuntini...
Continua oggi la rubrica con un'idea direi...

LA CAVALLERIA E IL...
CENNI STORICI SUL...

 




pubblicità | siti partner | regole | visione | diritti | ufficio stampa | donazioni | scrivici
© 1999-2012 - P.IVA 02284690035 - Grafica, layout e contenuti sono di esclusiva proprietà di Viso Lifting.

Web Design by ArcadiA Club

Powered by:
Spazi pubblicitari di alto livello