Problem with compiling my Game

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
Depa Marco
Posts: 2
Joined: Sat Mar 12, 2011 9:47 am
Contact:

Problem with compiling my Game

Post by Depa Marco »

Hi to all...
I'm Italian, so sorry for my bad English :D

I use OpenSUSE 11.3, that works with KDevelop 4, for make C++ application...
I compiled fine Irrlicht library and I can include them very well... but, when I try compile the solution:

Code: Select all

CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `drawFrame(irr::video::IVideoDriver*)':
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `drawFrame(irr::video::IVideoDriver*)':
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `disegnaRiferimento(irr::video::IVideoDriver*, float)':
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `disegnaRiferimento(irr::video::IVideoDriver*, float)':
CMakeFiles/sparatutto.dir/main.cpp.o: In function `main':
CMakeFiles/sparatutto.dir/main.cpp.o: In function `main':
the file are:
utilita.cpp

Code: Select all

#include "utilita.h"
#include <iostream>
using namespace std;
/*

	La procedura disegna una terna sinistrorsa

*/
void drawFrame(IVideoDriver *driver)
{
	SMaterial mt; 

	driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);

	mt.AmbientColor = mt.DiffuseColor = mt.EmissiveColor = SColor(255, 255, 0, 0); 
	driver->setMaterial(mt); 
    driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(1.0f,0.0f,0.0f),SColor(255, 255, 0,0 ));

	mt.AmbientColor = mt.DiffuseColor = mt.EmissiveColor = SColor(255, 0, 255, 0); 
	driver->setMaterial(mt); 
	driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,1.0f,0.0f),SColor(255, 0, 255, 0));

	mt.AmbientColor = mt.DiffuseColor = mt.EmissiveColor = SColor(255, 0, 0, 255); 
	driver->setMaterial(mt); 
	driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,0.0f,1.0f),SColor(255, 0, 0, 255));
}

/*
*	La funzione disegna la bounding box richiesta
*	Dati in ingresso:
*					driver  : puntatore al driver
*					bbox	: riferimento bounding box da disegnare
*					mt		: riferimento al materiale da utilizzare per il tracciamento della linea
*
*	La funzione deve essere chiamata dopo aver disegnato tutta la scena in quanto modifica 
*	la matrice di trasformazione associata al video
*
*/
void drawBoundingBox(IVideoDriver* driver, aabbox3d<f32> &bbox, SMaterial &mt)
{

	driver->setMaterial(mt); 

	// poich� le coordinate della bounding box sono gi� riferite
	// al riferimento assoluto, resetto lo stack delle matrici di trasformazione
	// del driver impostandolo alla matrice unitaria
//	driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);

    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));

    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));

	driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));

    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
    driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));

}


/*
*	La funzione calcola il valore dei Frame Per Second dell'applicazione
*  	se il valore e' diverso da quello precedentemente calcolato
*	il nuovo valore viene visualizzato nel titolo della finestra del programma
*/

void calcolaFPS( s32 &lastFPS, IrrlichtDevice *device, IVideoDriver* driver , const wchar_t *text )
{
	const s32 fps = driver->getFPS();

	/// se il frame rate e' cambiato aggiorno la barre del titolo
	/// dell'applicazione con il nuovo frame rate
	if (lastFPS != fps)
	{
		core::stringw str = text;
		str += "[";
		str += driver->getName();
		str += "] FPS:";
		str += fps;
		// ottengo dal driver il numero di triangoli disegnati nell'ultimo frame
		u32 nTri=driver->getPrimitiveCountDrawn();
		str += " Tri: ";
		str += nTri;
		device->setWindowCaption(str.c_str());
		lastFPS = fps;
	}

}

/*
*	La funzione consente all'utente di selezionare il driver video 
*	da utilizzare per l'applicazione
*
*/

void selezionaDriver(video::E_DRIVER_TYPE &driverType)
{
        

        cout <<("Seleziona il driver video da utilizzare per questo esempio:\n"
                " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"
                " (d) Software Renderer\n (e) Burning's Software Renderer\n"
                " (f) NullDevice\n (altri tasti) esci\n\n");

        char i;
        std::cin >> i;

        switch(i)
        {
                case 'a': driverType = video::EDT_DIRECT3D9;break;
                case 'b': driverType = video::EDT_DIRECT3D8;break;
                case 'c': driverType = video::EDT_OPENGL;  break;
                case 'd': driverType = video::EDT_SOFTWARE; break;
                case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
                case 'f': driverType = video::EDT_NULL;    break;
                default: driverType = video::EDT_OPENGL;
        }      

}

/*
*	La procedura traccia le linee 3D che rappresentano il riferimento unitario
*	Il disegno delle linee 3D deve essere posizionato nel ciclo che rigenera la scena
*	dopo il disegno degli altri elementi della scena gestiti dallo scene manager
*	Le linee 3D non sono gestite dallo scene manager.
*	Prima di disegnare le linee devo eliminare l'eventuale matrice di trasformazione
*	impostata della precedenti operazioni di disegno
*
*	Parametri in ingresso:
*
*						driver:		puntatore al driver della scena
*						lunghezza:	lunghezza degli assi da disegnare
*/
void disegnaRiferimento(IVideoDriver* driver, float lunghezza)
{
	SMaterial mt;

	// rimuovo dallo stack delle trasformazioni la matrice preesistente ed imposto
	// la matrice identit�
	driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
	// Disegno tre segmenti giacenti lungo gli assi 
	mt.AmbientColor=mt.DiffuseColor=mt.EmissiveColor= SColor(255,255,0,0);
	driver->setMaterial(mt);
	driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(lunghezza,0.0f,0.0f),SColor(255, 255, 0,0 ));
	mt.AmbientColor=mt.DiffuseColor=mt.EmissiveColor= SColor(255,0,255,0);
	driver->setMaterial(mt);
	driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,lunghezza,0.0f),SColor(255, 0, 255, 0));
	mt.AmbientColor=mt.DiffuseColor=mt.EmissiveColor= SColor(255,0,0,255);
	driver->setMaterial(mt);
	driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,0.0f,lunghezza),SColor(255, 0, 0, 255));
}

scene::ISceneNode* aggiungiMeshConMappaturaPlanare( video::IVideoDriver* driver, scene::ISceneManager* smgr, scene::IAnimatedMesh* mesh, const irr::io::path &nomeTexture, float scalaMappatura)
{


	/// Genero sulla mesh una mappatura planare per l'applicazione
	/// della texture
	/// il primo parametro rappresenta i poligoni della mesh che hanno lo stesso materiale
	/// il secondo specifica il rapporto tra le coordinate mondo e le coordinate della texture
	/// provare a modificare il valore del secondo parametro

	smgr->getMeshManipulator()->makePlanarTextureMapping(mesh, scalaMappatura);

	scene::ISceneNode* pNode= 0;
	/// creo il nodo contente la mesh 
	pNode = smgr->addAnimatedMeshSceneNode(mesh);
	/// carico la texture da applicare al piano
	pNode->setMaterialTexture(0, driver->getTexture(nomeTexture));
	/// applico alla mesh la texture e imposto al zero il colore della componente speculare
	pNode->getMaterial(0).SpecularColor.set(0,0,0,0);


	return(pNode);
}
main.cpp

Code: Select all

#include <iostream>
using namespace std;

#include <irrlicht.h>

using namespace irr;

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

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

#include "utilita.h"
#include "receiver.h"

int main () {
    //definizione vettore keyMap per FPS
	SKeyMap keyMap[2];
	keyMap[0].Action=EKA_STRAFE_LEFT;
	keyMap[0].KeyCode=KEY_LEFT;
	keyMap[1].Action=EKA_STRAFE_RIGHT;
	keyMap[1].KeyCode=KEY_RIGHT;

	/// creo ed inizializzo la variabile che contiene il FPS dell'applicazione
	s32 lastFPS=-1;
	
	/// Creo un istanza del gestore degli eventi personalizzato
	MyEventReceiver receiver;

	/// Creo il device 
	IrrlichtDevice *device = createDevice(  video::EDT_OPENGL, dimension2d<u32>(640, 480));

	// associo al device il ricevitore degli eventi
	device->setEventReceiver(&receiver);

    if (!device)
		return 1;

	/// Imposto la caption della finestra del programma
	device->setWindowCaption(L"Sparatutto");
	device->getCursorControl()->setVisible(false);
	/** ottengo i puntatori a:
		driver video
		gestore della scena
		gestore dell'interfaccia con lutente
	*/
	
	IVideoDriver* driver = device->getVideoDriver();
    ISceneManager* smgr = device->getSceneManager();
    IGUIEnvironment* guienv = device->getGUIEnvironment();
	
	// leggo il modello della mesh dell'auto
	IAnimatedMesh *scena=smgr->getMesh("media/scena1.x");

	// aggiungo alla scena il nodo contenente
	IAnimatedMeshSceneNode *NodoScena=smgr->addAnimatedMeshSceneNode(scena);
	// disabilito l'illuminazione con luci dinamiche
	NodoScena->setMaterialFlag(video::EMF_LIGHTING,true);
	NodoScena->setPosition(vector3df(0.f,0.f,0.f));
	


	/// aggiungo una camera di tipo SceneNode Maya che guarda 
    ICameraSceneNode *camera=smgr->addCameraSceneNodeFPS(0,0,1.5,-1,keyMap,2,true,0,false);
	camera->setPosition(vector3df(0.f,250.f,-1000.f));	
	camera->setTarget(vector3df(0.f,100.f,0.f));	//punta al nodo della scena

    scene::ITriangleSelector* selector = 0;
    selector = smgr->createOctTreeTriangleSelector(NodoScena->getMesh(), NodoScena, 128);
    scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(selector, camera,vector3df(30,50,30),vector3df(0,0,0), vector3df(0,0,0));
    selector->drop(); // As soon as we're done with the selector, drop it.
	camera->addAnimator(anim);

	//CREAZIONE OGGETTO "BERSAGLIO"
	IAnimatedMesh *bersaglio=smgr->getMesh("media/bersaglio.x");
	IAnimatedMeshSceneNode *Bersaglio=smgr->addAnimatedMeshSceneNode(bersaglio);
	Bersaglio->setPosition(vector3df(0.f,0.f,23.f)); // lo posiziono
	Bersaglio->setScale(vector3df(2.f,2.f,2.f));

	IAnimatedMeshSceneNode *Bersaglio2=(IAnimatedMeshSceneNode*)Bersaglio->clone();
	Bersaglio2->setPosition(Bersaglio->getPosition()+vector3df(500.f,0.f,0.f)); // lo posiziono
	Bersaglio2->setScale(vector3df(2.f,2.f,2.f));

	//CREAZIONE OGGETTO "PROIETTILE"
	/*IAnimatedMesh *proiettile=smgr->getMesh("media/.x");

	// aggiungo alla scena il nodo contenente
	IAnimatedMeshSceneNode *Proiettile=smgr->addAnimatedMeshSceneNode(proiettile);
	// disabilito l'illuminazione con luci dinamiche
	Proiettile->setMaterialFlag(video::EMF_LIGHTING,false);
	Proiettile->setPosition(camera->getPosition());*/

	//CREO L'ANIMATORE PER IL PROIETTILE
	ISceneNodeAnimator *anim_proiettili=smgr->createFlyStraightAnimator (camera->getPosition(),(camera->getPosition()+vector3df(0.f,0.f,100.f)),1,false,false);
	smgr->setAmbientLight(SColorf(0.9,0.9,0.9));

	/// Ridisegno la scena fino a che l'utente non preme i tasti Alt + F4
	while (device->run())
    {
		/*if (receiver.isKeyPress=KEY_RETURN) {
			// elimino l'animatore 
			anim_proiettili->drop();
			// creo un animatore circolare e lo associo alla mesh
			anim_proiettili=smgr->createFlyStraightAnimator (camera->getPosition(),(camera->getPosition()+vector3df(0.f,0.f,100.f)),1,false,false);
			Proiettile->addAnimator(anim_proiettili);
		}*/

		/*
		* avvio il processo di aggiornamento della scena e scelgo il colore dello sfondo 
		* il colore e' codificato con quattro valori, il primo indica la trasparenza
		* 0 indica trasparenza completa 255 colore completamente opaco
		* seguono poi le componenti r,g,b
		*/
		driver->beginScene(true, true, SColor(255,0,0,0));	// colore di sfondo nero
		/// disegno la scena
        smgr->drawAll();
		///	disegno l'interfaccia grafica
        guienv->drawAll();
		/// segnalo di aver completato l'aggiornamento della scena
        driver->endScene();
		// Calcolo il FPS dell'applicazione e lo visualizzo nel titolo della finestra
		calcolaFPS( lastFPS, device, driver , L"Sparatutto" );
		/// aggiorno lo stato dei tasti
		receiver.tick();
    }

	/// Termine del programma - rilascio il device
	device->drop();
    return 0;
}
how I can solve my problem???? thanks a lot![/code]
serengeor
Posts: 1712
Joined: Tue Jan 13, 2009 7:34 pm
Location: Lithuania

Post by serengeor »

Its hard to say, I haven't used KDevelop, also there are no errors visible in the output, or am I blind?
Have you predeclared functions in header?
Working on game: Marrbles (Currently stopped).
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

Yeah, your error messages seem to be incomplete.
Depa Marco
Posts: 2
Joined: Sat Mar 12, 2011 9:47 am
Contact:

Post by Depa Marco »

serengeor wrote:Its hard to say, I haven't used KDevelop, also there are no errors visible in the output, or am I blind?
Have you predeclared functions in header?
yes :(
this project, with VisualStudio 2008 works fine! :(

errors are:
Image[/img]
serengeor
Posts: 1712
Joined: Tue Jan 13, 2009 7:34 pm
Location: Lithuania

Post by serengeor »

You're missing irrlicht lib, you must link it with KDevelop somehow.
Working on game: Marrbles (Currently stopped).
Sagocr
Posts: 3
Joined: Sat May 28, 2011 5:46 am

Post by Sagocr »

serengeor wrote:You're missing irrlicht lib, you must link it with KDevelop somehow.
I use de Kdevelop 4 too, and I'm the same problem. I write #pragma comment(lib, "Irrlicht.lib") in the main.cpp, but that not work.

In the cmake configurator I have:
CMAKE_CXX_FLAGS : -I/home/luysa/projects/irrlicht/include -I/usr/X11R6/include
CMAKE_EXE_LINKER_FLAGS: -L/home/luysa/projects/irrlicht/lib/Linux -L/usr/X11R6/lib64 -lIrrlicht -lGL -lXxf86vm -lXext -lX11

The irrlicht lib and include directories are ok.

But I have the linker error: "main.cpp:(.text+0x70): undefined reference to `createDevice'"

Help please - :cry:

-edit -
Solution: http://irrlicht.sourceforge.net/phpBB2/ ... t=kdevelop
Post Reply