@durnevdanya

Как уменьшить код в размере C++?

Всем привет. Использую SDL 2.0 под C++. Хочу реализовать нажатие клавиш на клавиатуру.
Есть метод proccessInput, который я вызываю 60 раз в секунду. Но проблема в том, что я проверяю каждую клавишу, а это получается громоздко, как это упростить?

case SDL_KEYDOWN:
			if (proccess_Event.key.keysym.sym == SDLK_A)
				aIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_B)
				bIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_C)
				cIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_D)
				dIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_E)
				eIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_F)
				fIsDown = true;
                        ...


Вся функция
void Input::processInput()
{
	SDL_PollEvent(&proccess_Event);

	switch (proccess_Event.type)
	{
		case SDL_QUIT:
			SDL_DestroyWindow(g_window);
			SDL_Quit();
			exit(0);
			break;
		case SDL_KEYDOWN:
			if (proccess_Event.key.keysym.sym == SDLK_A)
				aIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_B)
				bIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_C)
				cIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_D)
				dIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_E)
				eIsDown = true;
			if (proccess_Event.key.keysym.sym == SDLK_F)
				fIsDown = true;
                        ...
	}
}


Благодарю за ответы

P.S
Я нашел похожий пример, но это для GLFW, A HE SDL. Тут все одним boolean-ом
inline bool isKeyDown(int keyNum)
{
  return glfwGetKey(window, keyNum) == GLFW_PRESS;
}
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
DarkContact
@DarkContact
Программист C++
Заведите массив состояний клавиш и используйте функцию SDL_GetKeyboardState (SDL Wiki).
Затем используя перечисление SDL_Scancode просто проверяете нужную клавишу.

const Uint8 *state = SDL_GetKeyboardState(NULL);
if (state[SDL_SCANCODE_RETURN]) {
    printf("<RETURN> is pressed.\n");
}
if (state[SDL_SCANCODE_RIGHT] && state[SDL_SCANCODE_UP]) {
    printf("Right and Up Keys Pressed.\n");
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
pavel9609
@pavel9609
Студент-программист
Конструкцию switch посмотрите, там поменьше кода будет.
А вообще, можно с map поиграться. Делаете словарь (клавиша, переменная которую нужно сделать true).
И при нажатии ищите map[клавиша].
Если не лезть в stl, то можно создать 2 массива, массив клавиш и массив позиций. Ищите клавишу в массиве и затем делаете bool стоящий на той же позиции true.
Ответ написан
@Fetur
В карман за ответом не полезу
Не шарю в C++, но я бы сделал проще.

$aKeyCodes = [SDLK_A => 'user_name_func_for_A', SDLK_B => 'user_func_for_B', SDLK_C=> 'user_func_for_C']; //И так далее

if (array_key_exists($keyDownPress, $aKeyCodes) !== false) { // Вернет true если огонь
  return $aKeyCodes[$keyDownPress]();
else
   return false;
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
А вам точно нужен разный обработчик клика на каждую клавишу? Какую вы задачу решаете?
Если обработчик на каждую клавишу не нужен, то как и написали выше (надо только проверить):
case SDL_KEYDOWN:
   bool characterPressed = proccess_Event.key.keysym.sym >= SDLK_A && proccess_Event.key.keysym.sym <= SDLK_Z;


Если сильно разный обработчик нужен на каждую клавишу, то мапить только.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы