Home > Altro > Irlicht: Gestione della telecamera con mouse e tastiera e aggiunta del salto

Irlicht: Gestione della telecamera con mouse e tastiera e aggiunta del salto

1.4.1 - La telecamera
Come abbiamo visto all’inizio, la telecamera non è altro che un vettore nello spazio. Ora, se il vettore è fisso, la telecamera giustamente, è fissa, e il personaggio non risulterà muoversi… dovete sapere infatti, che ogni qualvolta giocate a un videogioco, non sono i giocatori a muoversi, ma è la telecamera che [...]

ainos aprile 2009 Scarica in PDF

1.4.1 - La telecamera
Come abbiamo visto all’inizio, la telecamera non è altro che un vettore nello spazio. Ora, se il vettore è fisso, la telecamera giustamente, è fissa, e il personaggio non risulterà muoversi… dovete sapere infatti, che ogni qualvolta giocate a un videogioco, non sono i giocatori a muoversi, ma è la telecamera che si sposta. Se un personaggio muove le gambe, non è detto che si sposti . Come si è potuto notare dagli esempi precedenti, il personaggio corre, ma non va da nessuna parte… Vediamo quindi, come possiamo gestire tutto ciò. Creeremo una telecamera che si muove al movimento del mouse. Per prima cosa, smgr deve venir gestito anche dalla classe MyEventReceiver quindi, inseriamo la seguente riga di codice, dopo i due puntatori fissati inizialmente (quelli prima dell’intestazione della classe). Non è necessario fare una cosa del genere, ma può risultare utile in alcuni casi… Il codice iniziale completo diventa quindi il seguente (dove ISceneManager* smgr = 0 rappresenta il “nuovo codice”)

#include <irrlicht.h>
#include <IEventReceiver.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace gui;
#pragma comment(lib, "Irrlicht.lib")
IrrlichtDevice *device = 0;
IAnimatedMeshSceneNode* node = 0;
ISceneManager* smgr = 0;

Fatto questo, possiamo andare avanti… Dobbiamo per prima cosa modificare il tipo di tasto che usiamo per la corsa… Prima abbiamo impostato la freccia ora, siccome quest’ultima ci servirà per muovere la telecamera, possiamo impostare il tasto C per la corsa e il tasto A per il salto. Creiamoci dunque due variabili booleane: una che ci servirà per gestire l’evento “corsa”, e l’altra che ci servirà per gestire l’evento “salto”:

bool corri = false;
bool salto = false;

iniziamo ora ad entrare nella classe… lasciamo le prime righe di codice invariate fino a quando non entreremo nel ciclo switch, ovvero sia, sino alla riga switch(event.KeyInput.Key)    {.
Cominciamo col cambiare il nostro primo case ove, al posto di case KEY_SPACE, scriviamo

case KEY_KEY_C:

Abbiamo associato la corsa del personaggio alla pressione del tasto C. Lasciamo il resto del codice invariato, sino ad arrivare al nostro break. Dopo questo comando, cancellate tutto il codice relativo (sino al main), e inseriremo un altro case. Stavolta ad agire sarà il tasto A e ci servirà per far saltare il nostro personaggio. Il codice non verrà commentato in quanto totalmente identico al codice che genera la corsa… l’unica cosa che cambiano sono i valore del FrameLoop (che indicano appunto il salto) e la variabile che verrà modificata (che, ironia della sorte, nel nostro caso si chiama salto…)

case KEY_KEY_A:
if ((event.KeyInput.PressedDown) && !salto)
{
     salto = true;
     node->setFrameLoop(520,570);
}
else if ((event.KeyInput.PressedDown == false))
{
     node->setFrameLoop(0,310);
     salto = false;
}
return true;
break;
}
}
return false;
}
};

Possiamo quindi passare ad inserire il nostro nuovo codice dentro il main… Iniziamo coll’effettuare una piccola modifica…
ISceneManager* smgr = device->getSceneManager() diventa

smgr =  device->getSceneManager()

Questo per lo stesso motivo che abbiamo spiegato prima… abbiamo già impostato che smgr punti a ISceneManager all’inizio del programma… ricreare un nuovo puntatore potrebbe creare problemi e/o errori. All’esterno dell’  if(node), eliminiamo la posizione iniziale della telecamera (il codice           smgr->addCameraSceneNode(0, vector3df(40,10,10), vector3df(0,5,0)) e, all’interno del costrutto if, inseriamo il seguente codice. Da notare che, volendo, possiamo accellerare o rallentare la velocità della telecamera, semplicemente inserendo tra le parentesi tonde, una terna di valori (n1,n2,n3). Al variare di n1 e n2, aumenterà o diminuirà la velocità del mouse.

smgr->addCameraSceneNodeFPS();

questo ci ha permesso di gestire la telecamera tramite il mouse e la tastiera. A questo punto, bisogna rendere invisibile il cursore del mouse. Per fare ciò, all’esterno del costrutto if (prima o dopo il codice che crea i bottoni non importa), inseriamo il seguente codice

device->getCursorControl()->setVisible(false);

Anche qua il codice si commenta da solo… setVisible(false) sta ad indicare che il cursore non verrà visualizzato (se impostate true, lo visualizzerete). A questo punto, possiamo disegnare il tutto. Per evitare errore, prima del ciclo while, creiamo due variabili di tipo intero

int ultimoFPS = -1;
int fps = driver->getFPS();

all’interno del while, dopo il comando driver->endScene(); andremo ad inserire il seguente codice

if (ultimoFPS != fps)
{
      ultimoFPS = fps;
}
}

e chiudiamo il tutto lasciando invariato distruggendo i device e uscendo con successo tramite i comandi

device->drop();
return 0;
}

Se alcune cose risultano essere poco chiare, verranno spiegate più nel dettaglio nel prossimo capitolo, dove caricheremo una mappa di Quake 3. “Ma a cosa serve” - vi chiederete voi - “dato che troviamo già tutto fatto negli esempi di Irrlicht?” Non preoccupatevi… modificheremo anche questa mappa, cercando di inserire nuovi personaggi…

Esercizi per casa:
1 - impostare la corsa del personaggio quando viene premuto il tasto destro del mouse e il salto quando viene premuto il tasto sinistro.

Andrea Panetta

  1. Nessun commento ancora...
  1. Nessun trackback ancora...
E' necessario che tu sia collegato per poter inserire un commento.