Vai al contenuto

Recommended Posts

Ciao a tutti, dopo un contest che mi ha visto fuori per colpa della mia pocochezza di ram, mi sono dato a vere follie.

In un primo momento mi sono messo a studiare il c++ mio acerrimo nemico, per realizzare una mod di soldier of fortune II, ma dopo svariati tentativi, e non poche complessità. Il Q3 engine è davvero potente, ma è un incubo !

Lunedì 26, giorno del mio compleanno ho preso in mano XNA, e giù duro a pestar la testa contro il muro.

Ora in 4 giorni di prove ho ottenuto il mio primo risultato, e devo dire che la cosa è discretamente esaltante.

Perchè ho deciso di scrivere tutto questo ???

Qualcuno al tempo aveva il pallino di voler fare un video gioco. Bene non mollare ora qualcosa si può fare.

che cosa serve ?

L'ambiente di sviluppo / e framework xna

che trovate qui : http://msdn2.microsoft.com/en-us/xna/default.aspx

se c'e' ancora qualche problema che ancora non è stato sistemato con il c# express vi conviene fare il download della iso.

( vi installerà senza possibilità di scelta xna game studio, c# express, msdn for xna e un sql server )

Buone conoscenze della programmazione a Oggetti con C#

Non preoccupatevi non c'e' nulla di difficile, e l'help di microsoft ( per una volta ) è davvero esaustivo.

Buone doti di fortuna nel trovare documentazione

Si in tanti hanno scritto qualcosa, ma ogni uno ha fatto di tutto per creare qualcosa di complesso e poco gestibile,

o quanto meno poco riutilizzabile da parte di niubbi !

UN EXPORTER per il vostro programma di modellazione

un semplice ".X" exporter

Portandovi un esempio semplice...

Create una nuova soluzione di tipo Microsfot Game ( ho riso per 5 min )...

Aggiungete una cartella alla soluzione chimata :

content

Aggiungete una cartella a content chiamata :

models

Aggiungete una cartella a content chiamata :

textures

Bene ora createvi una texture (in potenza di due ) ( 512px*512px andrà benissimo ) con il vostro

programma di grafica preferito.

Salvatevela nella cartella textures del progetto fatto prima come

MAPPA.PNG

Fatto ?

Bene ora prendete il vostro modellatore preferito, fate una bella sferetta.

Fatto ??

Applicate la textures MAPPA.PNG

Fatto ??

Dai fin qui è semplice...

Ora esportate il modello della sfera nella cartella models del progetto come

sphere.x

Faaaaatto anche questo ??

Abbiamo quasi finito giuro ..

Ritorniamo sul progetto quello che abbiamo aperto prima ci posizioniamo sulla cartella

models (tasto destro SELEZIONA ADD EXISTING ITEM ) aggiungiamo la nostra spera

stessa cosa per la textures

DAI DAI DAI CHE MANCA SEMPRE MENO ...

Ok ora dovreste trovare una classe chiamata GAME1.cs

prendete la mia .. e buttate via la sua..

#region inclusione delle librerie

using System;

using System.Collections.Generic;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Content;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Storage;

#endregion

namespace PlanetRolling

{

public class planetRoll : Microsoft.Xna.Framework.Game

{

GraphicsDeviceManager graphics;

ContentManager content;

private Model Planet;

private Vector3 Position = Vector3.One;

private float Zoom = 400;

private float RotationY = 0.0f;

private float RotationX = 0.0f;

private Matrix MyWorldRotation;

// costruttore

public Game1()

{

// crea il colui che gestira la grafica

graphics = new GraphicsDeviceManager(this);

// crea colui che gestira i content

content = new ContentManager(Services);

}

protected override void Initialize()

{

base.Initialize();

}

protected override void LoadGraphicsContent(bool loadAllContent)

{

if (loadAllContent)

{

//nop

}

// carico il modello sphere.x

Planet = content.Load<Model>("content\\models\\Sphere");

}

protected override void UnloadGraphicsContent(bool unloadAllContent)

{

if (unloadAllContent == true)

{

content.Unload();

}

}

protected override void Update(GameTime gameTime)

{

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

this.Exit();

// RICHIAMO LA LOGICA DI ROTAZIONE

UpdateRoll();

base.Update(gameTime);

}

protected override void Draw(GameTime gameTime)

{

graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

// disegno il mio pianeta

DrawModel(Planet);

base.Draw(gameTime);

}

private void DrawModel(Model m)

{

Matrix[] transforms = new Matrix[m.Bones.Count];

float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;

m.CopyAbsoluteBoneTransformsTo(transforms);

Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);

Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 50.0f, Zoom), Vector3.Zero, Vector3.Up);

foreach (ModelMesh mesh in m.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

effect.EnableDefaultLighting();

effect.View = view;

effect.Projection = projection;

effect.World = MyWorldRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);

}

mesh.Draw();

}

}

private void UpdateRoll()

{

Position.X = 0.0f;

Position.Y = 0.0f;

RotationY -= 1.0f;

RotationX = 5.0f;

MyWorldRotation = Matrix.CreateRotationX(MathHelper.ToRadians(RotationX)) *

Matrix.CreateRotationY(MathHelper.ToRadians(RotationY));

}

}

}

Ora non vi resta che fare il vostro primo PLAY !!!

bhe questo è il primo esempio .. e spero mi aguro di poter fornire qualcosa di più e non si sa mai che questa volta

un gioco tutto per me riesco a farmelo ..

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
mi iscrivo perchè sono interessato

Benvenuto .. scaricati l'ambaradan, ci vuole un po di tempo, ma credimi i risultati, nel loro piccolo gasano.

Mia moglie è tre giorni che vede palline che ne fanno un po di tutte i colori !! eh eh eh !!

Programmi o è solo curiostità ?

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ed eccomi ancora qui .. allora ci siete riusciti ?? avete ottenuto la vstra pallina che ruota ??

come al solito mi dimentico di fare le presentazioni.

Sono di Milano mi chiamo Fabio, allo stato attuale ricopro sono un Development Manager ( che figata sto nome e quanto me la meno ). Mi occupo prevalentemente di organizzazione / gestione / analisi / sviluppo.

Per me la programmazione a oggetti è stata un illuminazione... Questo mini escursus, non vi porterà a realizzare

DOOM 5 ne tanto meno UT 3007, si tratterà di breve resoconto di quello che ho imparato da lunedì a oggi !!

E prometto che a breve posto anche un immaginetta di quel che sono riuscito a combinare.

cmq!!

proseguiamo con alcune preziose info !!

Perchè vi ho fatto mettere la Textures nella cartella che abbiamo creato nel progetto ??

per pura comodità ??

NO.

Il .x è un file di testo che se volte potete aprire con un Notepad piccolo a piacere.

se avete modo di aprirlo troverete appunto una serie di informazioni, a voi inutili ma tanto importanti per DirectX, che

le legge e le converte in cose ancor più incomprensibili.

sta il fatto che troverete ( in quest'ordine ) :

template XSkinMeshHeader

template VertexDuplicationIndices

template SkinWeights

Frame Scene_Root

FrameTransformMatrix

Frame Sphere01

FrameTransformMatrix

Mesh ( un botto di coordinate ) SONO I VOSTRI VERTICI ( bhe vostri, della sfera )

.

. c'e' qualcos'altro ma non lo elenco !!

.

MeshMaterialList

Material

TextureFilename { [percorso della textures] }

Ecco finalmente dove volevo arrivare...

Se avete fatto tutto per filo e per segno scoprirete che i .x si portano dietro quest' informazione.. che non è compilata,

non è chi sa che cosa è una stringa ..

Questo che cosa implica ?

Supponiamo di avere creato il nostro piccolo applicativo che fa tante belle cose (na palla che ruota...) che abbiamo fatto

il nostro set up e l'eventuale cd/dvd di installazione.

Ora se in textureFilename c'e' il percorso "c:\documenti\PippoPelo\Progetti\ruffo\Non VA\burpo.png", vorrebbe dire

che l'utente finale dovrebbe avere lo stesso percorso contenente la stessa immagine... per poter visualizzare la

nostra pallina !!

comprendete che la cosa non è proprio elegante !!

Certo anche il nostro primo tentativo non è dei più corretti .. ma non vi preoccupate a tutto c'e' risposta...

Quando andremo a creare la nostra distribution includermo anche le due cartelle e sistemeremo i percorsi in modo

da renderli assoluti rispetto al gioco.. tipo lasciandoli sul CD/DVD..

Ma per tutto questo manca ancora molto !!

non vi vedo felici di portare na palla ad un amico vero D303!!

a presto con l'immagine !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

demosv1.jpg

ed eccomi qui con tre pallette, texturizzate da pianeti !!!

direi che come primo passo ci siamo ...

------------------------------------------------------------------------------------------------------------------------------------------

Mi permetterei di introdurre qualche cenno sull'approccio alla programmazione a oggetti, anche se non so se si tratti dell'ubicazione corretta. tuttavia ritengo opportuno creare un linguaggio comune a tutti quelli che seguono questo

discorso !

CHIUNQUE SI SENTISSE DI CORREGGERMI ... LO FACCIA LIBERAMENTE. A volte uso delle terminologie, maccheroniche

e quindi posso incappare in vari errori. Non abbiate paura a dirmi che ho scritto una boiata, non ho la presunzione

di essere un vero GOTA.

partiamo da una base semplice

Che cosa è una classe in C#.

class Esempio

{

// costruttore

public Esempio()

{

}

}

Eccola .. è una classe che non fa nulla ma ci introduce a un po di informazioni interessanti ..

class >> definizione

Esempio >> Nome Della Classe

public Esempio() costruttore

in ogni classe ( in quasi tutte a dire il vero ) esiste almeno un costruttore, che a tutti gli effetti

è colui che si occupa di costruire ( in memoria la classe )

class Esempio1

{

private int _ValoreEsempio;

public int ValoreEsempio

{

get { return _ValoreEsempio;}

set { _ValoreEsempio = value ;}

}

public Esempio1()

{

}

public Esempio1()

{

_ValoreEsempio= 1;

}

public Esempio1(int ValoreEsempioIniziale)

{

_ValoreEsempio= ValoreEsempioIniziale;

}

}

Non c'e' il caso di spaventarsi .. no non ancora.

Questa seconda classe è più o meno come la prima ma analizzandola c'e' un qualcosa in più :

abbiamo una proprietà.

ValoreEsempio

Una proprietà non è altro che un "qualcosa" che definisce la nostra classe, un attributo, per fare un

ulteriore esempio il colore di una macchina !

Questa proprietà è pubblica il che implica che possa essere vista anche da altre classi, ma temo

che lo spiegherò più avanti.

private int _ValoreEsempio;

è privato ed in questo caso è visibile solo all'interno della classe stessa.

public Esempio1()

{

}

costruttore vuoto, non fa praticamente nulla

public Esempio1()

{

_ValoreEsempio= 1;

}

costruttore pieno assegna in fase di creazione a _ValoreEsempio 1

public Esempio1(int ValoreEsempioIniziale)

{

_ValoreEsempio= ValoreEsempioIniziale;

}

costruttore pieno con parametro di creazione ...

in fase di creazione delle classe è possibile indicare uno o più parametri, in

questo caso _ValoreEsempio viene riempito con ValoreEsempioIniziale

Supponiamo di mantener viva Esempio1 .. e di creare

class Esempio2

{

Esempio1 Esempio ;

public Esempio2()

{

}

public void CreaEsempio1()

{

Esempio = new Esempio1(7);

}

}

Che cosa abbiamo fatto ???

Una classe può ( e generalmente se l'abbiamo scritta è perchè deve) essere usata all'interno della nostra

applicazione.

In questo caso

Esempio2 USA Esempio1 come sua proprietà ossia Esempi1 è una definizione di Esempio2.

Esempio1 Esempio ;

Questa scrittura definisce il tipo della classe "Esempio1 è il tipo" Esempio è il nome della variabile.

public void CreaEsempio1()

{

Esempio = new Esempio1(7);

}

é un metodo VUOTO (void) che CREA Esempio utilizzando il costruttore con parametri ..

Ci siamo ??

Bene questa prima introduzione permetterà a chi ne mastica poco, o di essere ancora più confuso, di iniziare

a provare a creare le sue classi e capire come funzionano.

La curiosità in questo ambito è davvero importante.

------------------------------------------------------------------------------------------------------------------------------------------

Se non ritenete importanti questi passaggi ditemelo, anche se non credo che quealche ripassino possa far male...

Molte volte servono anche a chi lavora da 10 anni ..

Attendo qualche altro post.. se c'e' qualche domanda e ci sono rispondo .. se no ci si aggiorna lunedì !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ti seguo, non ho ancora fatto dei test, perchè manca il tempo, ma ti seguo, ti chiedo sia per me che per coloro che possono avvicinarsi a questo argomento, magari di postare, anche dei file, magari il progetto o la solution che stai spiegando, qualche file .x o qualche mappa, o uno zip con la cartella completa e l'eseguibile così uno vede capisce meglio qual'è il risultato finale e si fa prendere oppure lascia perdere. Spero d'essermi spiegato.

Comunque :Clap03: bravo perchè ti giudico un pioniere sopratutto qui in treddi.com che vuole unire grafica e programmazione sperando e pensando ad un gioco usando C#!! davvero complimenti :Clap03: :Clap03: :Clap03:

Spero di trovare del tempo per sperimentare seguendo i tuoi consigli, ciao e buon weekend :)

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Eccomi buon inizio settimana a tutti !!

Saluto Sepultura ( ho seguito il gruppo musicale per anni anche soul Fly) raccolgo la tua idea, di postare uno zip contenente le soluzioni anche se per il momento non so proprio dove infilare lo Zip.. eh eh eh eh !!

cmq.

Torniamo ancora su qualche breve cenno di C# e sulla programmazione a oggetti, anche perchè alcune informazioni diventano basilari.

Oggi pensavo di mettere giù un po di grammatica fatta per esempi

int i = 0;

int i;

Queste sono due dichiarazioni, anche se semplici in realtà nascondono delle differenze, e non poche direi.

Con la prima dicitura (int i = 0; ) indichiamo al compilatore che abbiamo creato una variabile i di tipo intero

( numeri senza virgola , e non valori alfanumerici ) che nasce inizializzata a 0;

Con la seconda (int i; ) definiamo implicitamente che i = null.

L'altra volta avevamo parlato di costruttori .. proseguiamo a parlarne

int i = new int();

Se ben notate un intero è visto come una classe che ha il suo costruttore , a volte può essere utile esplicitarlo

a volte no, dipende da cosa dobbiamo fare.

int i; non usa il costruttore

int i = 0; non usa il costruttore

int i = new int() usa il costruttore

Facendo vari esempi :

int i = 1;

string strCasa = "mia casa";

float G = 6.67f

Bene come si confrontano due valori ??

con il costrutto

If then else che molto banalmente vuol dire

se ( condizione ) è VERA

allora ( fai questo )

al contrario ( fai quest'altro )

if ( i == 0 )

{

// azioni varie

}

else

{

// altre azioni

}

in un esempio concreto descriviamo un ciclo che va da 1 a 10 quando raggiungiamo il 5

faremo qualcosa !!!

string raggiunto5 ="";

for (int i =0; i<=10; i++)

{

if (i ==5)

{

raggiunto5 = "si";

}

else

{

raggiunto5 ="no";

}

}

Spiegazioni varie

for ( int i = 0 ...

Il costrutto for consente di ciclare per un numero fisso (noto) di volte.

for (int i=0; i<=10;i++)

vuol dire cicla per i che va da 0 a 10 incrementando i di una unita ( i++);

Ci sono molti modi di programmare, questo è "orribile..." ma mi serve appunto per mostrarvi come ottenere

con due tipi di scritture diverse lo stesso codice.

bool flgRaggiunto5 = false;

for (int i=0;i<11;i++)

{

if (i ==5)

{

flgRaggiunto5 = true;

}

Credo mi auguro spero nel pomeriggio di poter andare avanti un po, direi che c'e' ancora un bel po da

spiegare, ma penso di aver già dato una piccola infarinata sufficiente per muovere i primi passi, nell'

ambito della programmazione !!

saluti a chi mi segue.. e a chi non ancora !

se il mini corso non vi serve ditemelo che passo oltre !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
..se il mini corso non vi serve ditemelo che passo oltre !!

Al limite uno cambia topic se non ti vuole leggere.

Al tuo posto non mi sarei messo a spiegare la programmazione ad oggetti ne tantomeno il C#,

sulla rete si trovano libri, tutorial, forum su questi argomenti mentre sull'XNA c'è molto poco.

Anche io Sabato ho istallato XNA e C# express e mi sono messo a smanettare seguendo l'help.

Ho quindi costruito un oggettino con la sua texture ed il tutto messo nel file .x, poi continuando

a seguire l'esempio ho inserito le funzioni per la rotazione e la sub di input.

Ho compilato e vedendo apparire il mio oggettino navigare nel vuoto ho preso un gamepad per vedere

se ruotava. Nulla! Mi sono messo in debug ma il mio pc non rileva nessun input dalle periferiche di gioco.

Ho provato con Joystick, gamepad, thrumaster niente!!!

Ho letto la documentazione e mi sembra di capire che la periferica di gioco pad è solo per Xbox, il pc deve utilizzare o mouse o tastiera.

Questo si che sarebbe un bel limite. Possibile?

Forse bisogna utilizzare le directInput ma non avranno conflitti con XNA?

Insomma lascia perdere il C# e la programmazione ad oggetti e cerca di muovere le tue palle :)))

intendo quelle che renderizzi nel tuo esempio.

a presto.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

In questo momento sto cercando di fare una cosa un po più complessa rendere un animazione.. il che sembra davvero impossibile... documentazione sugli animationChannel sembrano non esistere... per GIOVE !

per l'imput effettivamente ho notato che c'e' davvero qualche problema... ossia

Bisogna creare due gestori di imput differenti, meglio ancora sarebbe creare due applicazioni Differenti una PC e una XBOX.

il problema sta nel fatto che i controller sono gestiti diversamente.

Tornando all'esempio della pallina per muoverla serveno:

nella declaration part

// ti servirà per gestire lo stato della tastiera.

KeyboardState oldState;

int Zoom = 500;

nella public [nomedeltuogioco] // nel costruttore

oldState = Keyboard.GetState();

Nella Update(GameTime gameTime)

dopo l'if di verifica stato gamepad

UpdateInput();

Quindi copiati questa funzioncina

private void UpdateInput()

{

KeyboardState newState = Keyboard.GetState();

if (newState.IsKeyDown(Keys.Up))

{

//nop

}

else if (oldState.IsKeyDown(Keys.Up))

{

// boccia s'avvicina

Zoom++;

}

if (newState.IsKeyDown(Keys.Down))

{

//nop

}else if (oldState.IsKeyDown(Keys.Down))

{

// boccia si allontana

Zoom--;

}

oldState = newState;

}

Se hai l'esempio paro paro .. quello spiegato da MS .. dovresti avere

una funzione simile a questa :

public void Draw()

{

Matrix[] transforms = new Matrix[lPlanet.Bones.Count];

float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;

lPlanet.CopyAbsoluteBoneTransformsTo(transforms);

Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);

Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 50.0f, Zoom), Vector3.Zero, Vector3.Up);

foreach (ModelMesh mesh in lPlanet.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

effect.EnableDefaultLighting();

effect.View = view;

effect.Projection = projection;

effect.World = mtxRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);

}

mesh.Draw();

}

}

Tu cambiala così :

public void Draw(int iZoom )

{

Matrix[] transforms = new Matrix[lPlanet.Bones.Count];

float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;

lPlanet.CopyAbsoluteBoneTransformsTo(transforms);

Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);

Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 50.0f, iZoom), Vector3.Zero, Vector3.Up);

foreach (ModelMesh mesh in lPlanet.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

effect.EnableDefaultLighting();

effect.View = view;

effect.Projection = projection;

effect.World = mtxRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);

}

mesh.Draw();

}

}

Se non va fammelo sapere... io ho provato e con la tastiera va...

come avrai notato lo zoom non è altro che lo spostamento della CAMERA .. e non dell'oggetto. !! bello bello vero tse tse!!!

Non ho provato i PAD.. perchè non ho la XBOZ!!


Modificato da thema

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Se non va fammelo sapere... io ho provato e con la tastiera va...

come avrai notato lo zoom non è altro che lo spostamento della CAMERA ..

Non ho provato i PAD.. perchè non ho la XBOZ!!

Purtroppo sono in ufficio e le prove le posso fare soltanto a casa... uhmmm...

Sono sicuro che rotazioni, zoom funzionano ma il mio dubbio era sulla periferica di gioco del PC.

Hai inserito il codice per catturare la tastiera che sono sicuro anche questo funziona ma senza Joystick, Gamepad e similari non si può fare nessun gioco, nemmeno su PC!

Quindi per me è prioritario risolvere l'input da periferiche di gioco poi andrò avanti con il 3D.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

mmm... il mouse.. ti fa proprio schifo schifo ???

devo fare un po di prove anch'io .. e come hai già accennato si per un gioco in 3d sono tante le cose che servono

i controlli

le textures

i modelli

Diciamo che più siamo prima arriviamo ad una solouzione, il bello è proprio questo sherare info, che in sto momento

mancano un po per tutti !!

buon cibo !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Facendo un po di ricerche ho trovato questo link....

http://dtxna.spaces.live.com/PersonalSpace.aspx?_c02_owner=1

il soggetto in questione sta cercando di animare un oggetto .x che contiene una serie di Frame.

Ha postato un sorgente, con un suo pseudo motore per la lettura delle animazioni

che trovate qui.

http://dtxnablog.googlepages.com/home

il prototipo funziona con un suo modello, ma se provate da bravi ad aggiungere un vostro modello ..

avrete il brutto risultato del vostro modello fermo...

sto cercando di capire che cosa non funziona e al più di proporre un mio motore...

per il momento vi saluto ancora !!

xiu!

Chiunque riuscisse potrebbe postare l'esito ?? grz!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Giornata abbastanza cruciale per me oggi ... Devo dire che è stata dura, ma sono arrivato ad un paio di risultati

molto molto molto interessanti...

Partiamo dall'inizio

in XNA, per quel che concerne le mie prove, ogni oggetto fa riferimento ad una sua scena.

Questo implica che se dobbiamo disegnare tre sfere come nel mio caso otteniamo tecnicamente tre scene,

ogniuna con la sua camera, ogniuna con la sua luce, ( fatta eccezione con i default light )

Questo non è piacevole, quanto meno rende molto complessa la creazione di SCENE complesse. L'esempio tipico

è un ambientazione 3d "una stanza". Che probabilmente ( per dove sono arrivato ) dovrà essere costruita da un

solo piano.

Questo come sopra non è piacevole, costringe ad una modellazione precisa. non ci saranno spazi fra edge vari,

dato che si tratta di estrusioni di poligoni.. ma i pesi dei modelli probabilmente potrebbero diventare eccessivi !

Ok non ci rattristiamo troppo ! Questa non è la brutta notizia.

Animation Accessories ...

Belle ste due parole ma sono come un tarlo nella testa, ronza e da fastidio parecchio.

Se avete fatto delle prove di animation vi sarete ben resi conto che di Help e che Tutorials, c'e' veramente poco,

e quel poco è non è sempre comprensibile....

C'e' qualcuno l'esmpio che ho postato io che ha ben pensato di costruirsi un Accessorio per la lettura dei frame,

e sfruttarne il VertexTraformation, questo IMPLICA necessariamente un'ottima conosenza di quello che si sta

facendo !

Ma il punto e che non esiste un descrittore concreto di Ms, (xna) per la lettura/conversione del TimeFrame...

ed è per questo che la documentazione non c'e' .. o non ci sono tanti esempi.

Morale

se dobbiamo animare un modello, o ci attacchiamo e tiriamo fortissimo, o ci conviene munirci di pazienza

e spulciare il riga per riga il contenuto di un file o .X o .FBX.

AL fine unico di leggere e salvarci la variazione dei vertici in base a quanto stabilito nella nostra animazione.

Tuttavia c'e' una pratica più masochistica, che è quella di leggere il modello .X o Fbx. senza animazione

tramite le martice dei vertici creare gli spostamenti a nostro piacere....

Sembra bello ma ricordate che cosa ho detto prima ??? Ogni oggetto a una sua scena, e se sposto i vertici di

quell'oggetto si saranno spostati in modo assoluto o relativo ??

AHI ME RELATIVO ALLA SCENA.

Certo che se Ms pensa di rendere le cose facili distribuendo xna, bhe non c'e' prorpio riuscita .. dire che sVISTA..

saluti !

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Bene lasciamo quanto abbiamo pensato e scritto fino ad oggi, per iniziare a scrivere qualcosa di davvero interessante.

Parliamo di Screen ..

Supponiamo un gioco così costituito

Schermata di presentazione

Schermata di Selezione Iniziale

Schermata di Selezione Secondaria

Schermata di Gioco

La Presentazione

Si tratta di una parte fissa tipo

un header (parte alta) // Titolo del gioco

un footer (parte bassa) // Copyright o specifiche varie a vostro gusto

un content (parte centrale) // animazione // filmato avi o similari

La Selezione Iniziale

un header (parte alta) // Titolo del gioco

un content (parte centrale) selezione di :tipo di gioco // personaggio // nome del giocatore //

Verosimilmente anche un pulsante per accedere alla Selezione Scondaria

La Selezione Secondaria

un header (parte alta) // Titolo del gioco

un content (parte centrale) selezione di :opzioni grafica, opzioni audio, e via così

La schermata di Gioco

un content ( rappresentazione del gioco stesso )

Se analizziamo bene i tre tipi di schermate ci si rende conto che sono sicuramente simili per struttura,

ma differenti per contenuti, ed è quindi possibili ricondurli ad un unico tipo schermata.

public class tScreen

{

// l sta per local

// anche se il private

private ContentManager _l_content;

private SpriteBatch _l_spriteBatch;

private string _HeaderImage;

private string _ContentImage;

private string _FooterImage;

public string HeaderImage {get{return _HeaderImage;} set{_HeaderImage = value;}}

public string ContentImage {get{return _ContentImage;} set{_ContentImage = value;}}

public string FooterImage {get{return _FooterImage;} set{_FooterImage = value;}}

// builder (PIENO)

public tScreen (ContentManager _content, SpriteBatch _spriteBatch)

{

_l_content = _content;

_l_spriteBatch =_spriteBatch;

}

private void DrawHeader()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

_l_spriteBatch.Draw(content.Load<Texture2D>(_HeaderImage, new Vector2(0.0f,0.0f), null, Color.White);

_l_spriteBatch.End();

}

private void DrawFooter()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

// modificare le coo di vector2 in base alla posizione

_l_spriteBatch.Draw(content.Load<Texture2D>(_FooterImage, new Vector2(0.0f,0.0f), null, Color.White);

_l_spriteBatch.End();

}

private void DrawContent()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

// modificare le coo di vector2 in base alla posizione

_l_spriteBatch.Draw(content.Load<Texture2D>(_ContetImage, new Vector2(0.0f,0.0f), null, Color.White);

_l_spriteBatch.End();

}

public void Draw()

{

//

DrawHeader();

DrawContent();

DrawFooter();

}

}

Proseguo dopo il cibo !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Scusate ma il cibo è il cibo ..

Nella fase precedente abbiamo scritto una classe( con qualche errore dato che lo scritta in questo editor ) che sommariamente descrive uno Oggetto di tipo tScreen.

Abbiamo visto la presenza di tre proprietà

_HeaderImage

_FooterImage

_ContentImage

Con i loro metodi di rappresentazione.

DrawHeader

DrawContent

DrawFooter

Tuttavia anche se tutto questo sembra abbastanza esaustivo, non ci consente di essere davvero dinamico, e non

solo si può incappare nel Fatto che le 4 tipologie di schermi che dobbiamo rappresentare possano avere

Differenti aspetti.

Supponiamo che la header della schermata Selezione Iniziale, tramite un immagine, indichi al giocatore in che

schermata si trovi... e supponiamo quindi che Selezione Secondaria Faccia la stessa cosa ma con un altra immagine...

Sembra un problema ma non lo è.

Proviamo a ragionare per Astrazione.

Immaginiamo di definire qualcosa che sia si di tipo tScreen, ma che Debba per forza essere esteso.

Ossia tScreen darà la definizione è una ulteriore classe si occuperà di fare effettivamente il vero lavoro.

Tuttavia tScreen conterrà comunque il codice di base...

Per fare un esempio:

un bicchiere è un contenitore

una bottiglia è un contenitore

Il primo ha una capienza diversa dal secondo, ha una forma diversa dal secondo, e in molti casi ha anche un materiale diverso dal secondo.

MA E' SEMPRE UN CONTENITORE !!

e per farne un altro ..

una Ferrari è una macchina

una Panda è una macchina...

Ora riuscite bene a comprendere le non troppo sottili differenze fra la prima e la seconda.. ma entrambe sono

macchine.

Quindi veniamo a noi con la classe nuova di pacca fiammante ..

public abstract class tScreen

{

private ContentManager _l_content;

private SpriteBatch _l_spriteBatch;

private string _HeaderImage;

private string _ContentImage;

private string _FooterImage;

public string HeaderImage { get { return _HeaderImage; } set { _HeaderImage = value; } }

public string ContentImage { get { return _ContentImage; } set { _ContentImage = value; } }

public string FooterImage { get { return _FooterImage; } set { _FooterImage = value; } }

public tScreen(ContentManager _content, SpriteBatch _spriteBatch)

{

this._l_content = _content;

this._l_spriteBatch = _spriteBatch;

}

public virtual void DrawHeader()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

_l_spriteBatch.Draw(_l_content.Load<Texture2D>(_HeaderImage), new Vector2(0.0f,0.0f), null, Color.White);

_l_spriteBatch.End();

}

public virtual void DrawFooter()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

// modificare le coo di vector2 in base alla posizione

_l_spriteBatch.Draw(_l_content.Load<Texture2D>(_FooterImage), new Vector2(0.0f,0.0f), null, Color.White);

_l_spriteBatch.End();

}

public virtual void DrawContent()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

// modificare le coo di vector2 in base alla posizione

_l_spriteBatch.Draw(_l_content.Load<Texture2D>(_FooterImage), new Vector2(0.0f,0.0f), null, Color.White);

_l_spriteBatch.End();

}

public virtual void Draw()

{

//

DrawHeader();

DrawContent();

DrawFooter();

}

}

Come avete notato ( ho corretto gli orrori che avevo commesso prima ) ho aggiunto il modificatore

ABSTRACT alla classe e

VIRTUAL ai suoi metodi

che cosa si intende con Abstract ?? Semplice qualcosa di Astratto, non concreto, non finalizzato.

che cosa si intende con Virtual ?? Che quel metodo verrà ESEGUITO solo se non è stato OVERRIDATO !!

Ma veniamo alla nostra classe di concreta che eredita quella astratta !

public class realScreen : tScreen

{

private string _HeaderImageSessionText;

public string HeaderImageSessionText { get { return _HeaderImage; } set { _HeaderImage = value; } }

public realScreen(ContentManager _content, SpriteBatch _spriteBatch)

: base(_content, _spriteBatch)

{

}

public override void DrawFooter()

{

throw new Exception("The method or operation is not implemented.");

}

public override void DrawHeader()

{

_l_spriteBatch.Begin(SpriteBlendMode.None);

_l_spriteBatch.Draw(_l_content.Load<Texture2D>(base.HeaderImage), new Vector2(0.0f, 0.0f), null, Color.White);

// sistemare la posizione dell'immagine in vector 2

_l_spriteBatch.Draw(_l_content.Load<Texture2D>(base.HeaderImage), new Vector2(10.0f, 100.0f), null, Color.White);

_l_spriteBatch.End();

}

public override void Draw()

{

this.DrawHeader();

base.DrawContent();

base.DrawFooter();

}

}

Che cosa è successo ???

Abbiamo creato un classe realScreen che eredita tScreen

Aggiunge una sua proprietà ..

HeaderImageSessionText

E arriviamo al vero godimento ..

public override void DrawHeader()

Override che bel termine .. questo modificatore ci consente di riscrivere il metodo in oggetto, e di indicare

al compilatore che sarà questa nuova versione ad essere usata.

Non è semplice da capire ma credetemi non è nemmeno complesso.

Qundi non facciamo altro che prendere il vecchio metodo e riscriverlo per i fatti nostri indicando il nuovo percorso

da seguire.

Bene... Come utilizziamo tutto questo ??

nel metodo DRAW del gioco

public void Draw()

{

realScreen rs = new realScreen(new ContentManager(), new SpriteBatch());

rs.HeaderImage = "[percorso+ nome immagine]";

rs.ContentImage = "[percorso+ nome immagine]";

rs.FooterImage = "[percorso+ nome immagine]";

rs.HeaderImageSessionText = "[percorso+ nome immagine]";

rs.Draw();

}

.. credo per oggi da aver già scritto anche troppo !!

su su partecipate numerosi gente .. accorrette accorrete !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ESPERIMENTO DELL'ULTIMA ORA.....

Per questa prova vi serve :

a ) il vostro modellatore 3d preferito !

b ) Exporter . X

c ) un Notepad / UltraEdit / SciTe un banale editor di testi !!

Aprite il Vostro modellatore e fate un banalissimo CUBO.

Esportatelo in cubo.X

Tornate sul vostro modellatore e prendete il cubo e realizzate un animazione banale di 3 Keyframe

SPOSTANDO SOLO UN VERTICE a vostra scelta

Esportatelo in cuboAni.X

Aprite con Notepad o lo strumento da voi scelto nel punto c) ...

Scorretevelo tutto .. e che cosa notate ???

Che sono perfettamente identici ( posto che abbiate mantenuto la stessa posizione e dimensione ).

Ora fate un altra prova ( io l'ho fatta con 3ds MAX 8 )

Tornate sul vostro modellatore, aggiungete alla scena del cubo una serie di bones (Envelope) tipo questa

bonesol8.jpg

Aggiungete al cubo una Skin e alla skin aggiungete le bones che avete creato !

Create quindi una piccola animazioncina ( 3/4 Frame ) e esportate tutto in

cuboAniBones.X

Ora aprite sempre con il notepad cubo.x e cuboAniBones.x

SORPRESA !!!

Ci sono delle diciture in più !!!

CHIARAMENTE c'e' la dichiarazione delle Bones ( che prima non c'era )

Che troverete come:

Frame Bone1 { di cui è figlia

Frame Bone2 { di cui è figlia

Frame Bone3 {

Ma quanto di più ci interessa e ben altro ..

AnimationKey {

4;

12;

0;16;0.999981,....

160;16;0.999879,....

320;16;0.997232,....

480;16;0.987047,.....

640;16;0.964720,.....

800;16;0.928294,....

960;16;0.879694,....

1120;16;0.824846,....

1280;16;0.772787,....

1440;16;0.734128,....

1600;16;0.719238,.....

16160;16;0.719238,....

}

{ Bone02 }

}

Bene ... la prima domanda è che cosa sono 4 e 12 ??? ( in questo momento non lo so... )

0

.

.

16160 KeyFrame ???

che cosa è il 16 subito dopo il KeyFrame...

So di per certo che queste informazioni rappresentano la nostra animazione, quanto meno l'animazione

della bones...

Quello che mi inquieta e che non vi è traccia della trasformazione de cubo !!

che stia sbagliando ancora qualcosa ???

c'e' qualche anima pia che mi può illuminare ?? GRAZ !!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

... ALTRO ESPERIMENTO, anche se temo che posterò domani l'esito...

Ormai è quasi una settimana che sto litigando con i modelli .x, devo e voglio ottenere un animazione decente, se no che gusto c'e' ... ORMAI e' un blog so post... nessuno mi dice nulla ed io vado avanti per la mia strada !!

Ecco a cosa sono arrivato / imbattuto !!

Si parla di leggere la posizione originale dei vertci presente nell'oggetto .x.

Non so se ve ne siete accorti ma non c'e' alcun modo di reperire le informazioni sui vertici se non spulciando

qua e la durante il vertextrasforming .. e comunque non si ottiene molto.

E peggio ancora quando si ottiene qualcosa di utile... si scopre che

VertexBuffer vb = mesh.VertexBuffer;

byte[] DataVertexBuffer = vb.VertexData;

ma serve a poco !!

perchè

mesh.VerteBuffer.SetData ( DataVertexBuffer ) ;

Da una spiacevole notizia... tipo i dati sono in lettura !!

Leggendo qua è la sulla rete scopro questo codice, e mi rendo sempre più conto di quanta

poca roba sia stata sviluppata per XNA, e di quanto spetti a noi.

In un certo qual modo mi pare pure corretto, ma in un certo altro modo la cosa diventa più che

spiacevole.

A questo punto torna in nostro aiuto un accessorio

Come funziona:

Create una nuova

WindowsGameLibrary

Aggiungete questa classe specificando gli using corretti

Aggiungete questo progetto alla vostra soluzione di gioco !!

Aggiungete qundi la Referenza alla libreriea.

Ora non vedrete grandi cambiamenti se non una soluzione con due progetti !!

Tuttavia selezionate il vostro oggetto.x

E nella finestra delle proprietà ( se non avete cambiato la ide e sotto la finestra dei progetti ), trovate

la voce CONTENT PROCESSOR

Specificate quello che avete creato voi !!

[ContentProcessor]

public class VertexTaggedMesh : ModelProcessor

{

public override ModelContent Process(NodeContent input, ContentProcessorContext context)

{

// this converts the raw loaded data of your model to a form that can be written to

// an instance of the model class

ModelContent model = base.Process(input, context);

foreach (ModelMeshContent mesh in model.Meshes)

{

// Put the data in the tag.

byte[] rawVertexBufferData = mesh.VertexBuffer.VertexData;

mesh.Tag = rawVertexBufferData;

}

return model;

}

}

Quando verrà caricato il vostro modello nella Tag troverete tutti e dico tutti i verti del vostro modello,

certo ora sono più accessibili ..

MA SARANNO MODIFICABILI ???

Bhe credo proprio di no...

Se qualcuno a tempo e voglia provi a crearsi un tipo model partendo dal Model di XNA, per vedere di

OVERRIDARE le proprietà in modo tale da avere la possibiltà QUANTO MENO di modificare i vertici !!

SIGNORI anche per OGGI è TUTTO !

AIUTATM !

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

OK OK ..

il silenzio è un sommo tesoro .. eh eh eh !!

Ma lo zio cerca per voi con tanto affetto !!

Questo link credo mi auguro spero che possa essere ben più che esaustivo !!

http://forums.microsoft.com/MSDN/ShowPost....69&SiteID=1

Ora lo sto studiando appena riesco a smembrarlo per bene, ve lo spiego !!

Si tratta di animazione di un puppet, ben fatto e ben studiato.

C'e un modello FBX e l'importer per le animazione corretto e funzionante.

Se c'e' qualcuno che ha un po di voglia... bhe mi dia pure una mano non mi offendo !!

saluti !

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao :TeapotBlinkRed: io tutta questa baraonda non con xna l'ho fatta con scarsi risultati, (ma un gioco senza audio è fattibile?? no, io so fare audio? no. Da solo non si puo fare, e ho lasciato perdere....)

Cmq io ricordo d'aver usato questo exporter Panda Xporter Tool e questo quando fai l'eportazione da 3dsmax ti chiede se è un'animazione e se vuoi che il file da esportare sia in formato ascci o text, e funzionava :) ciauuu!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

Ciao! Complimenti per l'impegno Thema!

x Per controllare la scena con l'interattivita tramite Joystick e altre periferiche (volanti ,Joypad ecc..):

1) Occorre procedere con la creazione della lista delle periferiche installate e esistenti e collegate.

2) Occorre stabilire un elemento del'insieme delle periferiche trovate e riferirsi al Joystick interessato

3) Occore intercettare in lettura gli Eventi di Joystick_Mosso e di Pulsante_Joystic_Premuto ,

e stabilire le Azioni in risposta agli eventi verificati

una volta trovata la periferica , potrai gestire gli eventi sia analogici che digitali.

x i Key Frame delle DirectX :

I KeyFrame sono dei fotogrammi , ovvero la codifica delle posizioni dei membri di tutto l'oggetto principale (comunemente chiamato Oggetto Radice) e vengono scritte con campi contenenti i valori delle coordinate x,y,z del membro con i rispettivi N_Id(Numeri di Identificazione del membro o dell'oggetto)

pertanto una sequenza in lista di valori rappresenta le posizioni,rotazioni di tutti i membri dell'oggetto in quel fotogramma, da cio' ne deriva che il fotogramma sucessivo abbia valori diversi (se l'oggetto non si è mosso) per poterlo rappresentare con i vertici spostati.

I numeri servono ad indicare i numeri delle Righe e delle Colonne da leggere in Metodo Sequenziale per poter recuperare i valori da assegnare alle variabili di destinazione.

x i Bones

I bones sono Scheletri in cui viene montato virtualmente il volume dell'oggetto ,

in modo da poter controllarne piu' rapidamente la struttura sfruttando il metodo ad albero della classe e accedendo ai membri dell'oggetto per trasformarli , i punti di collegamento tra 1 Ramo dell Albero ed 1 Altro , servono anche per associargli dei vertici da RACCORDARE, quindi occorrerà in Fase Di Modellazione , provvedere a selezionare i vertici di un membro1 ed associarli ai vertici di un membro2 che si trova su un Ramo (meglio se il ramo è immediatamente consecutivo )

Se hai avuto modo di visionare il vecchio tutorial di milkshape , avrai visto l'omino in cui si adattava il volume dell'arto superiore di una gamba su di un ramo e il volume del membro dell' arto basso sul ramo sucessivo, dopo di che avviando l'animazione piegando il ginocchio si otteneva un'animazione di piegamento del ginocchio spigolosa (perchè i volumi ruotano e quindi è come vedere due parallelepipedi o travi appogiate con intersecazione) e per evitare cio' occorre selezionare i vertici estremi dei 2 Membri Congiunti che devono raccordarsi in automatico durante la fase di animazione del piegamento del ginocchio.

[X Altro appena ho tempo rileggo con calma queste 3 pag.]

Nota: Non ho ancora installato Xna e non penso di installarlo ,

ma è come se sapessi già come funziona e come è fatto.

Saluto.


Modificato da DARKTy

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Azz. ci sono quasi non riesco pero a ritirare su un Mio FBX porcapupazza ma come cavolo vanno esportati li salvo me li crea tranquillamente importo il personaggio di esempio di esempio sia in maya che in XNA ma quando si tratta di tirar su nel framework il mio personaggio con la mia animazione nada, rimane li fermo mi guarda.

Vado avanti comunqe non demordo.

Ciao

Ring.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

X Le Animazioni

1) Assicuratevi di aver salvato il file di animazione (oltre a quello di oggetto) e se è richiesto anche il file dello scheletro.

2) Importalo convertito nel formato richiesto

3) Associare il file di animazione al file dell' oggetto caricato nel canale

4) Esguire gli intervalli dell'animazione con la velocità desiderata e all'evento richiesto

Ciauz


Modificato da DARKTy

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×