Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 3 Irrlicht - Klawiszologia

Ostatnio zmodyfikowano 2010-05-19 16:10
Autor Wiadomość
lenrokskate
Temat założony przez niniejszego użytkownika
Lekcja 3 Irrlicht - Klawiszologia
» 2010-05-19 12:07:44
Ten kod z lekcji mi się nie kompiluje:
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();
    }
}

Linker:
-lIrrlicht

Błędy:

E:\Programowanie\Irr\proby\main.cpp In function `int main()':
40 E:\Programowanie\Irr\proby\main.cpp cannot declare variable `aktywne' to be of type `Klawisze'
40 E:\Programowanie\Irr\proby\main.cpp   because the following virtual functions are abstract:
218 D:\Dev-Cpp\include\IEventReceiver.h  virtual bool irr::IEventReceiver::OnEvent(irr::SEvent)
P-16978
DejaVu
» 2010-05-19 12:17:52
Zapewne używasz innej wersji irrlichta niż ta co była w kursie. Być może const'a nie powinno być w argumencie metody OnEvent. Generalnie chodzi o to, że metoda klasy Klawisze jest abstrakcyjna, czyli istnieje deklaracja, ale nie posiada implementacji. Deklaracja pochodzi z interfejsu po którym dziedziczysz i nie 'nadpisujesz' wszystkich abstrakcyjnych metod interfejsu w swojej klasie.
P-16981
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-05-19 16:10:27
dzięki, mimo że nic z tego co powiedziałeś nie zrozumiałem to poddałeś mi pomysł

Wystarczyło zamienić:
C/C++
virtual bool OnEvent( const SEvent & event )

na

C/C++
virtual bool OnEvent( SEvent event )
P-17004
« 1 »
  Strona 1 z 1