Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Irrlicht. События. 
:(
    Опции темы
Dronchik
  Дата 28.6.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Звукач ёмаё
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 1.5.2007

Репутация: 8
Всего: 37



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





--------------------
Вместо слов делай дело, от которого ты фанатеешь. (с)

PM MAIL WWW ICQ   Вверх
THandle
Дата 29.6.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: нет
Всего: 372



Dronchik,  smile 
PM   Вверх
Dronchik
Дата 29.6.2008, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Звукач ёмаё
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 1.5.2007

Репутация: 8
Всего: 37



THandle, спасибо smile


--------------------
Вместо слов делай дело, от которого ты фанатеешь. (с)

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0767 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.