Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2013, 21: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, 10:36   #2
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

Ап теме!..
denrubun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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