Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Irrlicht. События.


Автор: Dronchik 28.6.2008, 18:50
Irrlicht. События.

    В этом уроке мы научимся создавать события в игре. Возьмём код из второго урока и немного переработаем его. Для начала перенесём объявление переменной device и smgr сразу после подключения заголовочных файлов. Далее мы добавим переменные для нового объекта – faerie:
Код

scene::IAnimatedMeshSceneNode* node;
scene::IAnimatedMesh* faerie;

Теперь создадим класс CMyEvent, родительским классом которого будет IEventReceiver:
Код

class CMyEvent : public IEventReceiver
{
public:

В этом классе мы переопределим функцию OnEvent.:
Код

virtual bool OnEvent(const SEvent& event)
{

Сначало мы сделаем чтобы проверялось, корректно ли графическое устройство или нет:
Код

if (!device)
return false;

далее мы проверяем другие события. Первое событие будет нажатие клавиши Esc:
Код

if (event.EventType == EET_KEY_INPUT_EVENT &&     //тип события
        event.KeyInput.Key == KEY_ESCAPE &&  //нажатая клавиша т.е. её идентификатор
        event.KeyInput.PressedDown == false)          //нажата ли клавиша была или нет
    {        
            device->closeDevice();
    }

Теперь сделаем чтобы можно было делать скриншоты нашей  игры :
Код

else
if (event.EventType == EET_KEY_INPUT_EVENT &&
    event.KeyInput.Key == KEY_F9 &&
    event.KeyInput.PressedDown == false)
{
    video::IImage* image = device->getVideoDriver()->createScreenShot(); //создать снимок экрана
    if (image)
    {
        //device->getVideoDriver()->writeImageToFile(image, "screenshots/screenshot.bmp");
        //device->getVideoDriver()->writeImageToFile(image, "screenshot.png");
        //device->getVideoDriver()->writeImageToFile(image, "screenshot.tga");
        //device->getVideoDriver()->writeImageToFile(image, "screenshot.ppm");
        device->getVideoDriver()->writeImageToFile(image, "screenshots/screenshot.jpg");
                        //записать снимок в файл
        image->drop();
    }        
}

Теперь перед главным циклом программы в функции main добавим код:
Код

SMaterial mat;
mat.setTexture(0, driver->getTexture("faerie2.bmp"));
mat.Lighting = true;
node = 0;
faerie = smgr->getMesh("faerie.md2");
if (faerie)
{
    node = smgr->addAnimatedMeshSceneNode(faerie);
    node->setPosition(core::vector3df(-70,0,-30));
    node->setMD2Animation(scene::EMAT_STAND);//эту функцию можно использовать вместо setFrameLoop для md2 моделей.
    node->getMaterial(0) = mat;
}
mat.setTexture(0, 0);
mat.Lighting = false;

Про работу с материалами можно прочитать в документацию. Теперь в функцию OnEvent добавляем код:
Код

else
if (event.EventType == EET_KEY_INPUT_EVENT &&     //тип события
        event.KeyInput.Key == KEY_KEY_Q &&    //нажатая клавиша т.е. её идентификатор
        event.KeyInput.PressedDown == false)          //нажата ли клавиша была или нет
    {        
            node->setMD2Animation(scene::EMAT_RUN);
    }
    return false;

Теперь при нажатии кнопки Q наша модель изменит анимацию на бег. Теперь мы в функции main создаём переменую типа CMyEvent Event
Код

CMyEvent Event;

И добавляем в последний параметр функции createDevice адрес переменной &Event.
Далее можно приступить и к камере. Мы добавим специальные действия для камеры. Добавим код перед инициализацией камеры:
Код

SKeyMap keyMap[8];
      keyMap[0].Action = EKA_MOVE_FORWARD;
      keyMap[0].KeyCode = KEY_UP;
      keyMap[1].Action = EKA_MOVE_FORWARD;
      keyMap[1].KeyCode = KEY_KEY_W;

      keyMap[2].Action = EKA_MOVE_BACKWARD;
      keyMap[2].KeyCode = KEY_DOWN;
      keyMap[3].Action = EKA_MOVE_BACKWARD;
      keyMap[3].KeyCode = KEY_KEY_S;

      keyMap[4].Action = EKA_STRAFE_LEFT;
      keyMap[4].KeyCode = KEY_LEFT;
      keyMap[5].Action = EKA_STRAFE_LEFT;
      keyMap[5].KeyCode = KEY_KEY_A;

      keyMap[6].Action = EKA_STRAFE_RIGHT;
      keyMap[6].KeyCode = KEY_RIGHT;
      keyMap[7].Action = EKA_STRAFE_RIGHT;
      keyMap[7].KeyCode = KEY_KEY_D;

      keyMap[8].Action = EKA_JUMP_UP;
      keyMap[8].KeyCode = KEY_SPACE;     
 

И параметру jump у камеры(8 параметр у функции addCameraSceneNodeFPS) ставим 1,6f. При нажатии клавиш вверх или W будем идти вперёд и т.д. При нажатии пробела будем прыгать. Компилируем и наслаждаемся. 

Ольшевский Андрей aka Dronchik



Автор: THandle 29.6.2008, 00:38
Dronchik,  smile 

Автор: Dronchik 29.6.2008, 05:38
THandle, спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)