Iscriviti ora!   
 
Schede Animali  Schede Animali      4) Un RPG in XNA - Classe: giocatore - PARTE... 
 



 Menù

Forum
Chat
Invertebrati
Mammiferi
Pesci
Rettili e anfibi
Uccelli

 Ultimi post forum

Tutto su Leona Lewis
A chi piace Leona Lewis?

nuoto e atletica
seguite i campionati europei di nuoto e...

Il giornalino del...
il giornalino del liceo fa schifo...poletti...

Finchè morte non vi...
E' da un po' che mi pongo questa domanda. Da...

disegnare i manga
conoscete dei programmi decenti per...

Alex360 gallery
Ciao a tutti ragazzi!quì ci sono alcuni dei...

perche l'america
l'america e stata scoperta dopo l'europa...

E se mi piace la...
E se mi piace la ragazza di un altro? Magari...

Che macchina...
Che macchina fotografica avete? Che...

Amico da ritrovare
So che non c'entra molto con i problemi...

Oggetto
ciao a tutti, sono nuova qui ma mi piace...

 


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à

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...

 




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

Web Design by ArcadiA Club

Powered by:
Spazi pubblicitari di alto livello