Skip to main content.

Articoli

Un completo videogioco 3D può essere scritto facilmente in C# interfacciandosi direttamente con le DirectX e creare o manipolare oggetti 3D in modo non troppo oneroso.

Occorre innanzitutto possedere nozioni di modellazione 3D per creare delle mesh, cioè degli insiemi di vertici colorati opportunamente in numero tale da creare un oggetto 3D. Questo può essere fatto con la grande varietà di strumenti grafici, quali 3D Studio Max, Maya o altro.

Grazie a questi strumenti verranno creati del file con estensione .x che potranno essere importati da un programma scritto in C#.

La base per la creazione di un videogioco in C# sfruttando le DirectX si può trovare facilmente, ma alcuni particolari del game engine possono non essere di così facile reperibilità.

Tools di riferimento: C# fornito da Visual Studio 2005, DirectX 9.0 SDK

Descrizione del funzionamento
L'applicazione descritta è composta da un file contenente il main chiamato Program.cs. Viene creato automaticamente da Visual Studio quando si desidera creare una nuova applicazione basata su un Form. Il Form è la finestra base dell'applicazione, ed è possibile in modo molto facile aggiungere controlli o proprietà in modo visuale.
Il programma descritto in Program.cs semplicemente crea un'istanza del Form e la fa girare rinfrescando ad ogni ciclo gli elementi grafici.

Nel nostro esempio, il loop del main chiama un metodo Render() specificato in Form.cs.

Il programma vero e proprio è nel codice associato al Form. È diviso in tre blocchi principali: il blocco di inizializzazione, il loop del gioco, nella parte in cui gli elementi grafici vengono invalidati, per poter essere aggiornati nei cicli successivi.

I membri privati della classe Form sviluppata constano in alcuni oggetti particolari: si osserva un oggetto di tipo Device, altri di tipo Mesh, Material e Texture. L'oggetto Device è quello che permette al programma di accedere alla scheda grafica e viene inizializzato successivamente con vari parametri che descrivono l'utilizzo dell'hardware video.
L'oggetto Mesh contiene le informazioni sulle mesh grafiche, cioè sul insieme di vertici che costituiranno tutti gli oggetti tridimensionali che verranno visualizzati nel videogioco. Inoltre la classe Mesh contiene molti metodi utili per la gestione degli oggetti 3D durante il loop del gioco. Gli oggetti di tipo Material e Texture contengono informazioni riguardanti i colori dei vertici degli oggetti tridimensionali, le proprietà di rifrazione della luce, le caratteristiche della superficie ed eventuali immagini decorative da applicare sulle forme 3D.

Gestione delle collisioni
Esistono vari modi per gestire le collisioni tra varie Mesh; il più semplice è quello di costruire delle sfere attorno agli oggetti su cui si vuole effettuare il controllo di collisione. Questa avviene semplicemente quando la distanza tra i centri delle due sfere è minore della somma dei raggi.
Un metodo alternativo a quello di costruire dei rettangoli attorno alle mesh da controllare, e stabilire se qualche punto appartenente a un rettangolo appartiene anche all'altro rettangolo.
Il metodo utilizzato in questo caso non poteva e essere uno dei due precedenti a causa del fatto che il terreno di gioco è costituito da una sola mesh e comprende sia il piano stradale che tutti gli ostacoli presenti, gli edifici, gli oggetti posti sulla strada eccetera.
In questo caso è stato necessario fare ricorso al metodo Mesh.Intersect che fornisce informazioni utili sulla mesh e viene colpita da una linea retta posizionato opportunamente all'interno dell'ambiente. Questo è il metodo utilizzato in gran parte dei videogiochi in cui si vuole osservare la collisione di un proiettile con un bersaglio, perché riesce a fornire informazioni sulla distanza e sulla faccia della mesh colpita.
Il metodo deve essere chiamato dall'oggetto di tipo Mesh con cui si presume che avverrà la collisione, si forniscono il punto di partenza e la direzione della retta (raggio) che si vuole osservare, e si estrapolano informazioni riguardanti il numero e le coordinate baricentriche della faccia colpita, e la distanza dall'origine del raggio.
Il controllo sulle collisioni viene implementato quindi in questo modo: vengono creati quattro raggi

Impostazione della modalità FULLSCREEN
Non si trova facilmente in rete la spiegazione dei settaggi necessari a visualizzare un a applicazione a schermo intero; occorre configurare in modo opportuno il dato PresentParams passato al costruttore del Device, cioè dell'oggetto necessario ad interagire con la scheda grafica.

PresentParameters presentParams = new PresentParameters();
presentParams.BackBufferCount = 1;
presentParams.BackBufferWidth = 800;
presentParams.BackBufferHeight = 600;
presentParams.BackBufferFormat = Format.R5G6B5;
presentParams.Windowed = false;
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.PresentationInterval = PresentInterval.Immediate;
presentParams.AutoDepthStencilFormat = DepthFormat.D16;
presentParams.EnableAutoDepthStencil = true;


Nascondere il cursore del mouse
Occorre semplicemente chiamare un metodo contenuto nella classe System.Windows.Forms:

System.Windows.Forms.Cursor.Hide();

^ TOP

Risorse

click here to go to the Visual Studio Express download page