Klawiszologia
#include <irrlicht.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
class Klawisze
: public IEventReceiver
{
public:
virtual bool OnEvent( const SEvent & event )
{
if( event.EventType == irr::EET_KEY_INPUT_EVENT )
KeyIsDown[ event.KeyInput.Key ] = event.KeyInput.PressedDown;
return false;
}
virtual bool IsKeyDown( EKEY_CODE keyCode ) const
{
return KeyIsDown[ keyCode ];
}
Klawisze()
{
for( u32 i = 0; i < KEY_KEY_CODES_COUNT; ++i )
KeyIsDown[ i ] = false;
}
private:
bool KeyIsDown[ KEY_KEY_CODES_COUNT ];
};
int main()
{
Klawisze aktywne;
IrrlichtDevice * device = createDevice( EDT_OPENGL, core::dimension2d < s32 >( 640, 480 ),
32, false, false, false, & aktywne );
video::IVideoDriver * video = device->getVideoDriver();
scene::ISceneManager * menage = device->getSceneManager();
scene::ICameraSceneNode * kam = menage->addCameraSceneNodeFPS();
device->getCursorControl()->setVisible( false );
kam->setPosition( core::vector3df( 0, 0, - 100 ) );
IAnimatedMesh * pudlo = menage->getMesh( "media/mesh/pudlo.md2" );
IAnimatedMeshSceneNode * pud = menage->addAnimatedMeshSceneNode( pudlo );
pud->setScale( core::vector3df( - 300, - 300, - 300 ) );
pud->setPosition( core::vector3df( 0, 0, 900 ) );
pud->setMaterialFlag( video::EMF_LIGHTING, false );
pud->setMaterialTexture( 0, video->getTexture( "media/img/pudlo.png" ) );
while( device->run() )
{
if( aktywne.IsKeyDown( irr::KEY_KEY_W ) )
{
core::vector3df v = pud->getPosition();
v.Z += 0.1f;
pud->setPosition( v );
}
else if( aktywne.IsKeyDown( irr::KEY_KEY_S ) )
{
core::vector3df v = pud->getPosition();
v.Z -= 0.1f;
pud->setPosition( v );
}
else if( aktywne.IsKeyDown( irr::KEY_F2 ) )
{
core::vector3df v = pud->getScale();
v.X -= 0.01f;
v.Y -= 0.01f;
v.Z -= 0.01f;
pud->setScale( v );
}
else if( aktywne.IsKeyDown( irr::KEY_F1 ) )
{
core::vector3df v = pud->getRotation();
v.Y += 0.04f;
pud->setRotation( v );
}
else if( aktywne.IsKeyDown( irr::KEY_ESCAPE ) )
{
device->drop();
return 0;
}
video->beginScene( true, true, video::SColor( 255, 0, 10, 200 ) );
menage->drawAll();
video->endScene();
}
}
Na początku tworzymy klasę do obsługi klawiszy. O klasach przeczytasz w kursie C++. Poszczególne elementy opisałem w komentarzach.
W tej linii kodu stworzyliśmy urządzenie które musi zostać zainicjowane w linii:
IrrlichtDevice * device = createDevice( EDT_OPENGL, core::dimension2d < s32 >( 640, 480 ),
32, false, false, false, & aktywne );
if( aktywne.IsKeyDown( irr::KEY_KEY_W ) )
{
core::vector3df v = pud->getPosition();
v.Z += 0.1f;
pud->setPosition( v );
}
Tu wykorzystujemy nasze urządzenie, za pomocą polecenia:
if( aktywne.IsKeyDown( irr::KEY_KEY_W ) )
{
core::vector3df v = pud->getPosition();
v.Z += 0.1f;
pud->setPosition( v );
}
Sprawdzamy czy klawisz "w" został wciśnięty, jeżeli tak, to zmieniamy pozycje naszego obiektu w tym wypadku "pud" czyli naszego pudełka, tu wybrany wektor to
v.Z.
Pamiętajmy by nazwy klawiszy pisać dużymi literami, czyli
KEY_KEY_W,a nie
KEY_KEY_w.
v.Z - wektor Z, v.X - wektor X, v.Y - wektor Y
Wektor Z określa kierunek "przód/tył"
Wektor X określa kierunek "lewo/prawo"
Wektor Y określa kierunek "góra/dół"
Cała "klawiszologia" znajduje się na tej stronie
Irrlichta.
Materiały do pobrania
Pliki potrzebne do uruchomienia tej lekcji można pobrać
z naszego repozytorium.
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.