Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Mariusz Klepaczko
Biblioteki C++

Klawiszologia

[lekcja] Rozdział 4. Obsługa klawiatury, sterowanie obiektem na scenie.

Klawiszologia

C/C++
#include <irrlicht.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;

// Tworzymy klase
class Klawisze
    : public IEventReceiver
{
public:
    virtual bool OnEvent( const SEvent & event )
    {
        //  Zapamiętuje położenie klawisza (klucza) (góra/dół)
        if( event.EventType == irr::EET_KEY_INPUT_EVENT )
             KeyIsDown[ event.KeyInput.Key ] = event.KeyInput.PressedDown;
       
        return false;
    }
    // Sprawdza czy klawisz (klucz) został użyty
    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:
    // Używamy by zgromadzić aktualny stan każdego klawisza (klucza)
    bool KeyIsDown[ KEY_KEY_CODES_COUNT ];
};


int main()

{
    // Tworzymy urządzenie
    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 ) );
   
    //Wczytywanie modelu
    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() )
   
    {
       
        //Poruszanie do przodu i do tyłu
        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 );
        }
        //Powiększanie obiektu
        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 );
        }
        //Obracanie obiektu
        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.

C/C++
Klawisze aktywne;

W tej linii kodu stworzyliśmy urządzenie które musi zostać zainicjowane w linii:

C/C++
IrrlichtDevice * device = createDevice( EDT_OPENGL, core::dimension2d < s32 >( 640, 480 ),
32, false, false, false, & aktywne );

C/C++
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:

C/C++
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.
Poprzedni dokument Następny dokument
Wczytywanie modelu Dodawanie sceny