Top.Mail.Ru

Qt и SDL. Подключение и использование джойстика.

Сегодня, как уже понятно из названия статьи, мы поговорим об использовании джойстиков, об их подключении и обработке приходящих с джойстика сигналов. Для чего это вообще надо? Ну вот, например, хочется нам собрать робота. А как им управлять? Вот как раз для этого можно прикрутить к компьютеру джойстик, написать небольшую программку, а затем передавать сигналы управления микроконтроллеру, установленному в нашем роботе. И это только одно применение, сразу пришедшее в голову ) Короче, штука полезная.

Итак, для работы с джойстиком мы будем использовать библиотеку 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 для каждой оси. Это и видим с помощью нашего приложения. При перемещении ручки видим как меняются значения, возвращаемые приложением:

Библиотека SDL

Вот так вот получилось кратко, но я надеюсь, информативно ) Немного разобрались с джойстиками, наверное, в будущем еще не раз к этому вернемся, а на сегодня это все, до новых встреч 🤝

Подписаться
Уведомить о
guest

9 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
zigger
zigger
9 лет назад

Хмм.. на qt 5.1.0 корректно не подключается.
main.cpp:13: error: undefined reference to `SDL_Init'

zigger
zigger
Ответ на комментарий  Aveal
9 лет назад

Буду очень ждать. Мой мозг кипит, гугл изрыт вдоль и поперек, а решения я так и не нашел)))

zigger
zigger
Ответ на комментарий  Aveal
9 лет назад

На http://www.gamedev.ru/ подсказали, что я не так делал: в .pro файле после INCLUDEPATH нужно еще саму библиотеку подключить:
LIBS += -lSDL
с ней все уже ок, чоответственно.

zigger
zigger
Ответ на комментарий  zigger
9 лет назад

*соответственно)))

Haamu
Haamu
8 лет назад

Добавил библиотеку, как описано в статье. Не помпилируется. Выдает ошибку ":-1: ошибка: cannot find -lSDL"

Бобер
Бобер
5 месяцев назад

Здравствуйте, подскажите пожалуйста, что я делаю не так ?
Библиотеку подключил
путь прописал

Qt 5.2.0

qtmain_win.cpp:-1: ошибка: undefined reference to `qMain(int, char**)'
collect2.exe:-1: ошибка: error: ld returned 1 exit status

Так прописываю путь:

INCLUDEPATH += C:/SDL2-2.0.20/x86_64-w64-mingw32/include/SDL2
LIBS += -lSDL2
9
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x