-
- As always, I include the header files, use the irr namespace, and tell
- the linker to link with the .lib file.
-
-
- #include <stdio.h> #include <wchar.h> #include <irrlicht.h>
- using namespace irr;
- #pragma comment(lib, "Irrlicht.lib") |
-
-
- In this tutorial, one of our goals is to move a scene node using some
- keys on the keyboard. We store a pointer to the scene node we want to
- move with the keys here.
- The other pointer is a pointer to the Irrlicht Device, which we need
- int the EventReceiver to manipulate the scene node and to get the active
- camera.
-
-
- scene::ISceneNode* node = 0; IrrlichtDevice* device = 0; |
-
-
- To get events like mouse and keyboard input, or GUI events like "the
- OK button has been clicked", we need an object wich is derived
- from the IEventReceiver object. There is only one method to override:
- OnEvent. This method will be called by the engine when an event happened.
- We will use this input to move the scene node with the keys W and S.
-
-
- class MyEventReceiver : public IEventReceiver { public: virtual bool OnEvent(const SEvent& event) { |
-
-
- If the key 'W' or 'S' was left up, we get the position of the scene
- node, and modify the Y coordinate a little bit. So if you press 'W',
- the node moves up, and if you press 'S' it moves down.
-
-
- if (node != 0 && event.EventType == irr::EET_KEY_INPUT_EVENT&& !event.KeyInput.PressedDown) { switch(event.KeyInput.Key) { case KEY_KEY_W: case KEY_KEY_S: { core::vector3df v = node->getPosition(); v.Y += event.KeyInput.Key == KEY_KEY_W ? 2.0f : -2.0f; node->setPosition(v); } return true; } } return false; } }; |
-
-
-
-
- The event receiver for moving a scene node is ready. So lets just create
- an Irrlicht Device and the scene node we want to move. We also create
- some other additional scene nodes, to show that there are also some different
- possibilities to move and animate scene nodes.
-
-
- int main() { MyEventReceiver receiver;
-
- device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480),
- 16, false, false, false, &receiver);
- video::IVideoDriver* driver = device->getVideoDriver();
- scene::ISceneManager* smgr = device->getSceneManager();
- |
-
-
- Create the node for moving it with the 'W' and 'S' key. We create a
- sphere node, which is a built in geometric primitive scene node.
- We place the node at (0,0,30) and assign a texture to it to let it look
- a little bit more interesting.
-
-
- node = smgr->addSphereSceneNode();
-node->setPosition(core::vector3df(0,0,30));
-node->setMaterialFlag(video::EMF_LIGHTING, false);
-node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp")); |
-
-
- Now we create another node, moving using a scene node animator. Scene
- node animators modify scene nodes and can be attached to any scene node
- like
- mesh scene nodes, billboards, lights and even camera scene nodes. Scene
- node animators are not only able to modify the position of a scene node,
- they can
- also animate the textures of an object for example. We create a test scene
- node again an attach a 'fly circle' scene node to it, letting this node
- fly around our first test scene node.
-
-
- scene::ISceneNode* n = smgr->addCubeSceneNode();
-n->setMaterialTexture(0, driver->getTexture("../../media/t351sml.jpg"));
-n->setMaterialFlag(video::EMF_LIGHTING, false);
-scene::ISceneNodeAnimator* anim =
- smgr->createFlyCircleAnimator(core::vector3df(0,0,30), 20.0f);
-n->addAnimator(anim);
-anim->drop(); |
-
-
- The last scene node we add to show possibilities of scene node animators
- is a md2 model, which uses a 'fly straight' animator to run between to
- points.
-
-
- scene::IAnimatedMeshSceneNode* anms = smgr->addAnimatedMeshSceneNode( smgr->getMesh("../../media/sydney.md2"));
-
-if (n) { anim = smgr->createFlyStraightAnimator(core::vector3df(100,0,60), core::vector3df(-100,0,60), 10000, true); anms->addAnimator(anim); anim->drop();
- |
-
-
- To make to model look right we set the frames between which
- the animation should loop, rotate the model around 180 degrees, and adjust
- the animation speed and the texture.
- To set the right animation (frames and speed), we would also be able to
- just call "anms->setMD2Animation(scene::EMAT_RUN)" for the
- 'run' animation instead of "setFrameLoop" and "setAnimationSpeed",
- but this only works with MD2 animations, and so you know how to start
- other animations.
-
-
- anms->setMaterialFlag(video::EMF_LIGHTING, false); anms->setFrameLoop(320, 360);
- anms->setAnimationSpeed(30); anms->setRotation(core::vector3df(0,180.0f,0)); anms->setMaterialTexture(0, driver->getTexture("../../media/sydney.bmp")); }
|
-
-
- To be able to look at and move around in this scene, we create a first
- person shooter style camera and make the mouse cursor invisible.
-
-
- smgr->addCameraSceneNodeFPS(0, 100.0f, 100.0f); device->getCursorControl()->setVisible(false); |
-
-
- We have done everything, so lets draw it. We also write the current frames
- per second and the name of the driver to the caption of the window.
-
-
- int lastFPS = -1;
- while(device->run())
-{
- driver->beginScene(true, true, video::SColor(255,90,90,156));
- smgr->drawAll();
- driver->endScene();
- int fps = driver->getFPS();
- if (lastFPS != fps)
- {
- wchar_t tmp[1024];
- swprintf(tmp, 1024, L"Movement Example - Irrlicht Engine (%ls)(fps:%d)", driver->getName(), fps);
- device->setWindowCaption(tmp);
- lastFPS = fps;
- }
-}
-
-device->drop(); return 0; } |
-
-
- That's it. Compile and play around with the program.
- |
-
-