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
И добавляем в последний параметр функции 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
|