Сегодня, как уже понятно из названия статьи, мы поговорим об использовании джойстиков, об их подключении и обработке приходящих с джойстика сигналов. Для чего это вообще надо? Ну вот, например, хочется нам собрать робота. А как им управлять? Вот как раз для этого можно прикрутить к компьютеру джойстик, написать небольшую программку, а затем передавать сигналы управления микроконтроллеру, установленному в нашем роботе. И это только одно применение, сразу пришедшее в голову ) Короче, штука полезная.
Итак, для работы с джойстиком мы будем использовать библиотеку SDL (Simple DirectMedia Layer). Помимо доступа к джойстику эта библиотека может помочь реализовать работу с графическими подсистемами и звуковыми устройствами. Но мы пока остановимся на подключении джойстика...
В качестве среды разработки мы, как и обычно, будем использовать Qt Creator. И теперь, для начала, нам нужно скачать библиотеку SDL. Заходим вот сюда и в самом низу находим раздел Development Libraries. Нас интересует Win32 и Mingw32. Качаем!
Распаковываем куда-нибудь скачанный архив и можно переходить к написанию программы. НО! Для начала нужно зайти в архиве с библиотекой SDL в папку bin и скопировать оттуда файл SDL.dll. А поместить этот файл нужно в папку куда установлен Qt Creator, вот по такому пути:
QtSDK/Desktop/Qt/4.8.1/mingw/bin
Теперь создаем новый пустой проект. Мы уже почти готовы переходить к написанию программы, но еще надо немного подредактировать .pro файл созданного проекта, а именно, добавить строки:
INCLUDEPATH += C:/SDL-1.2.15/SDL-1.2.15/include/SDL LIBS += -lSDL
Все приготовления завершены, давайте создадим небольшой пример, чтобы убедиться, что все работает как надо. Подключим джойстик, у меня один из самых банальнейших и обычных, существенной разницы тут нет.
Сделаем так, чтобы приложение считывало данные о текущем положении ручки джойстика, ну и наглядно выводило эти данные.
// Подключаем SDL #include <SDL.h> #include <QDebug> int main(int argc, char *argv[]) { // Переменная для нашего джойстика SDL_Joystick *joy; SDL_Event event; // Инициализация SDL для использования джойстика SDL_Init(SDL_INIT_JOYSTICK); // Включаем SDL_JoystickEventState(SDL_ENABLE); // Открываем joy = SDL_JoystickOpen(0); while(1) { // Примитивнейшая задержка, чисто для теста, никогда так не делайте в боевых проектах ) unsigned int j = 0; for (j = 0; j < 60000; j++); SDL_PollEvent(&event); // Получаем значения, соответствующие смещению джойстика: // по оси Х int xAxis = SDL_JoystickGetAxis(joy, 0); // по оси Y int yAxis = SDL_JoystickGetAxis(joy, 1); // Выводим qDebug() << xAxis << yAxis; } }
В зависимости от положения ручки джойстика возвращаемые значения могут изменяться от -32768 до 32767 для каждой оси. Это и видим с помощью нашего приложения. При перемещении ручки видим как меняются значения, возвращаемые приложением:
Вот так вот получилось кратко, но я надеюсь, информативно ) Немного разобрались с джойстиками, наверное, в будущем еще не раз к этому вернемся, а на сегодня это все, до новых встреч 🤝
Хмм.. на qt 5.1.0 корректно не подключается.
main.cpp:13: error: undefined reference to `SDL_Init'
Хм, попробую завтра
Буду очень ждать. Мой мозг кипит, гугл изрыт вдоль и поперек, а решения я так и не нашел)))
На http://www.gamedev.ru/ подсказали, что я не так делал: в .pro файле после INCLUDEPATH нужно еще саму библиотеку подключить:
LIBS += -lSDL
с ней все уже ок, чоответственно.
*соответственно)))
Добавил библиотеку, как описано в статье. Не помпилируется. Выдает ошибку ":-1: ошибка: cannot find -lSDL"
Попробуй файлы libSDL.dll.a, libSDL.la, libSDLmain.a из папки с SDL ( там они в папке lib) скопировать в QT/Desktop/Qt/4.8.1/mingw/lib
Здравствуйте, подскажите пожалуйста, что я делаю не так ?
Библиотеку подключил
путь прописал
Qt 5.2.0
qtmain_win.cpp:-1: ошибка: undefined reference to `qMain(int, char**)'
collect2.exe:-1: ошибка: error: ld returned 1 exit status
Так прописываю путь:
Добрый вечер! Можете проект выслать?