Iscriviti ora!   
 
Cura-Calvizie.NET  Cura-Calvizie.NET      4) Un RPG in XNA - Classe: giocatore - PARTE... 
 



 Menù

Forum
Chat
Calvizie: domande e...

 Ultimi post forum

Il nuovo film di...
Il nuovo film di Batman... Ma è già...

Portatile da...
i miei per l'università vogliono prendermi...

Virus: non bastano...
spero che qualcuno riesca a darmi qualche...

GRANDE QUESITO SU...
raga secondo voi quali software vanno con...

La città estera più...
La città estera più bella qual è secondo...

Cellulari di ultima...
Ormai con i cellulari è possibile fare di...

Nintendo DS
Nintendo DS, chi cel'ha? Come vi trovate?

Why not...?
Mi è capitato di tornare a fare un giro su...

L'angolo...
perchè non facciamo un piccolo spazio dove...

Caratteri uguali =...
Cosa ne pensate? Vero? E il contrario?...

katori shinto ryu
ciao,volevo far conoscere il katori l'arte...

 


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à

BURLESQUE, LA NUOVA...
Anche in Italia si è ormai affermata una...

Nobody's daughter:...
Tra le tante critiche mosse a una rockstar...

IL "PO" VUOLE...
BASTA. Questa è una dichiarazione di guerra...

Occultismo, plagio...
Secondo le cifre stimate dal Mistero...

L'arte del...
Il mio proposito non è ricordare fatti...

 




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

Web Design by ArcadiA Club

Powered by:
Spazi pubblicitari di alto livello