This question is more a programming question regarding virtuals and inheriting from the ITimer class. Basically I already know that I can use the device to get the Itimer (e.g. device->getTimer()) but what I would like to understand is how to inherit from the ITimer class directly like this.
Code: Select all
class timing: virtual public ITimer
{
private:
public:
timing(){}
~timing(){}
virtual ITimer* getTimer() = 0;
};
Code: Select all
C:\irrlicht_timer.cpp||In function 'int main()':|
C:\irrlicht_timer.cpp|92|error: cannot declare variable 'time' to be of abstract type 'timing'|
C:\irrlicht_timer.cpp|74|note: because the following virtual functions are pure within 'timing':|
C:\irrlicht-1.7.2\include\ITimer.h|26|note: virtual irr::u32 irr::ITimer::getRealTime() const|
C:\irrlicht-1.7.2\include\ITimer.h|33|note: virtual irr::u32 irr::ITimer::getTime() const|
C:\irrlicht-1.7.2\include\ITimer.h|36|note: virtual void irr::ITimer::setTime(irr::u32)|
C:\irrlicht-1.7.2\include\ITimer.h|42|note: virtual void irr::ITimer::stop()|
C:\irrlicht-1.7.2\include\ITimer.h|48|note: virtual void irr::ITimer::start()|
C:\irrlicht-1.7.2\include\ITimer.h|53|note: virtual void irr::ITimer::setSpeed(irr::f32)|
C:\irrlicht-1.7.2\include\ITimer.h|58|note: virtual irr::f32 irr::ITimer::getSpeed() const|
C:\irrlicht-1.7.2\include\ITimer.h|61|note: virtual bool irr::ITimer::isStopped() const|
C:\irrlicht-1.7.2\include\ITimer.h|67|note: virtual void irr::ITimer::tick()|
C:\irrlicht_timer.cpp|81|note: virtual irr::ITimer* timing::getTimer()|
Here's the code
Code: Select all
#include <irrlicht.h>
#include <iostream>
using namespace irr;
class MyEventReceiver : public IEventReceiver
{
public:
struct SMouseState
{
core::position2di Position;
bool LeftButtonDown;
SMouseState() : LeftButtonDown(false) { }
} MouseState;
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == irr::EET_KEY_INPUT_EVENT)
KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
if(event.EventType == EET_MOUSE_INPUT_EVENT)
{
switch(event.MouseInput.Event)
{
case EMIE_LMOUSE_PRESSED_DOWN:
MouseState.LeftButtonDown = true;
break;
case EMIE_LMOUSE_LEFT_UP:
MouseState.LeftButtonDown = false;
break;
case EMIE_MOUSE_MOVED:
MouseState.Position.X = event.MouseInput.X;
MouseState.Position.Y = event.MouseInput.Y;
break;
default:
break;
}
}
return false;
}
// This is used to check whether a key is being held down
virtual bool IsKeyDown(EKEY_CODE keyCode) const
{
return KeyIsDown[keyCode];
}
const SMouseState & GetMouseState(void) const
{
return MouseState;
}
MyEventReceiver()
{
for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i)
KeyIsDown[i] = false;
}
private:
// We use this array to store the current state of each key
bool KeyIsDown[KEY_KEY_CODES_COUNT];
};
class timing: virtual public ITimer
{
private:
public:
timing(){}
~timing(){}
virtual ITimer* getTimer() = 0;
};
MyEventReceiver receiver;
IrrlichtDevice* device = 0;
const int SCRX = 640;
const int SCRY = 480;
int main()
{
timing time;
device = createDevice( irr::video::EDT_OPENGL, core::dimension2d<u32>( SCRX, SCRY), 16, false, false, false, &receiver);
if (device == 0)
return 1;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::ICursorControl * cursor = device->getCursorControl();
driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
cursor->setVisible(false);
int lastFPS = -1;
while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, video::SColor( 255, 0, 0, 0));
smgr->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"Irrlicht Text Node [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();
return 0;
}