Creare Videogiochi - Game Developer
irrlicht 1.7 - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Altri Programmi per la Creazione di Videogames (https://www.making-videogames.net/giochi/Forum-Altri-Programmi-per-la-Creazione-di-Videogames)
+--- Forum: Irrlicht Engine (https://www.making-videogames.net/giochi/Forum-Irrlicht-Engine)
+--- Discussione: irrlicht 1.7 (/thread-irrlicht-1-7)



irrlicht 1.7 - puorcunicu - 18-10-2010

ciao a tutti, sono nuovo in questo forum: ho bisogno di aiuto!!! ho un progetto che ho iniziato tempo fa (2008) però ora non funziona piu dovuto al fatto che ho una nuova versione di irrlicht e che ora lavoro su windows 7 invece che xp. quindi volevo chiedere a qualcuno se mi potesse aiutare per favore a scrivere un progetto dove possa importare oggetti statici ( .obj .dmf )
personaggo che si muove a secondo dei comandi e come impostare una camera che segua il personaggio. per essere più chiaro vorrei fare una cosa tipo: http://www.youtube.com/watch?v=evUd9Us5Zmo&feature=related


grazie mille!!!


RE: irrlicht 1.7 - Zapetino - 18-10-2010

praticamente un platform con grafica 3d


RE: irrlicht 1.7 - puorcunicu - 18-10-2010

(18-10-2010, 05:13 PM)zapetino Ha scritto: praticamente un platform con grafica 3d

si ma molto più semplice. io ho il paesaggio gli oggetti e il personaggio. tutto in obj o dmf. quello che mi interessa, sarebbe:
1.come posso fare una camera a scorrimento 2d che vada a destra o a sinistra, a secondo di dove vada il personaggio,
2.saper muovere il personaggio a sinistra o a destra,
3.e in fine( questo casomai sarebbe l'ultima cosa) le collisioni per poterlo far saltare sopra qualcosa....chiedo troppo,no?? Big Grin


RE: irrlicht 1.7 - Zapetino - 18-10-2010

no nn chiedi troppo
io del c++ n capisco molto quindi per le altre cose nn so risponderti


RE: irrlicht 1.7 - steve - 18-10-2010

Innanzitutto configuri l'ambiente di sviluppo e installi irrlicht (in caso non l'avessi già fatto) seguendo questa guida: link


Inoltre ti informo che irrlicht per oggetti animati (es. personaggio che cammina) supporta i formati:
B3D files (.b3d, r, skeleton)
Microsoft DirectX (.x, r) (binary & text, skeleton)
Milkshape (.ms3d, r, skeleton)
Quake 3 models (.md3, r, morph)
Quake 2 models (.md2, r, morph)

Mentre per quelli statici (es. ambientazione) supporta i formati:
Irrlicht scenes (.irr, r/w)
Irrlicht static meshes (.irrmesh, r/w)
3D Studio meshes (.3ds, r)
Alias Wavefront Maya (.obj, r/w)
Lightwave Objects (.lwo, r)
COLLADA 1.4 (.xml, .dae, r/w)
OGRE meshes (.mesh, r)
My3DTools 3 (.my3D, r)
Pulsar LMTools (.lmts, r)
Quake 3 levels (.bsp, r)
DeleD (.dmf, r)
FSRad oct (.oct, r)
Cartography shop 4 (.csm, r)
STL 3D files (.stl, r/w)
PLY 3D files (.ply, r/w)

Quindi il tuo personaggio (formato obj o dmf) non potrai farlo camminare a destra e a sinistra, potrai farlo strisciare a destra e a sinistra (direi piuttosto bruttino come effetto). Quindi dovrai convertire il personaggio in un formato in cui irrlicht può riconoscere le animazioni.

Prima di iniziare il programma ho bisogno di sapere se sai un pò di oop.
Se la sai (anche solo una minima base visto la semplicità del programma) te la spiego mettendocene un pò, altrimenti te lo spiego con la programmazione strutturata (quella normale per intenderci, tipo il C).


RE: irrlicht 1.7 - puorcunicu - 19-10-2010

`ciao, grazie per il tuo aiuto!
ti spiego: irrlicht l'ho già installato ( versione 1.7 se devo cambiare versione dimmelo che installo uguale alla tua Big Grin) e dev c++ pure.
per quanto riguarda il tema personaggi: i personaggi con i cicli di animazione ce li ho in .x e tutto quello che ho in obj e dmf oppure irrmesh, è il paesaggio, gli oggetti di collisione statici etc etc.
io sto guardando i tutorial degli esempi che ci sono con irrlicht. non so quale usano. Fai tu io sono disposto a imparare di tutto!!! Big Grin Big Grin

grazie miille!!!


RE: irrlicht 1.7 - Alche - 19-10-2010

non fai prima a costruirti un motore grafico ò.ò




(e mi prendete pure sul serio xD)

apparte gli scherzi aspetta un pochetino e steve saprà esaudire i tuoi mistici problemi <.<


RE: irrlicht 1.7 - steve - 20-10-2010

Premetto che non uso irrlicht (se va bene l'avrò provato per un paio di settimane quando stavo scegliendo l'engine da impararmi) e non sono bravo con la oop quindi ci saranno sicuramente mille modi per farlo meglio di come te lo propongo io.

Pensavo di strutturarlo così:
Una classe principale che gestisce le cose che ci sono in quasi tutti i programmi fatti in irrlicht (inizializza device, video driver, scene manager, ecc...).
Una classe per il player.
Una classe per il mondo.
Poi eventualmente si possono fare altre classi per gestire nemici, gui, input (in caso diventasse scomodo fare tutto nella classe player), ecc...

Per adesso ho fatto solo la classe principale, ho provato a farla abbastanza semplice e minimalista. Volendo è riutilizzabile.

File "Inizializza.h"
Codice:
#pragma once
#include <irrlicht.h>
#include <Windows.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

class Inizializza
{
private:
    IrrlichtDevice* mDevice;
    IVideoDriver* mDriver;
    ISceneManager* mSceneMgr;

public:
    Inizializza(int larghezza, int altezza, bool fullscrn, const wchar_t* titolo);
    ~Inizializza(void);
    
    IrrlichtDevice* RetmDevice(void){ return mDevice; }
    IVideoDriver* RetmDriver(void){ return mDriver; }
    ISceneManager* RetmSceneMgr(void){ return mSceneMgr; }
    
    void Errore(LPCWSTR nomeErrore);
    void Device(int larghezza, int altezza, bool fullscrn, const wchar_t* titolo);
    void Driver(void);
    void SceneMgr(void);
};

File "Inizializza.cpp"
Codice:
#include "Inizializza.h"

Inizializza::Inizializza(int larghezza, int altezza, bool fullscrn, const wchar_t* titolo)
{
    Device(larghezza, altezza, fullscrn, titolo);
    Driver();
    SceneMgr();
}


Inizializza::~Inizializza(void)
{
    mDevice->drop();
}

void Inizializza::Errore(LPCWSTR nomeErrore)
{
    MessageBox(NULL, nomeErrore, L"Errore", MB_OK);
}

void Inizializza::Device(int larghezza, int altezza, bool fullscrn, const wchar_t* titolo)
{
    mDevice = createDevice(EDT_DIRECT3D9, dimension2d<u32>(larghezza,altezza), 16U, fullscrn, false, false, 0);
    mDevice->setWindowCaption(titolo);
    if(!mDevice) Errore(L"mDevice");
}

void Inizializza::Driver(void)
{
    mDriver = mDevice->getVideoDriver();
    if(!mDriver) Errore(L"mDriver");
}

void Inizializza::SceneMgr(void)
{
    mSceneMgr = mDevice->getSceneManager();
    if(!mSceneMgr) Errore(L"mSceneMgr");
}

file "main.cpp"
Codice:
#include <irrlicht.h>
#include "Inizializza.h"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


int main()
{
    Inizializza App(800,600,0,L"Finestra di rendering - gioco puorcunicu"); // (larghezza finestra, altezza finestra, modalità fullscreen on/off, nome finestra)
    while(App.RetmDevice()->run())
    {
        App.RetmDriver()->beginScene(true, true, SColor(255,0,0,0));
        App.RetmSceneMgr()->drawAll();
        App.RetmDriver()->endScene();
    }
    return 0;
}


Analizziamo un attimo:

Classe Inizializza:
  • Le variabili sono tutte private, per richiamarli ho creato un metodo apposta per ogni variabile: RetNomeVariabile()
    Ad esempio RetmSceneMgr() per utilizzare lo scene manager al di fuori dalla classe Inizializza.
    E' consigliabile dichiarare tutte le variabili private e richiamarle come ti ho fatto vedere.
  • Ho creato un metodo per gestire gli errori: Errore(LPCWSTR nomeErrore)
    Questo metodo fa apparire una message box con scritto il nome dell'errore.
    Esempio: Errore(L"mDevice"); farà apparire una messagebox con scritto "Errore" nel titolo e "mDevice" come frase (in questo modo capisci che c'è un errore in mDevice).
  • Un metodo per ogni cosa: device, scene manager, video driver e in futuro altro.

main:
  • Si definiscono gli oggetti, per adesso solo per la classe Inizializza (i parametri sono: larghezza scermo, altezza schermo, fullscreen on/of, nome finestra, poi stà a te decidere se togliere o aggiungere roba (tipo se usare opengl o directx, ecc...)
  • Main loop contenente tutte le cose da fare in ciclo (ho preferito metterlo nel main piuttosto che nella classe Inizializza)


Per adesso appare solo una finestra nera. Quando capisci il funzionamento passo a caricare la mappa e via dicendo.
(il programma lo stò facendo di pari passo con quello che ti spiego, quindi è molto probabile che sarà da ritoccare più e più volte)

Come esercizio per vedere se hai capito più o meno come impostare il programma prova a creare una variabile contenente gli fps.
La variabile dev'essere dichiarata privata in Inizializza e si dev'essere in continua variazione (si deve aggiornare ogni volta).
Per avere gli fps ( http://irrlicht.sourceforge.net/docu/classirr_1_1video_1_1_i_video_driver.html#a5b71428402c0b6a3b18b8f2fa408af13 ) se fosse in Inizializza dovresti fare mDevice->getFPS();

Se c'è qualcosa che non hai ben capito o hai qualche problema dimmi pure.


RE: irrlicht 1.7 - KillerZ - 20-10-2010

mamma mia steve fai paura O.O


RE: irrlicht 1.7 - Alche - 20-10-2010

e basta ot vedi spam da tutte le parti compreso il mio <.< comunque a steve dovrebbero dargli il premio nobel xD mmh comunque se tu dici endscene quella si ferma e in teoria la telecamera non si muove più oppure si resetta al movimento delle freccie non ho capito bene xD (ANCHE SE LE FRECCIE SONO DA INCLUDERE DOPO SCUSA IL CAPS MA CI è ANDATO DA SOLO <,<)


RE: irrlicht 1.7 - steve - 20-10-2010

Dimenticavo.... il #pragma once credo che esista solo in visual studio (mi pare che evita problemi se includi più volte lo stesso include).

Nel main loop per adesso abbiamo:

beginscene(...) : fa parte del video driver, l'applicazione deve chiamare questo metodo prima di ogni rendering (reference)
drawall() : fa parte dello scene manager, disegna tutti gli scene node (reference)
endscene() : fa parte del video driver, stampa l'immagine renderizzata a schermo (reference)

Per capire un pò meglio il drawall() vi dico che lo scene manager è l'oggetto (nel senso oop) che contiene e gestisce tutti gli scene node.
Uno scene node è un oggetto che contiene e gestisce le mesh e gli sprite (la roba in 2d e 3d se preferite xD), un oggetto (nel senso di grafica) per ogni scene node.


Se qualcuno ha intenzione di impararsi irrlicht a stò punto conviene che si faccia avanti ora (anche con un progetto un pò diverso da quello di puorcunicu). Certo non so quasi niente di irrlicht, però quasi niente è meglio di niente.


RE: irrlicht 1.7 - Jonathan Archer - 21-10-2010

(18-10-2010, 05:18 PM)puorcunicu Ha scritto: 1. come posso fare una camera a scorrimento 2d che vada a destra o a sinistra, a secondo di dove vada il personaggio

Non sarò un esperto di irricht ma ti rispondo secondo le mie conoscenze su dark basic. Non basterebbe avere una posizione Z fissa della cinepresa e invece come coordinate x e y uguali a quelli dell'oggetto in movimento?

Esempio: Posizione personaggio 300,200,0
Posizione cinepresa 300,200,(Posizione Z del personaggio)+100


RE: irrlicht 1.7 - steve - 21-10-2010

(21-10-2010, 07:54 AM)Jonathan Archer Ha scritto:
(18-10-2010, 05:18 PM)puorcunicu Ha scritto: 1. come posso fare una camera a scorrimento 2d che vada a destra o a sinistra, a secondo di dove vada il personaggio

Non sarò un esperto di irricht ma ti rispondo secondo le mie conoscenze su dark basic. Non basterebbe avere una posizione Z fissa della cinepresa e invece come coordinate x e y uguali a quelli dell'oggetto in movimento?

Esempio: Posizione personaggio 300,200,0
Posizione cinepresa 300,200,(Posizione Z del personaggio)+100

A dire il vero è ancora più facile.
Irrlicht utilizza un sistema di nodi gerarchico.

es.
Creo due nodi: nodo_personaggio e nodo_camera (figlio di nodo personaggio)
Muovendo il nodo personaggio muovo anche il nodo camera, ma muovendo muovo camera non muovo il nodo personaggio.


RE: irrlicht 1.7 - Jonathan Archer - 22-10-2010

Come se collegassi la cinepresa al personaggio ma non il personaggio alla cinepresa mi pare di aver capito... Smile


RE: irrlicht 1.7 - Alche - 22-10-2010

quanto siete contorti comunque ora ho capito anche io u.u


RE: irrlicht 1.7 - Jonathan Archer - 22-10-2010

Steve l'ha spiegato in modo contorto ma l'importante è capire xD