LINUX.ORG.RU

[SDL][Gamepad][Tutorial] SDL - управление джойстиком

 , ,


0

1

На днях понадобилось заставить программу реагировать на кнопки джойстика, пока экспериментировал пришла идея написать программку, которая обрабатывала бы сигналы геймпада. Вот исходный код и deb-пакет для Ubuntu . Если что-то коряво написано исправьте.


Ответ на: комментарий от gromes
	
if(event.jbutton. button == 7) {
	fprintf(stderr, "R1\n");
	DrawFunction(r1, screen, 295,325, 0, 0, 64, 64);
	SDL_Delay(TIMER_DELAY);
	DrawFunction(back, screen, 295,325, 295, 325, 64, 64);
}
if(event.jbutton. button == 8) {
	fprintf(stderr, "Select\n");
	DrawFunction(selectButton, screen, 235,153, 0, 0, 64, 64);
	SDL_Delay(TIMER_DELAY);
	DrawFunction(back, screen, 235,153, 235, 153, 64, 64);
}

Троллишь быдлокодом ЛОР? Раунд два.

anonymous
()
Ответ на: комментарий от damnemall

> Так ты ее и раздавал вроде.

Теперь с каждым выпуском Ubuntu становится все лучше, нет смысла создавать дистрибутивы. За ней будущее.

gromes
() автор топика
Ответ на: комментарий от gromes

> Теперь с каждым выпуском Ubuntu становится все лучше, нет смысла создавать дистрибутивы.

Да, будущее за ненужными велосипедами.

damnemall
()
Ответ на: комментарий от damnemall

> Ну, мне например кажется, что как минимум else напрашивается.

нет, 7 кнопка - r1, 8 - select, причем здесь else. Сократить не как

gromes
() автор топика
Ответ на: комментарий от damnemall

> Да, будущее за ненужными велосипедами.

А чего такого? Вроде все идет по правильному курсу

gromes
() автор топика
Ответ на: комментарий от anonymous

Конечно можно if было заменить case, но думаю так лучше

gromes
() автор топика
Ответ на: комментарий от damnemall

> Ну, мне например кажется, что как минимум else напрашивается.

У геймпада может быть нажато больше одной кнопки одновременно.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

У геймпада может быть нажато больше одной кнопки одновременно.

Вот кусок кода из моей игры, там с клавиатурой, можно нажать несколько кнопок одновременно:

Uint8* keys;
// цикл обработки событий
keys = SDL_GetKeyState(NULL);
 		
if(keys[SDLK_w]) DDU_goUp();
if(keys[SDLK_s]) DDU_goDown();
if(keys[SDLK_a]) DDU_goLeft();
if(keys[SDLK_d]) DDU_goRight();

//Завершение цикла обработки событий
gromes
() автор топика
Ответ на: комментарий от gromes

Думаю это можно сделать через SDL_JoystickEventState

gromes
() автор топика
Ответ на: комментарий от gromes
if(event.jbutton. button == 7) {
  f("R1\n", 295, 325);
}
if(event.jbutton. button == 8) {
   f("Select\n", 235, 153);
}

void f(const char * str, const int a, const int b)
{
   fprintf(stderr, str);
   DrawFunction(selectButton, screen, a, b, 0, 0, 64, 64);
   SDL_Delay(TIMER_DELAY);
   DrawFunction(back, screen, a, b, a, b, 64, 64);
}

так, например?

jtootf ★★★★★
()
Ответ на: комментарий от jtootf
struct {
     int num, num1, num2;
     char *str;
} ololo[]= {
     {1,..,..,".."},
     ..,
     {7,..,..,"R1\n"},
     {0,0,0,NULL}
};
...
for(...) {
   if(event.jbutton. button == ololo[i].num) {
          f(ololo[i].str, ololo[i].num1, ololo[i].num2);
   }
}
anonymous
()
Ответ на: комментарий от PolarFox

У геймпада может быть нажато больше одной кнопки одновременно.

Не получается у меня что-то сделать это. Вот попробовал вот так:

 
for(i=0; i<9; i++) {
  if((joypad = SDL_JoystickGetButton(joystick, i)) != 0) {
    switch(i) {
      case 0:
        fprintf(stderr, "Triangle\n");
        DrawFunction(triangle, screen, 496, 83, 0, 0, 64, 64);
        break;
      case 9:
        fprintf(stderr, "Start\n");
        DrawFunction(start, screen, 363,149, 0, 0, 64, 64);
        break;
    }
  } else {
    DrawFunction(back, screen, 496, 83, 496, 83, 64, 64);
    DrawFunction(back, screen, 363,149, 363, 149, 64, 64);						
}
gromes
() автор топика
Ответ на: комментарий от gromes

> Не получается у меня что-то сделать это. Вот попробовал вот так:

Ну дык как только мы натыкаемся на первую нажатую кнопку, то выходим из switch.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

> Ну дык как только мы натыкаемся на первую нажатую кнопку, то выходим из switch.

Так я и if использовал че толку

gromes
() автор топика

Класс! Спасибо пользователю jtootf за сокращение через функцию, а так же ptah_alexs за идею с case-ом. Вот в функция:

void JbuttonPressed (SDL_Surface *activeButton, char *actionButton, int x, int y) {
	fprintf(stderr, actionButton);
	DrawFunction(activeButton, screen, x, y, 0, 0, 64, 64);
	SDL_Delay(TIMER_DELAY);
	DrawFunction(back, screen, x, y, x, y, 64, 64);
}

А вот и кнопки:

switch(event.jbutton. button) {
	case 0:
		JbuttonPressed(triangle, "Triangle\n", 496, 83);
		break;
	case 1:
		JbuttonPressed(circle, "Circle\n", 559, 134);
		break;
	case 2:
		JbuttonPressed(cross, "Cross\n", 503, 189);
		break;
	case 3:
		JbuttonPressed(square, "Square\n", 442, 137);
		break;
	case 4:
		JbuttonPressed(l2, "L2\n", 295, 325);
		break;
	case 5:
		JbuttonPressed(r2, "R2\n", 295, 325);
		break;
	case 6:
		JbuttonPressed(l1, "L1\n", 295, 325);
		break;
	case 7:
		JbuttonPressed(r1, "R1\n", 295, 325);
		break;
	case 8:
		JbuttonPressed(selectButton, "Select\n", 235, 153);
		break;
	case 9:
		JbuttonPressed(start, "Start\n", 363, 149);
		break;
}

Код ощутимо похудел! Спасибо!

gromes
() автор топика
Ответ на: комментарий от gromes

> Код ощутимо похудел!

Он похудеет ещё сильнее, если сделать константный массив структур с параметрами для передачи функции, как тут уже советовали.

PolarFox ★★★★★
()
Ответ на: комментарий от gromes

> А ты код скачал?

Мне влом. Но чую, что код приведённый ранее не работал, из-за того, что в коде как минимум 7 раз вызывалась функции в блоке else.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

> Мне влом. Но чую, что код приведённый ранее не работал, из-за того, что в коде как минимум 7 раз вызывалась функции в блоке else.

Он работает с одной кнопкой. В SDL API я не нашел функцию подобную SDL_GetKeyState только для джойстика

gromes
() автор топика
Ответ на: комментарий от PolarFox

Нормальных примеров по SDL с джойстиком я не нашел, вот поэтому такой корявый метод

gromes
() автор топика
Ответ на: комментарий от gromes

> Он работает с одной кнопкой. В SDL API я не нашел функцию подобную SDL_GetKeyState только для джойстика

У тебя есть функция SDL_JoystickGetButton, которая возвращает тебе состояние любой кнопки джойстика в любой момент. Всё необходимое у тебя уже есть (;

PolarFox ★★★★★
()
Ответ на: комментарий от gromes

Если трудно, задачу можно свести к написанию функции аналогичной SDL_GetKeyState.

и да, помни, что одни и те же кнопки на разных джойстиках могут иметь разные номера.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Но он же одну переменную проверяет. Но пофиг, компилятор разрулит

vertexua ★★★★★
()
Ответ на: комментарий от damnemall

> > А что не так?

Ну, мне например кажется, что как минимум else напрашивается.


Не помешает, но это круче:
SDL_Delay(TIMER_DELAY);

andreyu ★★★★★
()
Ответ на: комментарий от gromes

> > Ну, мне например кажется, что как минимум else напрашивается.

нет, 7 кнопка - r1, 8 - select, причем здесь else. Сократить не как


А event.jbutton.button может принимать два значения одновременно?

andreyu ★★★★★
()

Сделал через константный массив структур. Спасибо PolarFox за совет.

Значит структура:

struct padButtonsStruct {
		const int count, x, y;
		const char *actionButton;
		SDL_Surface *activeButton;
	} padButtons[] = {
		{0, 496, 83, "Triangle\n", triangle}, {1, 559, 134, "Circle\n", circle},
		{2, 503, 189, "Cross\n", cross}, {3, 442, 137, "Square\n", square},
		{4, 295, 325, "L2\n", l2}, {5, 295, 325, "R2\n", r2},
		{6, 295, 325, "L1\n", l1}, {7, 295, 325, "R1\n", r1},
		{8, 235, 153, "Select\n", selectButton}, {9, 363, 149, "Start\n", start},
		{10, 41, 161, "Left\n", left}, {11, 80, 112, "Up\n", up},
		{20, 129, 145, "Right\n", right}, {21, 91, 197, "Down\n", down}
	};

И кнопки:

for(i=0; i<=9; i++) {
	if(event.jbutton.button == padButtons[i].count) {
		JbuttonPressed(padButtons[i].activeButton, 
		padButtons[i].actionButton, padButtons[i].x, padButtons[i].y);
	}
}

Код стал еще меньше. Сейчас перезалью, весь код.

gromes
() автор топика
Ответ на: комментарий от gromes

И еще с axis это выглядит тепер вот так:

if(event.jaxis.value<-3200) {
	for(i=0; i<=1; i++) {
		if(event.jaxis.axis == i) {
			JbuttonPressed(padButtons[i+10].activeButton,
padButtons[i+10].actionButton, padButtons[i+10].x, padButtons[i+10].y);
		}
	}
}
					
if(event.jaxis.value>3200) {
	for(i=0; i<=1; i++) {
		if(event.jaxis.axis == i) {
			JbuttonPressed(padButtons[i+12].activeButton,
padButtons[i+12].actionButton, padButtons[i+12].x, padButtons[i+12].y);
		}
	}
}
gromes
() автор топика
Ответ на: комментарий от gromes

какая разница каким? они предоставляют место - пользуйся. зато очнь удобно. у меня на bitbucket'е почти все учебные проекты.

memnek
()
21 июня 2011 г.
15 августа 2011 г.
Ответ на: комментарий от phpbb

Хорошо еще Дениска ОС Slackware не стал выдавать за свое. Хотя шутя и мог бы - с него не убудет.

anonymous
()

А где твой компьютер со встроенной клавиатурой, мышкой и прочими причиндалами? 2011-й год скоро закончится...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.