Problem controlling FPS camera

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
The-Dragon
Posts: 2
Joined: Sat Jun 26, 2004 9:53 am

Problem controlling FPS camera

Post by The-Dragon »

I have been using the tutorials and mix them a bit. Now i've got a problem:
when i add the eventreceiver its impossible to control the camera using the keyboard. Ive been looking at it and cant figure out what exactly is causing the problem.

Code: Select all

#include <irrlicht.h> 

using namespace irr; 
using namespace core; 
using namespace scene; 
using namespace video; 
using namespace io; 
using namespace gui;
    
IrrlichtDevice* device = 0; 

class MyEventReceiver : public IEventReceiver
{
public:	
    virtual bool OnEvent(SEvent event)	
    {
    }
}; 
 


int main()
{
    MyEventReceiver receiver;

	device =
		createDevice(video::EDT_OPENGL,
       core::dimension2d<s32>(800, 600), 32, false,false,&receiver);

	video::IVideoDriver* driver = device->getVideoDriver();
	scene::ISceneManager* smgr = device->getSceneManager();

	
	device->getFileSystem()->addZipFileArchive      ("maps/map-20kdm2.pk3");

	
	scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("20kdm2.bsp");
	scene::ISceneNode* q3node = 0;
	
	if (q3levelmesh)
		q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));

    scene::ITriangleSelector* selector = 0;
	
	if (q3node)
	{		
		q3node->setPosition(core::vector3df(-1370,-130,-1400));

		selector = smgr->createOctTreeTriangleSelector(
            q3levelmesh->getMesh(0), q3node, 128);
		q3node->setTriangleSelector(selector);
		selector->drop();
	}
	
	scene::ICameraSceneNode* camera = 			camera = smgr->addCameraSceneNodeFPS(0,100.0f,300.0f);
	camera->setPosition(core::vector3df(0,100,0));

	scene::ISceneNodeAnimator* anim =    smgr->createCollisionResponseAnimator(
		selector, camera, core::vector3df(30,50,30),
		core::vector3df(0,-100,0), 100.0f, 
		core::vector3df(0,50,0));
	camera->addAnimator(anim);
	anim->drop();
 

	// disable mouse cursor

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

	scene::ISceneNode* selectedSceneNode = 0;
	scene::ISceneNode* lastSelectedSceneNode = 0;

	
	int lastFPS = -1;

	while(device->run())
	{
		driver->beginScene(true, true, 0);

		smgr->drawAll();
		core::line3d<f32> line;
		line.start = camera->getPosition();
		line.end = line.start +
         (camera->getTarget() - line.start).normalize() * 1000.0f;

		core::vector3df intersection;
		core::triangle3df tri;

		if (smgr->getSceneCollisionManager()->getCollisionPoint(
			line, selector, intersection, tri))
		{
				
			driver->setTransform(video::ETS_WORLD, core::matrix4());
//			driver->setMaterial(material);
			//driver->draw3DTriangle(tri, video::SColor(0,255,0,0));
		}
 
		selectedSceneNode = smgr->getSceneCollisionManager()->
          getSceneNodeFromCameraBB(camera);

		if (lastSelectedSceneNode)
			lastSelectedSceneNode->setMaterialFlag(
                video::EMF_LIGHTING, true);

		if (selectedSceneNode == q3node)
			selectedSceneNode = 0;

		if (selectedSceneNode)
			selectedSceneNode->setMaterialFlag(
               video::EMF_LIGHTING, false);

		lastSelectedSceneNode = selectedSceneNode;
 
		driver->endScene();

		int fps = driver->getFPS();

		if (lastFPS != fps)
		{
			wchar_t tmp[1024];
			swprintf(tmp, 1024,
              L"Irrlicht engine (fps:%d) Triangles:%d", 
				fps, driver->getPrimitiveCountDrawn());

			device->setWindowCaption(tmp);
			lastFPS = fps;
		}
	}

	device->drop();
	
	return 0;
}
Acki

Post by Acki »

As I remember, the event receiver has to return false if nothing was done in it !!!
If you return true (or nothing) Irrlicht will do nothing... ;)


CU, Acki
The-Dragon
Posts: 2
Joined: Sat Jun 26, 2004 9:53 am

Post by The-Dragon »

Acki wrote:As I remember, the event receiver has to return false if nothing was done in it !!!
If you return true (or nothing) Irrlicht will do nothing... ;)


CU, Acki
Yes thnx how could i have forgotten. I was stripping the code to see what the problem was and so i probably also stripped the return code :shock:.
Post Reply