Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 18.09.2013, 20:55   #1
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию Обработка ввода. Стрелочки. OnKeyUp/Down

Доброго вечера/etc.

пишу обработку длительных нажатий.
все работает нормально для одной нажатой клавиши: нажал - двигаешься, отпустил - остановился.
И для двух тоже: клавиши либо аннулируют друг друга (если противоположные), либо складываются и движение идет по диагонали.
Проблемы начинаются при трех нажатых клавишах, причем совершенно необъяснимые:

при зажатых правой и левой стрелках, программа не реагирует на верхнюю (не двигается вверх) но абсолютно нормально реагирует на нижнюю.
тоже самое при нажатых вверх и вниз: право работает, лево - нет.

сходства этих двух случаев лишь в том, что правая и нижняя стрелки - это увеличение координаты, и они обе работают. А левая и верхняя - уменьшение, и обе не работают.

отсюда возникает вопрос: дело в ошибках в коде или это что то иное?
есть ли какой-то принцип доминирования среди стрелок?

вот код (использую библиотеку SDL):
Код:
                        case SDL_KEYDOWN:
					switch(Event.key.keysym.sym)
					{
					case SDLK_RIGHT:
						scene1.key_Pressed(scene::RIGHT);
						break;
					case SDLK_DOWN:
						scene1.key_Pressed(scene::DOWN);
						break;
					case SDLK_LEFT:
						scene1.key_Pressed(scene::LEFT);
						break;
					case SDLK_UP:
						scene1.key_Pressed(scene::UP);
						break;
					}
					break;
	
				case SDL_KEYUP:
					switch(Event.key.keysym.sym)
					{
					case SDLK_RIGHT:
						scene1.key_Released(scene::RIGHT);
						break;
					case SDLK_DOWN:
						scene1.key_Released(scene::DOWN);
						break;
					case SDLK_LEFT:
						scene1.key_Released(scene::LEFT);
						break;
					case SDLK_UP:
						scene1.key_Released(scene::UP);
						break;
					}
					break;
				}
Код:
void scene::key_Pressed(KEY key)
{
	_Keys |= key;
}

void scene::key_Released(KEY key)
{
	_Keys &= ~key;
}
после завершения обработки ввода вычисляем, как сдвинется камера
Код:
if(_Keys & LEFT)
		_Camera.x -= 10;
	if(_Keys & RIGHT)
		_Camera.x += 10;
	if(_Keys & UP)
		_Camera.y -= 10;
	if(_Keys & DOWN)
		_Camera.y += 10;
вот определения
Код:
	static enum KEY{
		RIGHT = 1,
		DOWN = 2,
		LEFT = 4,
		UP = 8
	};

	Uint8 _Keys;
denrubun вне форума Ответить с цитированием
Старый 21.09.2013, 09:36   #2
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

Ап теме!..
denrubun вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка ввода в EDIT по notification Trust_357 Win Api 13 27.12.2011 22:42
Стрелочки Alina_Honey Паскаль, Turbo Pascal, PascalABC.NET 1 25.05.2011 14:46
C++: обработка ввода данных kAND Помощь студентам 8 30.04.2009 17:33
Обработка исключений ввода в TMaskedEdit joker Общие вопросы Delphi 8 11.06.2008 14:02


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя